arduino zabezpečovací systém

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
luki28n
Příspěvky: 1
Registrován: 11 dub 2018, 17:48
Reputation: 0

arduino zabezpečovací systém

Příspěvek od luki28n » 11 dub 2018, 18:08

Zdravím.
Obracím se k vám o průběžnou pomoc s celým projektem a říkám si, že pokud by mi někdo opravdu hodně pomohl, nebyl by problém ho nějak finančně odměnit. Každopádně tu je problém.

Mám za úkol vytvořit Elektronický zabezpečovací systém.
obsahuje tyto komponenty (LCD I2C display, 3x4 klávesnice, Sirénka, RTC modul, Modul na paměťovou kartu, magnetický senzor na dveře)
Měl by fungovat následovně:
Jsem doma. Chci odejít, tak zavřu dveře a na klávesnici zmáčknu křížek, napíše se na displeji na 5s 'zamčeno' Systém se přepne do režimu, že při otevření dveří se sepne sirénka a po 10s se vypne. Pak se vrátím domů. Zadám 4ciferné heslo, které za prvé zapíše mé jméno(podle hesla) a čas příchodu na paměťovou kartu a přepne se zpět do režimu, který dovolí otevřít dveře bez zabzučení sirénky.

Komponenty mám nakoupené a zapojené, vše jsem zkomunikoval s dalším prvkem (Display s RTC, Display s klávesnicí, magn. senzor se sirénkou, akorát modul na paměťovou kartu ještě ne, ale to nebude problém)

Teď píšu program a zaseknul jsem se.. mám funkční část, že se zapne arduino a pokud stisknu '#', přepne se do režimu, kdy začne houkat sirénka při otevření dvěří.. tu jsem chtěl dát dohromady s prostým vypsání aktuálního data a času na display. Oba programy samostatně fungují, ale když je dám dohromady, pouze funguje zobrazení času na displeji a na stisknutí křížku nic nereaguje. Zjistil jsem, že v tom celém kódu dělá problém řádek
sprintf(cas, "%02d.%02d.%02d %02d:%02d", rtc[4],rtc[5],rtc[6],rtc[2],rtc[1]);

ale nevím vůbec proč.. jinak tady je kod

Kód: Vybrat vše

#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <DS1307.h>
#define Password_Lenght 5 //délka hesla 5
LiquidCrystal_I2C lcd(0x27,20,4);
char Data[Password_Lenght]; // 6 is the number of chars it can hold + the null char = 7
char Master[Password_Lenght] = "1"; 
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char stisknutyznak;
int rtc[68];
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = {
  8,7,6,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {
  9,3,2}; //connect to the column pinouts of the keypad

Keypad klavesnice( makeKeymap(keys), rowPins, colPins, ROWS, COLS); //initialize an instance of class NewKeypad 
int zamceno;
int magnet = 10;
int sirena = 0;
void setup()
{
  
  pinMode(magnet, INPUT);
  pinMode(sirena, OUTPUT);

  lcd.begin();// initialize the lcd 
  lcd.backlight();
  lcd.setCursor(4,0); // nastaví kurzor na pozici
  RTC.set(DS1307_DATE,11); // nastaví den v měsíci
  RTC.set(DS1307_MTH,4); // nastaví měsíc
  RTC.set(DS1307_YR,18); // nastaví rok
  RTC.set(DS1307_MIN,11); // nastaví minuty
  RTC.set(DS1307_HR,10); // nastaví hodiny
  RTC.start(); // spustí čas
}

void loop()
{
char stisknutyznak = klavesnice.getKey();// vytvoří proměnnou, do které uloží znak stisknuté klávesy
  RTC.get(rtc,true);  
  // připraví pole znaků pro čas
 char cas[9];
  // zapíše do pole znaků cas hodnoty z rtc
 
 sprintf(cas, "%02d.%02d.%02d  %02d:%02d", rtc[4],rtc[5],rtc[6],rtc[2],rtc[1]);
   
  lcd.setCursor(3,3); // nastaví kurzor na pozici
  lcd.print(cas); // vypíše cas na displej
  
if (stisknutyznak == '#') //když se stiskne křížek, objeví se na display zamčeno
{
  zamceno=1;
    lcd.setCursor (4,0);
lcd.print("Zamceno");
digitalWrite(magnet, HIGH);//  a zapne se magneticky senzor 
delay(1000) ;
lcd.clear(); // po 5ti sekundách se nápis "zamčeno" smaže
  
}
  if(digitalRead(magnet) == HIGH and zamceno==1){

digitalWrite(sirena, HIGH);
delay(3000);
digitalWrite(sirena,LOW);
}

else{

digitalWrite(sirena, LOW);

}

  
  

    
   

}

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: arduino zabezpečovací systém

Příspěvek od gilhad » 11 dub 2018, 22:57

Jestli pocitam spravne, tak ten sprinf ma vracet 15 znaku (3x3+5+1 na koncovou nulu), zatimco ho mas deklarovany na 9 znaku (na zasobniku). Kdyz zavolas ten sprintf, tak je dost velka sance, ze ti to preteceni nekde prepise neco na zasobniku (treba navratovou adresu) a tim padem se to muze vysypat prakticky jakkoliv.

Zacal bych tim, ze bych dal

Kód: Vybrat vše

char cas[15];
nebo klidne i vic a zkusil, jestli to uz funguje, nebo kde to pada po te oprave.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 20 hostů