Arduino Polska Forum

Pełna wersja: Problem z programem
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Cześć!
Mam problem napisałem kod (kod niżej), który ma obsługiwać keypad 4x4 narazie napisałem kod do dwóch górnych wierszy. Po wgraniu kodu po nackiskaniu przycisków z pierwszego wiersza wszystko jest ok, a gdy klikne drugi wiersz np. pięć to wyświetla się 52 albo 25.

Kod:
int a;
int b;
int c;
int d;
int e;
char ser1;
char ser2;
char ser3;
char ser4;
void setup() {
 // put your setup code here, to run once:
 pinMode(11, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(5, INPUT_PULLUP);
 pinMode(4, INPUT_PULLUP);
 pinMode(3, INPUT_PULLUP);
 pinMode(2, INPUT_PULLUP);

 digitalWrite(11, HIGH);
 digitalWrite(10, HIGH);
 digitalWrite(9, HIGH);
 digitalWrite(8, HIGH);

 Serial.begin(9600);
 b = 1;
 e = 1;
}

void loop() {


digitalWrite(11, LOW);
   d = 0;
if (d == 0){
digitalWrite(11, LOW);
   ser1 = digitalRead(5);
   ser2 = digitalRead(4);
   ser3 = digitalRead(3);
   ser4 = digitalRead(2);

   if (ser1 == 0 && d == 0 ) {
     a = 1;
     Serial.print("1");
     delay(100);
   }

   else if (ser2 == 0 && d == 0 ) {
     a = 2;
     Serial.print("2");
     delay(100);
   }

   else if (ser3 == 0 && d == 0 ) {
     a = 3;
     Serial.print("3");
     delay(100);
   }

   else if (ser4 == 0 && d == 0 ) {
     a = "a";
     Serial.print("a");
     delay(100);
   }
   d =1;

}
   
 
    if(d == 1)
{
digitalWrite(11, HIGH);  
   digitalWrite(10, LOW);

   ser1 = digitalRead(5);
   ser2 = digitalRead(4);
   ser3 = digitalRead(3);
   ser4 = digitalRead(2);
   if (ser1 == 0  ) {
     a = 4;
     Serial.print("4");
     delay(100);
   }
   else if (ser2 == 0) {
     a = 5;
     Serial.print("5");
     delay(100);
   }
   else if (ser3 == 0) {
     a = 6;
     Serial.print("6");
     delay(100);
   }
   else if (ser4 == 0) {
     a = "b";
     Serial.print("b");
     delay(100);
   }
  d = 0;
}





}
Ten kod się nie kompiluje, wyskaują dwa błędy.

Kod:
a = "a";  //Ten zapis to błąd! Zmienną a określiłeś jako: int, a chcesz załadować String'a!

Poza tym dobrze abyś umieścił jakieś komentarze w programie aby np. było wiadomo co i gdzie podłączasz.
Program bez komentarzy ciężko się analizuje...
Jak za jakiś czas do niego wrócisz to też nie będziesz pamiętał co i jak robiłeś.

Na przykład można tak...

Kod:
// ----------------------------------------
//               Keypad 4x4
// ----------------------------------------

// Zdefiniowanie zmennych.
// -----------------------
int a; // Zmienna określająca...
int b; // ...
int c;
int d;
int e;
char ser1; // Zmienna określająca...
char ser2; // ...
char ser3;
char ser4;

// Ustawienia programu.
// --------------------
void setup()
{
 pinMode(11, OUTPUT); // Do pinu wyjścia podłączone...
 pinMode(10, OUTPUT); // ...
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(5, INPUT_PULLUP); // Do pinu wejścia podłączone...
 pinMode(4, INPUT_PULLUP); // ...
 pinMode(3, INPUT_PULLUP);
 pinMode(2, INPUT_PULLUP);

 digitalWrite(11, HIGH); // Ustawienie stanu wysokiego na...
 digitalWrite(10, HIGH); // ...
 digitalWrite(9, HIGH);
 digitalWrite(8, HIGH); // i tak dalej...

 Serial.begin(9600);
 b = 1;
 e = 1;
}

// Pętla główna programu.
// ----------------------
void loop()
{
 digitalWrite(11, LOW);
 d = 0;
 
 if (d == 0)
 {
   digitalWrite(11, LOW);
   ser1 = digitalRead(5);
   ser2 = digitalRead(4);
   ser3 = digitalRead(3);
   ser4 = digitalRead(2);

   if (ser1 == 0 && d == 0 )
   {
     a = 1;
     Serial.print("1");
     delay(100);
   }

   else if (ser2 == 0 && d == 0 )
   {
     a = 2;
     Serial.print("2");
     delay(100);
   }

   else if (ser3 == 0 && d == 0 )
   {
     a = 3;
     Serial.print("3");
     delay(100);
   }

   else if (ser4 == 0 && d == 0 )
   {
     // a = "a"; Ten zapis to błąd! Zmienną a określiłeś jako: int, a chcesz załadować String'a!
     Serial.print("a");
     delay(100);
   }
   d =1;
 }

 if(d == 1)
 {
   digitalWrite(11, HIGH);  
   digitalWrite(10, LOW);

   ser1 = digitalRead(5);
   ser2 = digitalRead(4);
   ser3 = digitalRead(3);
   ser4 = digitalRead(2);
   
   if (ser1 == 0)
   {
     a = 4;
     Serial.print("4");
     delay(100);
   }
   
   else if (ser2 == 0)
   {
     a = 5;
     Serial.print("5");
     delay(100);
   }
   
   else if (ser3 == 0)
   {
     a = 6;
     Serial.print("6");
     delay(100);
   }
   
   else if (ser4 == 0)
   {
     // a = "b"; Ten zapis to błąd! Zmienną a określiłeś jako: int, a chcesz załadować String'a!
     Serial.print("b");
     delay(100);
   }
   d = 0;
 }
}
(20-11-2017, 22:01)ANT napisał(a): [ -> ]Ten kod się nie kompiluje, wyskaują dwa błędy.

Kod:
a = "a";  //Ten zapis to błąd! Zmienną a określiłeś jako: int, a chcesz załadować String'a!

Poza tym dobrze abyś umieścił jakieś komentarze w programie aby np. było wiadomo co i gdzie podłączasz.
Program bez komentarzy ciężko się analizuje...
Jak za jakiś czas do niego wrócisz to też nie będziesz pamiętał co i jak robiłeś.

Na przykład można tak...

Kod:
// ----------------------------------------
//               Keypad 4x4
// ----------------------------------------

// Zdefiniowanie zmennych.
// -----------------------
int a; // Zmienna określająca...
int b; // ...
int c;
int d;
int e;
char ser1; // Zmienna określająca...
char ser2; // ...
char ser3;
char ser4;

// Ustawienia programu.
// --------------------
void setup()
{
 pinMode(11, OUTPUT); // Do pinu wyjścia podłączone...
 pinMode(10, OUTPUT); // ...
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(5, INPUT_PULLUP); // Do pinu wejścia podłączone...
 pinMode(4, INPUT_PULLUP); // ...
 pinMode(3, INPUT_PULLUP);
 pinMode(2, INPUT_PULLUP);

 digitalWrite(11, HIGH); // Ustawienie stanu wysokiego na...
 digitalWrite(10, HIGH); // ...
 digitalWrite(9, HIGH);
 digitalWrite(8, HIGH); // i tak dalej...

 Serial.begin(9600);
 b = 1;
 e = 1;
}

// Pętla główna programu.
// ----------------------
void loop()
{
 digitalWrite(11, LOW);
 d = 0;
 
 if (d == 0)
 {
   digitalWrite(11, LOW);
   ser1 = digitalRead(5);
   ser2 = digitalRead(4);
   ser3 = digitalRead(3);
   ser4 = digitalRead(2);

   if (ser1 == 0 && d == 0 )
   {
     a = 1;
     Serial.print("1");
     delay(100);
   }

   else if (ser2 == 0 && d == 0 )
   {
     a = 2;
     Serial.print("2");
     delay(100);
   }

   else if (ser3 == 0 && d == 0 )
   {
     a = 3;
     Serial.print("3");
     delay(100);
   }

   else if (ser4 == 0 && d == 0 )
   {
     // a = "a"; Ten zapis to błąd! Zmienną a określiłeś jako: int, a chcesz załadować String'a!
     Serial.print("a");
     delay(100);
   }
   d =1;
 }

 if(d == 1)
 {
   digitalWrite(11, HIGH);  
   digitalWrite(10, LOW);

   ser1 = digitalRead(5);
   ser2 = digitalRead(4);
   ser3 = digitalRead(3);
   ser4 = digitalRead(2);
   
   if (ser1 == 0)
   {
     a = 4;
     Serial.print("4");
     delay(100);
   }
   
   else if (ser2 == 0)
   {
     a = 5;
     Serial.print("5");
     delay(100);
   }
   
   else if (ser3 == 0)
   {
     a = 6;
     Serial.print("6");
     delay(100);
   }
   
   else if (ser4 == 0)
   {
     // a = "b"; Ten zapis to błąd! Zmienną a określiłeś jako: int, a chcesz załadować String'a!
     Serial.print("b");
     delay(100);
   }
   d = 0;
 }
}

To poprawie ale chodzi o to że przy drugiej linijce wyświetla się nacisnieta liczba i ta nad tą liczba np. klikam 5 a wyświetla się 52
Najpierw przed pętlą if która sprawdza zmienną d, ustawiasz ją na wartość równą 0.
Więc, petla zawsze się wykona...

Kod:
...
  d = 0;
  
  if (d == 0)
  {
    ...

Potem kończąc tą pętlę ustawiasz zmienną d na wartość 1,
i znowu sprawdzasz czy jest na jeden ustawiona...

Kod:
....
      delay(100);
    }
    d =1;
  }

  if(d == 1)
  {
   ...

W takim przypadku pętle zawsze się wykonają...
(20-11-2017, 22:59)ANT napisał(a): [ -> ]Najpierw przed pętlą if która sprawdza zmienną d, ustawiasz ją na wartość równą 0.
Więc, petla zawsze się wykona...

Kod:
 ...
 d = 0;
 
 if (d == 0)
 {
   ...

Potem kończąc tą pętlę ustawiasz zmienną d na wartość 1,
i znowu sprawdzasz czy jest na jeden ustawiona...

Kod:
     ....
     delay(100);
   }
   d =1;
 }

 if(d == 1)
 {
  ...

W takim przypadku pętle zawsze się wykonają...

Właśnie chce żeby się powtarzały. Zrobiłem tak żeby sprawdzanie każdej linijki keypada było oddzielone
W pierwszej pętli masz tylko tak:

Kod:
...
 if(d == 0)
 { 
   digitalWrite(11, LOW);
   ...

natomiast w drugiej pętli jest tak:

Kod:
...
 if(d == 1)
 {
   digitalWrite(11, HIGH);  
   digitalWrite(10, LOW);
   ...

Gdy program wróci do pierwszej pętli to pin 10 dalej będziesz miał ustawiony na LOW...
(21-11-2017, 00:19)ANT napisał(a): [ -> ]W pierwszej pętli masz tylko tak:

Kod:
...
 if(d == 0)
 { 
   digitalWrite(11, LOW);
  ...

natomiast w drugiej pętli jest tak:

Kod:
...
 if(d == 1)
 {
   digitalWrite(11, HIGH);  
   digitalWrite(10, LOW);
  ...

Gdy program wróci do pierwszej pętli to pin 10 dalej będziesz miał ustawiony na LOW...

Dzięki, to pomogło. Taki mały błąd, a dużo zmienia.