• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 1
  • 1
  • 2
  • 3
  • 4
  • 5
próba budowy systemu alarmowego
#11
Wyświetla bo ciągle ustawiasz kursor w tym samym miejscu poleceniem lcd.setCursor(0, 1); Może trzeba wprowadzić dodatkowy parametr do funkcji, zmieniający ustawienie kursora w zależności od potrzeb. Można też usunąć ten wiersz i ustawiać kursor przed wywołaniem funkcji w miejscu jej wywoływania.
 
Odpowiedź
#12
(14-02-2020, 08:48)Agregacik napisał(a): Wyświetla bo ciągle ustawiasz kursor w tym samym miejscu poleceniem lcd.setCursor(0, 1); Może trzeba wprowadzić dodatkowy parametr do funkcji, zmieniający ustawienie kursora w zależności od potrzeb. Można też usunąć ten wiersz i ustawiać kursor przed wywołaniem funkcji w miejscu jej wywoływania.

Usunięcie wiersza i ustawienia kursora przed wywołaniem funkcji nie zdaje egzaminu. 
Zrobię coś takiego, że ustawie lcd.setCursor(0, x); Gdzie x będzie zmienną licząca przyciśnięcia klawiszy. Zobaczę co z tego wyjdzie.
 
Odpowiedź
#13
Coś nie działa mi ta funkcja, liczbę naciśnięć klawiatury zlicza poprawnie, ale wartość ta nie jest przypisywana do lcd.setCursor(0, x);

Dlaczego tak, się dzieje? Szczerze przyznam się, że nie mam pojęcia. 


Kod:
#include <Keypad.h>
#include <Password.h>
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD

LiquidCrystal_I2C lcd(0x27, 16, 2);

String newPasswordString; //hold the new password
char newPassword[5]; //charater string of newPasswordString

//initialize password to 1234
//you can use password.set(newPassword) to overwrite it
Password password = Password( (char*)"1234" );

byte maxPasswordLength = 6;
byte currentPasswordLength = 0;
const byte ROWS = 4;
const byte COLS = 4;

//Define the keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

//// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {12,11,10,9}; //connect to row pinouts

// Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
byte colPins[COLS] = {8,7,6,5}; //connect to column pinouts


// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


int diodaZielona = 2;
int diodaZulta = 3;
int diodaCzerwona = 4;
int czujnikRuchu = A0;
int buzzer = 13;
int KONTAKTRON = A1;



volatile int stanAlarmu = 0;
int czasNaWpisPinu = 0;
int odliczanie = 100;           // długość przyrwy przy odliczaniu czuwania
int czasPin = 100;                // czas na wpisanie pinu
int czasPinPowykryciuRuchu = 100; // czas na wpisanie pinu po wykryciu ruchu
int czasTrwaniaAlarmu = 100;      //czas trwania alarmu

int x = 1; // zmienna do LCD


int zmianaHaslaPozycja = 1;
char zmianaHaslaCyfra1 = '0'; //
char zmianaHaslaCyfra2 = '0'; //
char zmianaHaslaCyfra3 = '0'; //
char zmianaHaslaCyfra4 = '0'; //
char zmianaHaslaCyfra5 = 'D'; //


int aktywacjaAlarmuPozycja = 1;
char aktywacjaCyfra1 = '1'; //
char aktywacjaCyfra2 = '2'; //
char aktywacjaCyfra3 = '3'; //   PIN DO WŁĄCZENIA CZUWANIA
char aktywacjaCyfra4 = '4'; //
char aktywacjaCyfra5 = 'A'; //



void setup(){
  lcd.begin();
   Serial.begin(9600);

  pinMode(diodaZielona, OUTPUT);
  pinMode(diodaZulta, OUTPUT);
  pinMode(diodaCzerwona, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(czujnikRuchu, INPUT_PULLUP);
  pinMode(KONTAKTRON, INPUT_PULLUP);
}


void loop() {
 
  char key = keypad.getKey();
   if (key != NO_KEY){
      delay(60);
      switch (key){
      case '0': break;
      case 'B': break;
      case 'C': break;
      case 'D': break;
      case '#': checkPassword(); break;
      case '*': resetPassword(); lcd.clear();  break;
      default:  processNumberKey(key);
      }
   }

   
   switch (stanAlarmu) {

     case 0: //czuwanie wyłączone
    lcd.home();
    lcd.print("ALARM WYLACZONY ");
    digitalWrite(diodaZielona, HIGH);
    digitalWrite(diodaZulta, LOW);
    digitalWrite(diodaCzerwona, LOW);
    digitalWrite(buzzer, LOW); 
    break; 
 
   case 1: //czuwanie włączone
    lcd.home();
    lcd.print("ALARM WLACZONY");
    digitalWrite(diodaZielona, LOW);
    digitalWrite(diodaZulta, HIGH);
    digitalWrite(diodaCzerwona, LOW);
    digitalWrite(buzzer, LOW);
    if (digitalRead(czujnikRuchu) == HIGH) {
      stanAlarmu = 2;
    lcd.clear();
    lcd.home();
    lcd.print("WYKRYTO RUCH");
    }
    if (digitalRead(KONTAKTRON) == HIGH) {
    stanAlarmu = 2;
    lcd.clear();
    lcd.home();
    lcd.print("WYKRYTO RUCH");
    }
    break; 

    case 2: // czas na rozbrojenie alarmu po wykryciu  ruchu przez PIR
    lcd.home();
    lcd.print("WYKRYTO RUCH");
    digitalWrite(diodaZielona, LOW);
    digitalWrite(diodaZulta, LOW);
    digitalWrite(diodaCzerwona, HIGH);
    tone(buzzer, 2000);
    delay(50);
    tone(buzzer, 2000);
    delay(50);
    noTone(buzzer);

    delay(czasPinPowykryciuRuchu);   //
    czasNaWpisPinu++;                //   USTAWIENIE trwania alarmu
    if (czasNaWpisPinu >= 100) {     //   WPISANIE PINU
        czasNaWpisPinu = 0;
        stanAlarmu = 3;              // czas na wpisanie pinu minął, przejscie do stanu (alarm) 6
        lcd.clear();
      }
    break;

   
    case 3: // ALARM
    lcd.setCursor(4, 0);
    lcd.print("ALARM !"); 
    digitalWrite(diodaZielona, LOW);
    digitalWrite(diodaZulta, LOW);
    digitalWrite(diodaCzerwona, HIGH);
    tone(buzzer, 4000);
    delay(50);
    tone(buzzer, 3000);
    delay(50);
    tone(buzzer, 2000);
    delay(50);
    tone(buzzer, 1000);
    delay(50);
    noTone(buzzer);
    break;
}

    if (key) {
      if (zmianaHaslaPozycja == 1 && key == zmianaHaslaCyfra1) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 2 && key == zmianaHaslaCyfra2) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 3 && key == zmianaHaslaCyfra3) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 4 && key == zmianaHaslaCyfra4) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 5 && key == zmianaHaslaCyfra5) {
          zmianaHaslaPozycja++;
      changePassword();
      zmianaHaslaPozycja = 1;
      resetPassword();
      }
  }

if (key) {
   
      if (aktywacjaAlarmuPozycja == 1 && key == aktywacjaCyfra1) {
          aktywacjaAlarmuPozycja++;
        } else if (aktywacjaAlarmuPozycja == 2 && key == aktywacjaCyfra2) {
          aktywacjaAlarmuPozycja++;
        } else if (aktywacjaAlarmuPozycja == 3 && key == aktywacjaCyfra3) {
          aktywacjaAlarmuPozycja++;
        } else if (aktywacjaAlarmuPozycja == 4 && key == aktywacjaCyfra4) {
          aktywacjaAlarmuPozycja++;
        } else if (aktywacjaAlarmuPozycja == 5 && key == aktywacjaCyfra5) {
      stanAlarmu = 1;
      aktywacjaAlarmuPozycja = 1;
      resetPassword();
      lcd.clear();   
      }

  }
if (key) {  // przesunięcie kursora
x++;
Serial.println(x);
if (x == maxPasswordLength) {
  x = 0;
       }
  } 
}

 

void processNumberKey(char key) {
   lcd.setCursor(0, x);
   lcd.print(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength) {
      checkPassword();
   }
}

void checkPassword() {
   if (password.evaluate()){
      lcd.clear();
      delay(100);
      alarmWyl();
      stanAlarmu = 0;
   } else {
      lcd.clear();
      lcd.print("BLEDNY PIN");
      delay(2000);
      lcd.clear();
   }
   resetPassword(); 
}

void resetPassword() {
   password.reset();
   currentPasswordLength = 0;
}

void changePassword() {
   lcd.clear();
   lcd.print("ZMIANA PINU");
   newPasswordString = Password();
   newPasswordString.toCharArray(newPassword, newPasswordString.length()+1); //convert string to char array
password.set(newPassword);
   resetPassword();
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("PIN ZMIENIONY NA:");
   lcd.setCursor(0, 1);
   lcd.print(newPasswordString);
   delay(2000);
   lcd.clear();
}

String Password()

    String password = "";
    while (1){
        char key = keypad.getKey();
          if (key){       
                if ((key=='0') || (key=='1') || (key=='2') ||
                    (key=='3') || (key=='4') || (key=='5') ||
                    (key=='6') || (key=='7') || (key=='8') ||
                    (key=='9')) // jesli wcisnąłem klawisze 0 - 9
                    {   
                         lcd.setCursor(0, 1);
                         lcd.print(key);
                         password = password + key; // taka konkatenacja, to tylko w Adruino zadziała         
                    }
                    if (key=='#') break;// zatwierdzamy wybór           
        }
    }
    return password;
}

void alarmWyl(){
  lcd.setCursor(0, 0);
  lcd.print("ALARM WYLACZONY");
  delay(1000);
  lcd.clear();
}
 
Odpowiedź
#14
Ja to się dziwie ze w ogóle ci to działa

Od kiedy

char key;

"if(key)" jest prawda lub fałszem ....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#15
(15-02-2020, 21:52)Jarewa0606 napisał(a): Od kiedy

char key;

"if(key)"  jest prawda lub fałszem ....
Brak znaku FAŁSZ, jest znak PRAWDA.
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
#16
tylko przy char zawsze jest znak... Nawet 0 to znak...

Co innego gdyby miał zapis "if(key=="znak")"
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#17
Panowie grunt, że działa Big Grin  Możecie podrzucić jakiś powód dlaczego mam problem ze zmienną w lcd.setCursor(0, x);


Kod:
if (key) {  // przesunięcie kursora
x++;
Serial.println(x);
if (x == maxPasswordLength) {
  x = 0;
       }
  }

Na monitorze szeregowym jest ok, ponieważ dobrze zlicza naciśnięcia klawisza, ale tutaj już nie jest dobrze, kursor jak stał w miejscu tak stoi dalej.
Kod:
void processNumberKey(char key) {
   lcd.setCursor(0, x);
   lcd.print(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength) {
      checkPassword();
   }
}
 
Odpowiedź
#18
(15-02-2020, 22:21)Jarewa0606 napisał(a): tylko przy char zawsze jest znak...  Nawet 0 to znak...
Znak o kodzie 0.

sprawdź sobie

char c = 0;
if( c==0 ) Serial.print( "falsz" );
else Serial.print( "prawda" );


co innego  c= '0'
Kod znaku "0" to 0x30.
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
#19
Jednak wszystko działa dobrze. Z powodu zmęczenia nie zauważyłem źle ustawionego kursora, było  lcd.setCursor(0, x);  a powinno być  lcd.setCursor(x, 1); .
 
Odpowiedź
#20
Mam problem. Dodałem do alarmu powiadomienie sms. Moduł działa, z tym, że nie mogę sobie poradzić z ilością wysyłanych sms. Mimo pętli for sms są wysyłane w dużych ilościach. Wrzucam część kodu. Jak będzie potrzebna całość to dodam. Proszę o pomoc.

Kod:
case 3: // ALARM
    lcd.backlight();
    lcd.display();
   
    lcd.setCursor(4, 0);
    lcd.print("ALARM !");
    digitalWrite(diodaZielona, LOW);
    digitalWrite(diodaZulta, LOW);
    digitalWrite(diodaCzerwona, HIGH);
    tone(buzzer, 4000);
    delay(50);
    tone(buzzer, 3000);
    delay(50);
    tone(buzzer, 2000);
    delay(50);
    tone(buzzer, 1000);
    delay(50);
    noTone(buzzer);
   
    for(int sms=0; sms<3; sms++){
    gsm800.write("AT+CMGF=1\r\n");
    delay(20);
    gsm800.write("AT+CMGS=\"xxx\"\r\n");
    delay(20);
    gsm800.write("ALARM");
    delay(20);
    gsm800.write((char)26);
    }
    break;
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości