Arduino UNO R3 + funduino budík
Napsal: 19 úno 2024, 19:58
Ahoj kluci,
pořídil jsem mladýmu tuhle sestavu.
Snažím se na tom rozběhat budík. Ale nedaří se.
Po nahrání nalezeného programu se sepne piezo ihned po zapnutí napájení.
Nejsem v tomhle moc kovaný. Něco málo zvládnu. Ale potřeboval bych, aby to běhalo korektně. Koukl by prosím moc na kód, jestli to je dobře?
Obojí je klon. Ale mám pro sebe UNO originál. Dělá to samé. Transistor je PNP. Ten je v pořádku.
Zdroj: kabinet.fyzika
Děkuji moooc.
// Pro praci s vnitrnim casem Arduina vyuzijeme tyto funkce knihovnu TimeLib
// hour() - pocet hodin (0-23)
// minute() - pocet minut (0-59)
// second() - pocet sekund (0-59)
// day() - den (1-31)
// month() - mesic (1-12)
// year() - rok (2020, 2021...)
// setTime(hr,min,sec,day,mnth,yr) - nastavime vnitrni cas Arduina
#include <TimeLib.h>
// Nastaveni dle Multi-Shieldu nzvaneho Funduino
int latchPin = 4; // piny potrebne pro zobrazovace
int clockPin =7;
int dataPin = 8;
unsigned char Dis_table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; // data pro zobrazeni cisel
unsigned char Dis_buf[] = {0xF1,0xF2,0xF4,0xF8};
unsigned char disbuff[] = {0, 0, 0, 0};
int KEY_HOD = A1; // tlacita pro ovladani
int KEY_MIN = A2;
int KEY_SET = A3;
int KEY_SET_old; // minuly stav tlacitka S3
int KEY_HOD_old; // minuly stav tlacitka S1
int KEY_MIN_old; // minuly stav tlacitka S3
int hodina; // promenne pro praci s casem Arduina
int minuta;
int sekunda;
int den;
int mesic;
int rok;
int ALARM_hod = 0; // promenne pro praci budikem
int ALARM_min = 0;
bool vstavej = true;
bool zvoni = false;
int buzzer = 3; // adresa bzucaku
//---------------------------------------------------------------------------
void setup(void)
{
pinMode(latchPin, OUTPUT); // nastaveni pro zobrazovace
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(buzzer, OUTPUT);
// prvotni nastaveni nastaveni hodin - pri resetu
setTime(16, 40, 00, 22, 03, 2020); // hod, min, sec, den, mesic, rok
}
void display(void)
{
for(char i = 0; i <= 3; i++) // probehne segmenty a zobrazi hodnoty
{
digitalWrite(latchPin, LOW); // zapis na latch
if ((i != 1)||(sekunda%2 == 0)) {
if ((i == 0) && (disbuff[i] == 0)) { // je to prvni segmentovka a je na ni 0
shiftOut(dataPin, clockPin, MSBFIRST, 255); // posli zhasle vsechny zobrabovace
}
else shiftOut(dataPin, clockPin, MSBFIRST, Dis_table[disbuff[i]]); // data pro zobrazovac bez tecky
}
else shiftOut(dataPin, clockPin, MSBFIRST, Dis_table[disbuff[i]] + 128); // data pro zobrazovac s teckou
shiftOut(dataPin, clockPin, MSBFIRST, Dis_buf[i] ); // adresa zobrazovace
digitalWrite(latchPin, HIGH); // zobraz zapsana data
delay(2); // cekej 2 ms
}
}
//---------------------------------------------------------------------------
void loop(void)
{
hodina = hour(); // nacteni aktualniho casu
minuta = minute();
sekunda = second();
den = day();
mesic = month();
rok = year();
if ((hodina == ALARM_hod)&&(minuta == ALARM_min)) // nastal cas buzeni
{
if (vstavej) // je ale buzeni dovolene
{
tone(buzzer, 440);
zvoni = true;
vstavej = false;
}
}
else {
noTone(buzzer);
zvoni = false;
vstavej = true;
} // cas uz nesedi, tak mlc
// A jdeme na testovani tlacitel
// NASTAVENI BUDIKU
if (digitalRead(KEY_SET) == LOW) // pokud neni treti sktisknute nic se nastavovat nebude
{ // nastavovani budiku
disbuff[0]= ALARM_hod/10; // pocet desitek hodin
disbuff[1]= ALARM_hod%10; // zbytek po delelni deseti = pocet jednotek hodin
disbuff[2]= ALARM_min/10; // totez pro minuty
disbuff[3]= ALARM_min%10;
display(); // zobrazovani
if (zvoni) { // zamacknuti
noTone(buzzer);
zvoni = false;
}
if ((digitalRead(KEY_HOD) == LOW)&&(KEY_HOD_old == HIGH)) { // stisknute S1
ALARM_hod = (ALARM_hod+1)%24;
} else
if ((digitalRead(KEY_MIN) == LOW)&&(KEY_MIN_old == HIGH)) { // pokud je k tomu stisnute i tlacitko MIN
ALARM_min = (ALARM_min+1)%60;
}
//----------
} else { // neni stiskle tlacitko S3 tak to bezi jako hodiny
disbuff[0]= hodina/10; // pocet desitek hodin
disbuff[1]= hodina%10; // zbytek po delelni deseti = pocet jednotek hodin
disbuff[2]= minuta/10; // totez pro minuty
disbuff[3]= minuta%10;
display(); // zobrazovani
// NASTAVENI HODIN
if ((digitalRead(KEY_HOD) == LOW)&&(KEY_HOD_old == HIGH)) {
hodina = (hodina+1)%24;
setTime(hodina, minuta, sekunda, den, mesic, rok);
} else
if((digitalRead(KEY_MIN) == LOW)&&(KEY_MIN_old == HIGH)) { // pokud je k tomu stisnute i tlacitko HOD pridej hodinu
minuta = (minuta+1)%60;
setTime(hodina, minuta, 00, den, mesic, rok);
}
}
KEY_SET_old = digitalRead(KEY_SET);
KEY_HOD_old = digitalRead(KEY_HOD);
KEY_MIN_old = digitalRead(KEY_MIN);
}
pořídil jsem mladýmu tuhle sestavu.
Snažím se na tom rozběhat budík. Ale nedaří se.
Po nahrání nalezeného programu se sepne piezo ihned po zapnutí napájení.
Nejsem v tomhle moc kovaný. Něco málo zvládnu. Ale potřeboval bych, aby to běhalo korektně. Koukl by prosím moc na kód, jestli to je dobře?
Obojí je klon. Ale mám pro sebe UNO originál. Dělá to samé. Transistor je PNP. Ten je v pořádku.
Zdroj: kabinet.fyzika
Děkuji moooc.
// Pro praci s vnitrnim casem Arduina vyuzijeme tyto funkce knihovnu TimeLib
// hour() - pocet hodin (0-23)
// minute() - pocet minut (0-59)
// second() - pocet sekund (0-59)
// day() - den (1-31)
// month() - mesic (1-12)
// year() - rok (2020, 2021...)
// setTime(hr,min,sec,day,mnth,yr) - nastavime vnitrni cas Arduina
#include <TimeLib.h>
// Nastaveni dle Multi-Shieldu nzvaneho Funduino
int latchPin = 4; // piny potrebne pro zobrazovace
int clockPin =7;
int dataPin = 8;
unsigned char Dis_table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; // data pro zobrazeni cisel
unsigned char Dis_buf[] = {0xF1,0xF2,0xF4,0xF8};
unsigned char disbuff[] = {0, 0, 0, 0};
int KEY_HOD = A1; // tlacita pro ovladani
int KEY_MIN = A2;
int KEY_SET = A3;
int KEY_SET_old; // minuly stav tlacitka S3
int KEY_HOD_old; // minuly stav tlacitka S1
int KEY_MIN_old; // minuly stav tlacitka S3
int hodina; // promenne pro praci s casem Arduina
int minuta;
int sekunda;
int den;
int mesic;
int rok;
int ALARM_hod = 0; // promenne pro praci budikem
int ALARM_min = 0;
bool vstavej = true;
bool zvoni = false;
int buzzer = 3; // adresa bzucaku
//---------------------------------------------------------------------------
void setup(void)
{
pinMode(latchPin, OUTPUT); // nastaveni pro zobrazovace
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(buzzer, OUTPUT);
// prvotni nastaveni nastaveni hodin - pri resetu
setTime(16, 40, 00, 22, 03, 2020); // hod, min, sec, den, mesic, rok
}
void display(void)
{
for(char i = 0; i <= 3; i++) // probehne segmenty a zobrazi hodnoty
{
digitalWrite(latchPin, LOW); // zapis na latch
if ((i != 1)||(sekunda%2 == 0)) {
if ((i == 0) && (disbuff[i] == 0)) { // je to prvni segmentovka a je na ni 0
shiftOut(dataPin, clockPin, MSBFIRST, 255); // posli zhasle vsechny zobrabovace
}
else shiftOut(dataPin, clockPin, MSBFIRST, Dis_table[disbuff[i]]); // data pro zobrazovac bez tecky
}
else shiftOut(dataPin, clockPin, MSBFIRST, Dis_table[disbuff[i]] + 128); // data pro zobrazovac s teckou
shiftOut(dataPin, clockPin, MSBFIRST, Dis_buf[i] ); // adresa zobrazovace
digitalWrite(latchPin, HIGH); // zobraz zapsana data
delay(2); // cekej 2 ms
}
}
//---------------------------------------------------------------------------
void loop(void)
{
hodina = hour(); // nacteni aktualniho casu
minuta = minute();
sekunda = second();
den = day();
mesic = month();
rok = year();
if ((hodina == ALARM_hod)&&(minuta == ALARM_min)) // nastal cas buzeni
{
if (vstavej) // je ale buzeni dovolene
{
tone(buzzer, 440);
zvoni = true;
vstavej = false;
}
}
else {
noTone(buzzer);
zvoni = false;
vstavej = true;
} // cas uz nesedi, tak mlc
// A jdeme na testovani tlacitel
// NASTAVENI BUDIKU
if (digitalRead(KEY_SET) == LOW) // pokud neni treti sktisknute nic se nastavovat nebude
{ // nastavovani budiku
disbuff[0]= ALARM_hod/10; // pocet desitek hodin
disbuff[1]= ALARM_hod%10; // zbytek po delelni deseti = pocet jednotek hodin
disbuff[2]= ALARM_min/10; // totez pro minuty
disbuff[3]= ALARM_min%10;
display(); // zobrazovani
if (zvoni) { // zamacknuti
noTone(buzzer);
zvoni = false;
}
if ((digitalRead(KEY_HOD) == LOW)&&(KEY_HOD_old == HIGH)) { // stisknute S1
ALARM_hod = (ALARM_hod+1)%24;
} else
if ((digitalRead(KEY_MIN) == LOW)&&(KEY_MIN_old == HIGH)) { // pokud je k tomu stisnute i tlacitko MIN
ALARM_min = (ALARM_min+1)%60;
}
//----------
} else { // neni stiskle tlacitko S3 tak to bezi jako hodiny
disbuff[0]= hodina/10; // pocet desitek hodin
disbuff[1]= hodina%10; // zbytek po delelni deseti = pocet jednotek hodin
disbuff[2]= minuta/10; // totez pro minuty
disbuff[3]= minuta%10;
display(); // zobrazovani
// NASTAVENI HODIN
if ((digitalRead(KEY_HOD) == LOW)&&(KEY_HOD_old == HIGH)) {
hodina = (hodina+1)%24;
setTime(hodina, minuta, sekunda, den, mesic, rok);
} else
if((digitalRead(KEY_MIN) == LOW)&&(KEY_MIN_old == HIGH)) { // pokud je k tomu stisnute i tlacitko HOD pridej hodinu
minuta = (minuta+1)%60;
setTime(hodina, minuta, 00, den, mesic, rok);
}
}
KEY_SET_old = digitalRead(KEY_SET);
KEY_HOD_old = digitalRead(KEY_HOD);
KEY_MIN_old = digitalRead(KEY_MIN);
}