Založen: Oct 28, 2007 Příspěvky: 88 Bydliště: Násedlovice
Zaslal: so duben 06 2024, 8:23 Předmět: Kukačky na ESP32, DFPlayer, TM1637
Ahoj kamarádi, chci vás požádat o pomoc s konstrukcí kukaček.
Původní konstrukce, kterou jsem s úspěchem dokončil je tady [url]
https://www.youtube.com/watch?v=TgJOAbc9RYI&list=PL86H7PGdidG24-BVlMwpDwnPHoLAF5V6d&index=14[/url] .
Ta mi ale nevyhovovala, protože nelze nastavit čas manuálně. Čas se u každých takových hodin za nějakou dobu předbíhá nebo je o něco pozadu.
A když je změna času na zimní nebo na letní, tak tady to nenastavíte.
Proto jsem se rozhodl migrovat na ESP32 a načítat čas z NTP. Po pár víkendech se mi to podařilo s pomocí kamaráda a zdejšího uživatele "hafca" rozchodit.
Musel jsem na ESP32 program trochu upravit, ptorože jak víte, UNO/NANO se chová trochu jinak.
Hodiny běží a DFPlayer hraje, jenže nepřetržitě přehrává dvě zakukání. Už mě nenapadá co bych mohl udělat. Proto se obracím na vás zkušenější.
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
const char* time_zone = "CET-1CEST,M3.5.0,M10.5.0/3"; // TimeZone rule for Europe/Prague including daylight adjustment rules (optional)
// PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("No time available (yet)");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
//display.clear();
display.setBrightness(3);
int hrs = timeinfo.tm_hour;
int mins = timeinfo.tm_min;
int sec = timeinfo.tm_sec;
int time = hrs*100 + mins;
display.showNumberDecEx(time, 0b11100000);
delay(1000);
display.showNumberDec(time);
delay(1000);
}
// Callback function (get's called when time adjusts via NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
Serial.println();
Serial.println(F("Zkouška DFPlayer ... (může to trvat 3-5 sekund)"));
if (!myDFPlayer.begin(MySerial)) { //Připojování k softwaru Serial pro komunikaci s mp3.
Serial.println(F("1.Zkontrolujte připojení k přehrávači!"));
Serial.println(F("2.Vložte nebo zkontrolujte kartu!"));
while(true){
delay(0); // Kód pro kompatibilitu s ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
myDFPlayer.volume(25); // nastavte hlasitost od 0 do 30
delay(5000);
myDFPlayer.EQ(DFPLAYER_EQ_BASS); // Ekvalizér BASS
// set notification call-back function
sntp_set_time_sync_notification_cb( timeavailable );
/**
* NTP server address could be aquired via DHCP,
*
* NOTE: This call should be made BEFORE esp32 aquires IP address via DHCP,
* otherwise SNTP option 42 would be rejected by default.
* NOTE: configTime() function call if made AFTER DHCP-client run
* will OVERRIDE aquired NTP server address
*/
sntp_servermode_dhcp(1); // (optional)
/**
* This will set configured ntp servers and constant TimeZone/daylightOffset
* should be OK if your time zone does not need to adjust daylightOffset twice a year,
* in such a case time adjustment won't be handled automagicaly.
*/
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);
/**
* A more convenient approach to handle TimeZones with daylightOffset
* would be to specify a environmnet variable with TimeZone definition including daylight adjustmnet rules.
* A list of rules for your zone could be obtained from https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
//configTzTime(time_zone, ntpServer1, ntpServer2);
//connect to WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
myDFPlayer.volume(20);
Ty tam máš globální proměnné hrs, mins a sec, podle kterých pouštíš ty mp3. Jenže do nich nikde nic nepíšeš. V té funkci printLocalTime() máš deklarované lokální hrs, mins a sec, které ty globální překryjí. Takže bych tu funkci printLocalTime() předělal takhle:
kód:
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("No time available (yet)");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
//display.clear();
display.setBrightness(3);
hrs = timeinfo.tm_hour;
mins = timeinfo.tm_min;
sec = timeinfo.tm_sec;
int time = hrs*100 + mins;
display.showNumberDecEx(time, 0b11100000);
delay(1000);
display.showNumberDec(time);
delay(1000);
}
Stejně si ale myslím, že to bude kukat jen někdy (bude to vynechávat).
To mě nepřekvapuje. Ty totiž v té funkci printLocalTime() máš dva příkazy delay(1000), takže skončí až za dvě sekundy. Takže každé dvě sekundy se koukne, jestli má kukat. Takže když máš smůlu, tak se koukne v 59 a pak až 01 sekund, takže nezakuká.
Takže bych obě ty zpoždění v printLocalTime() zkrátil na třeba delay(100). Pak by to mělo kukat pokaždé.
Zase ale bude asi rychleji blikat dvojtečka, nebo co to má dělat. Každopádně bych to zkusil.
Založen: Oct 28, 2007 Příspěvky: 88 Bydliště: Násedlovice
Zaslal: so duben 06 2024, 17:05 Předmět:
Tak to funguje jak má. Od 15:45h do 18:00h, kdy to sleduji, to oznámilo každou čtvrthodinu i celou hodinu tak jak má. Moc dík "asdf"!!!
Ještě mám ale jeden dotaz. Když odpojím ESP32 od napájení a pak zase připojím, tak musím zmáčknout RST na ESP, aby se to rozběhlo. Jak to udělat, aby se hodiny rozběhly hned a sami po připojení napájení?
PS: Omlouvám se. Teď už to funguje i po připojení napájení.
Ještě jedno veliký dík!!!
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.