Rekapitulácia:
Ethernet.begin() --> myslím, že najväčší problém si mal tu, napríklad ak vypršala adresa na DHCP, tak už to nedokázalo nastaviť adresu, zvyčajne sa adresa mení po 2 hodinách, ja som si napr všimol, že tá adresa, čo dávam Arduinu napevno, tak ju nie vždy má, niekedy mu to pridelí DHCP, ten proces sa deje zrejme niekde na pozadí.
Kód: Vybrat vše
if (Ethernet.begin(mac) == 0) { //ak nie je nastavena mac adresa, tak ju nastav vratane ip
Ethernet.begin(mac, ip); //tato podmienka opravuje nefunkcne spojenie vramci siete da sa povedat a to tym, že nastavi ip k mac adrese..
}
Ak potrebujem softvérový reset, napríklad mam na webe button, ktorý zmení obsah .txt súboru pre akciu reštartu, tak mam klasické pripojenie na ten subor, podmienku:
Najprv si defingujem funkciu na reštart:
Kód: Vybrat vše
void softReset(){
asm volatile (" jmp 0"); //ak sa zavola, kod skoci na zaciatok za bootloader cast na tzv. aplikacnu (takto som to pochopil)
}
Potom mám už len podmienku, ak je v textovom subore napr "RST", tak zavolám softReset(); --> reštartne to program, nie cele Arduino ako take.
Ak potrebuješ hardvérový reset, ak sa ti to sekne, tak potrebuješ watchdog, nevedel som mu pochopiť, ale veľmi mi pomohol tento jednoduchý príklad:
Kód: Vybrat vše
#include <avr\wdt.h>
void setup() {
Serial.begin(9600);
// set watchdog to 8s
wdt_enable(WDTO_8S);
Serial.println("V setupe");
}
void loop() {
wdt_reset();
digitalWrite(13, HIGH);
Serial.println("ZAP");
delay(10000);
digitalWrite(13, LOW);
Serial.println("VYP");
Serial.println("Dosli sme za vyp");
wdt_reset();
}
Trošku ma mrzí, že to nič o reštarte nevypíše
nejaku hlašku ako napr ESP..
V kóde je knižnica, a watchdog nastaveny na 8 sekund. To znamená, že ak do 8 sekund nereštartuješ watchdog, (aby jeho hodnota nepresiahla 8 sekund), tak potrebuješ volať wdt_reset. Nakoľko ale mám za zapnutou diódou 10 sekund delay, tak nám watchdog reštartuje dosku, ak si otvoríš serial monitor, tak uvidíš iba výpis: V setupe a ZAP, do VYP, respektíve Dosli sme za vyp sa kód nedostane.
Ak by sme však chceli, aby to fungovalo a reštartovalo dosku iba pri zamrznutí, použili by sme:
Kód: Vybrat vše
#include <avr\wdt.h>
void setup() {
Serial.begin(9600);
// set watchdog to 8s
wdt_enable(WDTO_8S);
Serial.println("V setupe");
}
void loop() {
wdt_reset();
digitalWrite(13, HIGH);
Serial.println("ZAP");
for(int i=0; i<=4; i++){
delay(2000);
wdt_reset();
}
digitalWrite(13, LOW);
Serial.println("VYP");
Serial.println("Dosli sme za vyp");
wdt_reset();
}
A nakoľko mi millis nejde, tak s tým ti neporadím.. Keď ja využívam nejaké časové eventy, urobím to v php
a Arduino si vždy stiahne iba ZAP/VYP pre dany vystup atď, respektíve dá výpis podľa toho, čo si prečíta.
Ten watchdog by mal byť funkčný na akékoľvek Arduino. Pred 3 týždňami som ho implementoval pre projekt, kde pánovi mrzlo Arduino a vyžadovalo sa, aby to bežalo 24/7. Tretí týždeň a kľud, vravel, že to resetuje cca 1-2x denne. Takže je to funkčné