Pomoc s programem - arduino uno
Moderátor: Moderátoři
Pomoc s programem - arduino uno
Zapnu arduino, nic se neděje.
Když na klávesnici zmáčknu #, má se na displej napsat "zamceno" a budova se má "uzamčít", takže pokaždé, když by se otevřely dveře a zaznamenal to magnetický senzor, má se na 10s rozeznít sirénka a to je vše. Pokud by se znovu otevřely, znovu by se měla rozeznít sirénka, až do té doby, než by se zadal kód, který by to zrušil a zase by se nic nedělo, i kdyby se otevíraly dveře..
Program jsem napsal s dvěma podmínkami if v sobě.. první, že pokud zmáčknu #, má se zapnout senzor a pokud jím neprotéká proud, má se zapnout sirénka.. bohužel mi to funguje tak, že jakmile zmáčknu "#", napíše se uzamčít, pak se na 10s zapne sirénka a vypne.. a já si nevím rady co s tím(tu část s tím odemčením budovy na kód nemám naprogramovanou, ale snad to jde i bez toho, ne? )
přikládám kód:
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.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 customKey;
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 magnet = 10;
int sirena = 0;
void setup()
{
digitalWrite(magnet, HIGH);// zapne se magneticky senzor
pinMode(magnet, INPUT);
pinMode(sirena, OUTPUT);
lcd.begin();// initialize the lcd
lcd.backlight();
}
void loop()
{
char stisknutyznak = klavesnice.getKey();// vytvoří proměnnou, do které uloží znak stisknuté klávesy
if (stisknutyznak == '#') //když se stiskne křížek, objeví se na display zamčeno
{
lcd.setCursor (4,0);
lcd.print("Zamceno");
delay(5000) ;
lcd.clear(); // po 5ti sekundách se nápis "zamčeno" smaže
if(digitalRead(magnet) == HIGH) //pokud neprochazi proud, sirena je zapnutá
{
digitalWrite(sirena,LOW);
}
else {
digitalWrite(sirena, HIGH);// sirena se zapne na 10 sekund
delay(10000);
digitalWrite(sirena,LOW);
}
}
else
{
}
}
děkuji moc za jakoukoli pomoc.
digitalWrite(magnet, HIGH);// zapne se magneticky senzor
pinMode(magnet, INPUT);
edit - moja blbosť, bude to pre pullup. Ale zvykne sa to naopak. Najskôr nastaviť ako output a potom write. Ale to asi nebude mať vplyv.
Pochopte.. jsem doma, tak je mi jedno jestli se otvírají dveře.. odejdu pryč, stisknu křížek, tím pádem se to aktivuje a když někdo cizí otevře dveře, aniž by třeba předtím zadal nějaké heslo, tak se rozhouká sirénka.
Pošlu ten samostatný kód na dveře, který funguje
const int magnet = 10;
const int sirena = 0;
int status;
void setup() {
pinMode(magnet, INPUT);
pinMode(sirena, OUTPUT);
digitalWrite(magnet, HIGH);
}
void loop() {
if(digitalRead(magnet) == LOW){
digitalWrite(sirena, LOW);
}
else{
digitalWrite(sirena, HIGH);
delay (5000);
digitalWrite(sirena, LOW);
}
}
jen nechápu, proč nefunguje vložený do zbytku programu.
ještě mě napadlo, jestli třeba místo if nemám použít else if, nebo něco podobného..
if(digitalRead(magnet) == HIGH) //pokud neprochazi proud, sirena je zapnutá
{
digitalWrite(sirena,LOW);
}
else {
digitalWrite(sirena, HIGH);// sirena se zapne na 10 sekund
delay(10000);
digitalWrite(sirena,LOW);
}
Ak je magnet Hi - siréna bude Lo
Inak siréna Hi
V druhom programe to máš opačne:
if(digitalRead(magnet) == LOW){
digitalWrite(sirena, LOW);
}
else{
digitalWrite(sirena, HIGH);
delay (5000);
digitalWrite(sirena, LOW);
}
Ak je magnet Lo - siréna bude Lo
Ina siréna Hi
Edit - ak máš problém pochopiť postup v podmienkach, nakresli si to do vývojového diagramu.
takto to vypadá teď a funkční
Kód: Vybrat vše
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.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 customKey;
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 magnet = 10;
int sirena = 0;
void setup()
{
pinMode(magnet, INPUT);
pinMode(sirena, OUTPUT);
lcd.begin();// initialize the lcd
lcd.backlight();
}
void loop()
{
char stisknutyznak = klavesnice.getKey();// vytvoří proměnnou, do které uloží znak stisknuté klávesy
if (stisknutyznak == '#') //když se stiskne křížek, objeví se na display zamčeno
{
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
}
else if(digitalRead(magnet) == HIGH){
digitalWrite(sirena, HIGH);
delay(3000);
digitalWrite(sirena,LOW);
}
else{
digitalWrite(sirena, LOW);
}
}
ps. vážně by se tu hodily spoilery, či něco takového
já mám spíš problém v tom, že nevidím přesně rozdíl mezi podmínkou 'if' a 'else if'
if = Ak
else = inak
Tým else ukončíš kladnú odpoveď v prvej podmienke, a druhým if začneš druhú podmienku. Ale stále ju máš vnorenú v zápornej odpovedi v prvej podmienke. Else môžeš aj nemusíš použiť - ak nepotrebuješ riešiť zápornú odpoveď podmienky
edit - tým write magnet nezapínaš magnet! Ten pin si v setup nastavil ako vstup. Tým, že na vstup zapíšeš Hi, zapneš interný pullup rezistor!
Ešte niečo - pre prehľadnosť kódu nemusíš pri jednom príkaze za if ani za else písať zložené zátvorky (ale môžeš). Ak ich nepoužiješ, podmienka v if sa končí tým jedným príkazom. Ak ich použiješ, podmienku ukončíš až opačnou zátvorkou. Ty si v tom prvom príspevku neukončil prvú podmienku opačnou zátvorkou a do nej si ako písal kolega, vnoril druhú podmienku.
Skús to takto pre pochopenie, pullup zapni už v setup, ak je to potrebné:
if (stisknutyznak == '#') //když se stiskne křížek, objeví se na display zamčeno
{
lcd.setCursor (4,0);
lcd.print("Zamceno");
delay(1000) ;
lcd.clear(); // po 1 sekunde se nápis "zamčeno" smaže
}
if(digitalRead(magnet) == HIGH)
{
digitalWrite(sirena, HIGH);
delay(3000);
digitalWrite(sirena,LOW);
}
else digitalWrite(sirena, LOW);
- Přílohy
-
if.jpg- (30.03 KiB) Staženo 192 x
Proč to neuděláš přes tu pomocnou proměnnou jak jsem psal?
//-------- tady nastavuješ co bylo stisknuto -------
if (stisknutyznak == '#') //když se stiskne křížek, objeví se na display zamčeno
{
zamceno=1;
lcd.setCursor (4,0);
lcd.print("Zamceno");
}
if (stisknutyznak == '*') //když se stiskne hvězdička, objeví se na display odemčeno
{
zamceno=0;
lcd.setCursor (4,0);
lcd.print("Odemceno");
}
// a tady testuješ jestli je zamčeno a ZÁROVEŇ došlo k narušení
If zamceno==1 and (digitalRead(magnet) == HIGH)
{
// tady zapneš sirénu
}
teď ale mám další problém.. chci k tomu přidat to, že po zapojení se bude na displeji na 4 řádku ukazovat aktuální datum a čas.. vzal jsem zase program, který už mám hotový a umí to a přidal ho k tomu programu.. a jediné co teď funguje je, že se zobrazí ten čas a zamykání nefuguje... postupně jsem přidával části kodů a zjistil jsem, že neplechu dělá tento příkaz, ale nechápu proč.. věděl by někdo?
sprintf(cas,"%02d.%02d.%02d %02d:%02d", rtc[4],rtc[5],rtc[6],rtc[2],rtc[1]);
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);
}
}