RE: próba budowy systemu alarmowego - Agregacik - 14-02-2020
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.
RE: próba budowy systemu alarmowego - Lucek20 - 14-02-2020
(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.
RE: próba budowy systemu alarmowego - Lucek20 - 15-02-2020
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();
}
RE: próba budowy systemu alarmowego - Jarewa0606 - 15-02-2020
Ja to się dziwie ze w ogóle ci to działa
Od kiedy
char key;
"if(key)" jest prawda lub fałszem ....
RE: próba budowy systemu alarmowego - MERASerwis - 15-02-2020
(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.
RE: próba budowy systemu alarmowego - Jarewa0606 - 15-02-2020
tylko przy char zawsze jest znak... Nawet 0 to znak...
Co innego gdyby miał zapis "if(key=="znak")"
RE: próba budowy systemu alarmowego - Lucek20 - 15-02-2020
Panowie grunt, że działa 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();
}
}
RE: próba budowy systemu alarmowego - MERASerwis - 16-02-2020
(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.
RE: próba budowy systemu alarmowego - Lucek20 - 16-02-2020
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); .
RE: próba budowy systemu alarmowego - Lucek20 - 22-02-2020
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;
|