Problem z programem - Użytkownik Arduino - 20-11-2017
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;
}
}
RE: Problem z programem - ANT - 20-11-2017
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;
}
}
RE: Problem z programem - Użytkownik Arduino - 20-11-2017
(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
RE: Problem z programem - ANT - 20-11-2017
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ą...
RE: Problem z programem - Użytkownik Arduino - 20-11-2017
(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
RE: Problem z programem - ANT - 21-11-2017
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...
RE: Problem z programem - Użytkownik Arduino - 21-11-2017
(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.
|