arduino budik

surikata
Příspěvky: 33
Registrován: 14 zář 2018, 19:59
Reputation: 0

arduino budik

Příspěvek od surikata » 04 úno 2019, 18:42

Zdravim, mam problem s budekem a to sice takoví, ze kdyz mi budik zvoni tak prestane zvonit jen kdyz drzim tlacitko exit a když jej pustim tak zase zvoni. Zkousel sem pridat delay, ale to delalo neplechu.Tlacitko exit je pouzivano pro prepnuti z5 z nastavovaní budiku a pro zruseni alarmu. Za každkou pomoc předem děkuji.

Kód: Vybrat vše

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

byte c_hacek[8] = {
0b01010,
0b00100,
0b01110,
0b10000,
0b10000,
0b10000,
0b01110,
0b00000
};

byte y_carka[8] = {
0b00010,
0b00100,
0b10001,
0b10001,
0b01111,
0b00001,
0b01110,
0b00000
};
byte i_carka[8] = {
0b00010,
0b00100,
0b00000,
0b00100,
0b01100,
0b00100,
0b01110,
0b00000
};


LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <DS1302.h>
int Hour;
int Min;
int Sec;
int pset = 22; 
int phour = 23; 
int pmin = 24; 
int pexit = 25; 
int buzzer = 8;
int h;
int m;
int buttonforset = 0; 
int buttonforhour = 0; 
int buttonformin = 0;
int buttonforexit = 0;
int buttonforstopbuzz = 0;
int activate=0;
int budik=0;
 
Time t;

DS1302 rtc(7, 6, 5);



void setup()
{
 pinMode(pset, INPUT);
 pinMode(phour, INPUT);
 pinMode(pmin, INPUT);
 pinMode(pexit, INPUT);
 
 rtc.halt(false);
 rtc.writeProtect(false);


 
 lcd.begin();


 rtc.setDOW(SUNDAY);
 rtc.setTime(20, 9, 45); 
 rtc.setDate(27, 1, 2019); 
 
}

void loop()
{
 

lcd.createChar(0, c_hacek);
 lcd.setCursor(0, 0);
 lcd.write(byte(0));
 lcd.print("as: ");
 lcd.setCursor(5, 0);
 lcd.print(rtc.getTimeStr());

 
 
 lcd.setCursor(0, 2);
 lcd.print("Den v t");
 lcd.createChar(1, y_carka);
 lcd.setCursor(7, 2);
 lcd.write(byte(1));
 lcd.setCursor(8, 2);
 lcd.print("dnu: ");
 lcd.setCursor(13, 2);
 lcd.print(rtc.getDOWStr(FORMAT_SHORT));
 
 
 lcd.setCursor(0, 1);
 lcd.print("Datum: ");
 lcd.setCursor(7, 1);
 lcd.print(rtc.getDateStr());
 t = rtc.getTime();
 Hour = t.hour;
 Min = t.min;
 Sec = t.sec;
 buttonforexit = digitalRead(pexit);
 
 
 if (activate == 0) {

 buttonforset = digitalRead(pset);
 } 
 if (buttonforset == HIGH) {
 activate =1;
 lcd.clear(); }
 while(activate== 1){
 lcd.setCursor(0,0);
 lcd.print("Nastaven");
 lcd.createChar(2, i_carka);
 lcd.setCursor(8,0);
 lcd.write(byte(2));
 lcd.setCursor(10,0);
 lcd.print("bud");
 lcd.setCursor(13,0);
 lcd.write(byte(2));
 lcd.setCursor(14,0);
 lcd.print("ku");
 lcd.setCursor(0,1);
 lcd.print("Hour= ");
 lcd.setCursor(9,1);
 lcd.print("Min= ");
 buttonforhour = digitalRead(phour); 
 if (buttonforhour == HIGH){
 h++;
 lcd.setCursor(5,1);
 lcd.print(h);
 if (h>23){
 h=0;
 lcd.clear(); }
 delay(100); 
 }
 buttonformin = digitalRead(pmin); 
 if (buttonformin == HIGH){
 m++;
 lcd.setCursor(13,1);
 lcd.print(m);
 if (m>59){
 m=0; 
 lcd.clear();}
 delay(100); 
 }

lcd.setCursor(5,1);
 lcd.print(h);
 lcd.setCursor(13,1);
 lcd.print(m);
 buttonforexit = digitalRead(pexit); 
 if (buttonforexit == HIGH){
 activate = 0;
 lcd.clear();
 
 }
 }
if (activate == 0) {
if (Hour== h && Min== m && buttonforexit == LOW ) {

 tone(buzzer,400);
 
 }
 
  
 
  buttonforstopbuzz = digitalRead(pexit);{
 } 
 if (buttonforstopbuzz == HIGH) {
  digitalRead(buttonforstopbuzz=HIGH);
  noTone(buzzer);
  delay(60000);
  
 } 
  
  
  
  
  
      
       
    
  }    
  } 

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: arduino budik

Příspěvek od jankop » 04 úno 2019, 20:17

Překvapilo mě, že máš aktivní tlačítka v HIGH. Je to pravda?
Pak jsem nepochopil rafinovanou konstrukci

Kód: Vybrat vše

digitalRead(buttonforstopbuzz=HIGH);
Co to má dělat?
Já bych zkusil následující:

Kód: Vybrat vše

 ...
if (activate == 0) { // predpokladam, ze 0 = buzeni zapnuto (tzv. zenska logika)
    if (Hour == h && Min == m && Sec < 3 ) tone(buzzer, 400);
    if (digitalRead(pexit)) noTone(buzzer);
  }

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

Re: arduino budik

Příspěvek od gilhad » 04 úno 2019, 22:04

buttonforstopbuzz je int, jak je definovano o neco vyse v ono *.ino

HIGH je 0x1 , jak je definovano v
hardware/arduino/avr/cores/arduino/Arduino.h, radek asi 40

takze to priradi 1 do te promenne a pak to precte pin 1 a vysledek zahodi

nasledne je ta promenna nastavena na jednicku bez ohledu na stav jakychkoli tlacitek ....

surikata
Příspěvky: 33
Registrován: 14 zář 2018, 19:59
Reputation: 0

Re: arduino budik

Příspěvek od surikata » 05 úno 2019, 13:08

jankop píše:
04 úno 2019, 20:17
Překvapilo mě, že máš aktivní tlačítka v HIGH. Je to pravda?
Pak jsem nepochopil rafinovanou konstrukci

Kód: Vybrat vše

digitalRead(buttonforstopbuzz=HIGH);
Co to má dělat?
Já bych zkusil následující:

Kód: Vybrat vše

 ...
if (activate == 0) { // predpokladam, ze 0 = buzeni zapnuto (tzv. zenska logika)
    if (Hour == h && Min == m && Sec < 3 ) tone(buzzer, 400);
    if (digitalRead(pexit)) noTone(buzzer);
  }
Děkuji, vše funguje. Prosím adminy, aby příspěvek ještě neuzamikali. Budu se snažit o další editace, takže bude i další nával chyb. :D

surikata
Příspěvky: 33
Registrován: 14 zář 2018, 19:59
Reputation: 0

Re: arduino budik

Příspěvek od surikata » 05 úno 2019, 19:07

Trošku jsem si program ještě poupravil, aby budík nikdy nezvonil v době 0:00, což je stav kdy budík neni jakoby nastaven. Musí se nastavit 0:01 nebo 1:0 a přidal jsem znak zvonku, když je budík nastaven. Ale co my dělá potíže je přidání nastavení času a datumu, přesně v tom mistě , kde nastavuji i alarm. To jest usek kodu kde je nastaveni=1. Prosím, může mi někdo pomoci?

Kód: Vybrat vše

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

byte c_hacek[8] = {
0b01010,
0b00100,
0b01110,
0b10000,
0b10000,
0b10000,
0b01110,
0b00000
};

byte y_carka[8] = {
0b00010,
0b00100,
0b10001,
0b10001,
0b01111,
0b00001,
0b01110,
0b00000
};
byte i_carka[8] = {
0b00010,
0b00100,
0b00000,
0b00100,
0b01100,
0b00100,
0b01110,
0b00000
};
byte zvonek_znak[8] = {
        0b00100,
        0b01110,
        0b01110,
        0b01110,
        0b01110,
        0b11111,
        0b00000,
        0b00100
        };


LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <DS1302.h>
int Hour;
int Min;
int Sec;
int pset = 22; 
int phour = 23; 
int pmin = 24; 
int pexit = 25; 
int buzzer = 8;
int h;
int m;
int buttonforset = 0; 
int buttonforhour = 0; 
int buttonformin = 0;
int buttonforexit = 0;
int buttonforstopbuzz = 0;
int nastaveni=0;
int budik=0;
 
Time t;

DS1302 rtc(7, 6, 5);



void setup()
{
 pinMode(pset, INPUT);
 pinMode(phour, INPUT);
 pinMode(pmin, INPUT);
 pinMode(pexit, INPUT);
 
 rtc.halt(false);
 rtc.writeProtect(false);


 
 lcd.begin();


 rtc.setDOW(SUNDAY);
 rtc.setTime(0, 59, 45); 
 rtc.setDate(27, 1, 2019); 
 
}

void loop()
{

 
  if (h == 0 && m == 0){
    lcd.setCursor(20, 0);
    lcd.print("");
    }
    else {
    lcd.createChar(3, zvonek_znak);
    lcd.setCursor(19, 0);
    lcd.write(byte(3));
    zvoneni();
    }
lcd.createChar(0, c_hacek);
 lcd.setCursor(0, 0);
 lcd.write(byte(0));
 lcd.print("as: ");
 lcd.setCursor(5, 0);
 lcd.print(rtc.getTimeStr());

 
 
 lcd.setCursor(0, 2);
 lcd.print("Den v t");
 lcd.createChar(1, y_carka);
 lcd.setCursor(7, 2);
 lcd.write(byte(1));
 lcd.setCursor(8, 2);
 lcd.print("dnu: ");
 lcd.setCursor(13, 2);
 lcd.print(rtc.getDOWStr(FORMAT_SHORT));
 
 
 lcd.setCursor(0, 1);
 lcd.print("Datum: ");
 lcd.setCursor(7, 1);
 lcd.print(rtc.getDateStr());
 t = rtc.getTime();
 Hour = t.hour;
 Min = t.min;
 Sec = t.sec;
 buttonforexit = digitalRead(pexit);
 
 
 if (nastaveni == 0) {

 buttonforset = digitalRead(pset);
 } 
 if (buttonforset == HIGH) {
 nastaveni =1;
 lcd.clear(); }
 while(nastaveni== 1){
 lcd.setCursor(0,0);
 lcd.print("Bud");
 lcd.createChar(2, i_carka);
 lcd.setCursor(3,0);
 lcd.write(byte(2));
 lcd.setCursor(4,0);
 lcd.print("k:");
 lcd.createChar(0, c_hacek);
 lcd.setCursor(0,1);
 lcd.write(byte(0));
 lcd.setCursor(1,1);
 lcd.print("as:");
 lcd.setCursor(4,1);
 lcd.print("Hod= ");
 lcd.setCursor(10,1);
 lcd.print("Min= ");
 lcd.setCursor(6,0);
 lcd.print("Hod= ");
 lcd.setCursor(12,0);
 lcd.print("Min= ");
 
 buttonforhour = digitalRead(phour); 
 if (buttonforhour == HIGH){
 h++;
 lcd.setCursor(10,0);
 lcd.print(h);
 if (h>23){
 h=0;
 lcd.clear(); }
 delay(200); 
 }
 buttonformin = digitalRead(pmin); 
 if (buttonformin == HIGH){
 m++;
 lcd.setCursor(16,0);
 lcd.print(m);
 if (m>59){
 m=0; 
 lcd.clear();}
 delay(100); 
 }


lcd.setCursor(10,0);
 lcd.print(h);
 lcd.setCursor(16,0);
 lcd.print(m);
 buttonforexit = digitalRead(pexit); 
 if (buttonforexit == HIGH){
 nastaveni = 0;
 lcd.clear();
 
 }
 }
 }
 void zvoneni () {
if (nastaveni == 0) { 
    if (Hour == h && Min == m && Sec < 1 ) 
    tone(buzzer, 400);
    if (digitalRead(pexit)) 
    noTone(buzzer);}
 
  
   
               
  }

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: arduino budik

Příspěvek od jankop » 07 úno 2019, 21:18

Máš odkazy na knihovny LiquidCrystal_I2C.h a DS1302.h ?

surikata
Příspěvky: 33
Registrován: 14 zář 2018, 19:59
Reputation: 0

Re: arduino budik

Příspěvek od surikata » 09 úno 2019, 11:07

jankop píše:
07 úno 2019, 21:18
Máš odkazy na knihovny LiquidCrystal_I2C.h a DS1302.h ?
Knihovny jsem nahrál zde : https://mega.nz/#!5BgXRK5T!E3tFSkL6DCae ... fdn8z5MSJQ

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: arduino budik

Příspěvek od jankop » 09 úno 2019, 11:30

A opravdu máš tlačítka aktivní v HIGH? Pořád se mi to nějak nezdá. Není moc obvyklé dávat PullDown rezistory.

surikata
Příspěvky: 33
Registrován: 14 zář 2018, 19:59
Reputation: 0

Re: arduino budik

Příspěvek od surikata » 09 úno 2019, 12:08

Ano mám to tak, program funguje i tlačítka. Vycházím z http://roboticadiy.com/how-to-make-ardu ... 9yER-PKjQI.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: arduino budik

Příspěvek od jankop » 09 úno 2019, 13:06

Nekecal's, je to tak. Tlačítka do Vcc s PullDown.
Hrál jsem si s tvým programem, faktem je, že bez displeje a časovače to není nic moc. Ale aspoň ty knihovny mě dovolily základní kontrolu kompilací.
Domnívám se, že třeba definice speciálních znaku není třeba dělat neustále dokola ve smyčce loop(), tedy za předpokladu, že funkce lcd.clear() nemaže i definované znaky. Taky si myslím, že by bylo škoda se ochudit o možnost nechat se vzbudit o půlnoci, například pro Lovce duchů je to denní chleba. Úpravy programu, které tady navrhuji, jsem neměl možnost nijak ověřit, to je na tobě.
Trošku se změnili role tlačítek.
SET - 1. stiskem přejdou hodiny do nastavení hodin
2. stiskem přejdou z nastavení hodin do nastavení budíku
3. přejdou do nastaveni data
4. se vrátí do normálního režimu - režimu hodin

EXIT - tlačítko v režimu hodin vypíná nebo zapíná zvonění
v režimu nastavování zatím nic nedělá, ale já bych ho použil jako tlačítko pro nastavení roku/Year
Nastavování data si musíš dopsat, já jsem tam pro něj jen připravil smyčku. Bez hardware si opravdu nic neodzkouším, tak je to plně na tobě, včetně případných dalších vychytávek.



Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS1302.h>
#define pset  22  // definice portu pro tlacitko SET
#define phour 23  // definice portu pro tlacitko HOUR
#define pmin  24  // definice portu pro tlacitko MIN
#define pexit 25  // definice portu pro tlacitko EXIT
#define buzzer 8  // definice portu pro zvonek
#define SPEED 400 // perioda inkrementace hodin a minut [ms]
#define SWITCH 50 // zpozdeni pro osetreni zakmitu tlacitka [ms]
/* definice ceskych znaku a zvonku */
byte c_hacek[8] = {
  0b01010,
  0b00100,
  0b01110,
  0b10000,
  0b10000,
  0b10000,
  0b01110,
  0b00000
};
byte y_carka[8] = {
  0b00010,
  0b00100,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b01110,
  0b00000
};
byte i_carka[8] = {
  0b00010,
  0b00100,
  0b00000,
  0b00100,
  0b01100,
  0b00100,
  0b01110,
  0b00000
};
byte zvonek_znak[8] = {
  0b00100,
  0b01110,
  0b01110,
  0b01110,
  0b01110,
  0b11111,
  0b00000,
  0b00100
};
byte Hour;              // promenna hodin
byte Min;               // promenna minut
byte Sec;               // promenna sekund
byte OldSec = 0;        // pomocna promenna pro obnoveni displeje pri zmene casu
unsigned int Year = 2019;
byte Month = 6;
byte Day = 15;
byte h = 05;               // nastaveni budiku - hodiny
byte m = 00;               // nastaveni budiku - minuty
bool budik = false;        // priznak povoleni zvoneni budiku
Time t;                    // strukturovany cas

LiquidCrystal_I2C lcd(0x27, 20, 4);
DS1302 rtc(7, 6, 5);

void setup()
{
  pinMode(pset, INPUT);
  pinMode(phour, INPUT);
  pinMode(pmin, INPUT);
  pinMode(pexit, INPUT);
  rtc.halt(false);
  rtc.writeProtect(false);
  lcd.begin();
  lcd.createChar(0, c_hacek);    // definice znaku
  lcd.createChar(1, y_carka);    // definice znaku
  lcd.createChar(2, i_carka);    // definice znaku
  lcd.createChar(3, zvonek_znak);// definice znaku

}
void loop() {
  // pokud se zmenil cas, tak prepis displej
  t = rtc.getTime();
  Hour = t.hour;
  Min = t.min;
  Sec = t.sec;
  if (OldSec != Sec) {
    OldSec = Sec;
    DisplayPrepis(); // zobrazeni
  }
  // pokud nastal cas zvoneni tak zazvon
  if (budik && Hour == h && Min == m && Sec < 2 ) tone(buzzer, 400);
  // zde je stiskem tlacitka EXIT  mozne zapinat a vypinat buzeni
  if (digitalRead(pexit)) {
    budik = !budik;        // prepina budik On/Off
    if (budik) {
      lcd.setCursor(19, 0);// budik ON - zapis znak zvonku
      lcd.write(byte(3));
    } else {
      lcd.setCursor(19, 0);// budik OFF - zrus znak zvonku
      lcd.write(" ");
      noTone(buzzer);      // vypni zvonek i kdyz treba nezvoni
    }
    while (digitalRead(pexit)) {} // ceka na uvolneni tlacitka EXIT
    delay(SWITCH);                // osetruje zakmity tlacitka
  }
  /* pri opakovanem stisku tlacitka SET je mozne nastavovat cas, budik a datum
     nebo prejit zpatky do normalniho modu */
  if (digitalRead(pset))Nastaveni();
}

void DisplayPrepis(void) {
  /* bezne zobrazeni vypsani popisku a udaju */
  lcd.setCursor(0, 0);
  lcd.write(byte(0));
  lcd.print("as: ");
  lcd.setCursor(0, 2);
  lcd.setCursor(5, 0);
  lcd.print(rtc.getTimeStr());
  lcd.print("Den v t");
  lcd.setCursor(7, 2);
  lcd.write(byte(1));
  lcd.setCursor(8, 2);
  lcd.print("dnu: ");
  lcd.setCursor(13, 2);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));
  lcd.setCursor(0, 1);
  lcd.print("Datum: ");
  lcd.setCursor(7, 1);
  lcd.print(rtc.getDateStr());
}
void Nastaveni(void) {
  /* zobrazeni nastaveni hodin */
  lcd.clear();
  t = rtc.getTime();
  Hour = t.hour;
  Min = t.min;
  lcd.setCursor(0, 1);
  lcd.write(byte(0));
  lcd.setCursor(1, 1);
  lcd.print("as:");
  lcd.setCursor(4, 1);
  lcd.print("Hod= ");
  lcd.setCursor(9, 1);
  lcd.print(Hour);
  lcd.setCursor(10, 1);
  lcd.print("Min= ");
  lcd.setCursor(15, 1);
  lcd.print(Min);
  while (pset) {} // ceka na uvolneni tlacitka SET
  delay(SWITCH);  // osetruje zakmity
  // smycka nastaveni hodin trva, dokud neni znovu stisknuto tlacitko SET
  while (!pset) {
    /* hodiny */
    if (digitalRead(phour)) {
      Hour++;
      lcd.setCursor(9, 1);
      lcd.print(Hour);
      if (Hour > 23) {
        Hour = 0;
        lcd.setCursor(9, 1);
        lcd.print("0 ");
      }
      delay(SPEED);
    }
    /* minuty */
    if (digitalRead(pmin)) {
      Min++;
      lcd.setCursor(15, 1);
      lcd.print(Min);
      if (Min > 59) {
        Min = 0;
        lcd.setCursor(15, 1);
        lcd.print("0 ");
      }
      delay(SPEED);
    }
  }
  rtc.setTime(Hour, Min, 00);// ulozi nastavene hodnoty
  // zobrazeni nastaveni budiku
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Bud");
  lcd.setCursor(3, 0);
  lcd.write(byte(2));
  lcd.setCursor(4, 0);
  lcd.print("k:");
  lcd.setCursor(6, 0);
  lcd.print("Hod= ");
  lcd.setCursor(11, 0);
  lcd.print(h);
  lcd.setCursor(12, 0);
  lcd.print("Min= ");
  lcd.setCursor(16, 0);
  lcd.print(m);
  while (pset) {} // ceka na uvolneni tlacitka SET
  delay(SWITCH);  // osetruje zakmity
  // smycka nastaveni budiku trva, dokud neni znovu stisknuto tlacitko SET
  if (!pset) {
    /* budik nastaveni hodiny */
    if (digitalRead(phour)) {
      h++;
      lcd.setCursor(11, 0);
      lcd.print(h);
      if (h > 23) {
        h = 0;
        lcd.setCursor(11, 0);
        lcd.print("0 ");
      }
      delay(SPEED);
    }
    /* budik nastaveni minuty */
    if (digitalRead(pmin)) {
      m++;
      lcd.setCursor(16, 0);
      lcd.print(m);
      if (m > 59) {
        m = 0;
        lcd.setCursor(16, 0);
        lcd.print("0 ");
      }
      delay(SPEED);
    }
  }
  while (pset) {} // ceka na uvolneni tlacitka SET
  delay(SWITCH);  // osetruje zakmity tlacitka
  //**************************************************************************
  // smycka nastaveni datumu trva, dokud neni znovu stisknuto tlacitko SET
  while (!pset) {
    if (Year < 2019)Year = 2019;
    // ...  proste podobne jako predchozi
    // ...
    // ...
  }
  //**************************************************************************
  rtc.setDate(Day, Month, Year);// ulozeni datumu
  while (pset) {} // ceka na uvolneni tlacitka SET
  delay(SWITCH);  // osetruje zakmity tlacitka
  lcd.clear();
  DisplayPrepis();
}


Odpovědět

Kdo je online

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