Pořád říkám:"Když opisuješ, opisuj aspoň pozorně!"
Jsou věci, které ve sketchi nelze vynechat. Mimo jiné k nim patří nezbytná část:
Kód: Vybrat vše
void setup() {
// put your setup code here, to run once:
}
Část programu, kterou níže přikládám, nezahrnuje vlastní odeslání hlášení, protože ti minimálně chybí nějaká knihovna, snad nějaká virtual wire. Tudíž úplně přesně nevím, co s tímhle:
Kód: Vybrat vše
vw_send((uint8_t *)hlaseni, strlen(hlaseni));
vw_wait_tx();
- ty řádky jsou možná správné, možná ne, opravdu bez hlubšího kontextu nevím.
zbastleny kod, ktery moc nefunguje
je sice vcelku přesné vyjádření, ale jaksi v něm chybí potřebné detaily.
Tady je můj návrh:
Kód: Vybrat vše
#include <interval.h> // knihovna pro periodicke deje
#define SENSOR 8 // definice pinu na kterem je senzor
#define LEDINT 13 // definice pinu s interni LED
#define SENSORPERIOD 100 // perioda cteni sensoru PIR je 100ms=0.1s
#define WAITPERIOD 10000 // doba cekani na odeslani druheho hlaseni je 10000ms=10s
bool controller = false; // priznak akce z PIR detektoru
unsigned char hlaseni[] = "Je tam!"; // zde je mozne nastavit odesilany retezec
Interval ReadSensor; // instance pro opakovane cteni sensoru
Interval WaitForResend; // instance pro zpozdeni opakovaneho vysilani
void setup() {
pinMode(SENSOR, INPUT); // nsatveni vystupu
pinMode(LEDINT, OUTPUT);
}
void loop() {
// pokud vyprsel cas a necekas na druhe odeslani, tak precti sensor
if (ReadSensor.expired() && !controller) {
ReadSensor.set(SENSORPERIOD); // obnov nastaveni periody cteni sensoru
if (digitalRead(SENSOR) == HIGH) {// Pokud je akce PIR
digitalWrite(LEDINT, HIGH); // rozsvit interni LED
controller = true ; // nastav priznak
// vw_send((uint8_t *)hlaseni, strlen(hlaseni));
// vw_wait_tx();
WaitForResend.set(WAITPERIOD);// nastav pro jednou periodu opakovaneho vysilani
}
}
// Pokud vyprsel cas do druheho odeslani a je to treba
if (WaitForResend.expired() && controller == true ) {
controller = false ; // zrus priznak akce PIR
// vw_send((uint8_t *)hlaseni, strlen(hlaseni));
// vw_wait_tx();
digitalWrite(LEDINT, LOW);// zhasni LED
}
}
Ten sketch funguje tak, že periodicky 10x za sekundu čte stav pinu 8. V okamžiku kdy se na něm objeví stav HIGH, tak by se mělo odeslat první hlášení. Ale protože tomu chybí nějaká ta tvoje knihovna, tak se jen rozsvítí LED na Arduinu a spustí se časování pro druhé odeslání. To by mělo nastat za 10s, ale zase se nic nestane, jen ta LED na Arduinu zase zhasne. To si můžeš vyzkoušet, pokud máš připojen senzor, i bez odesílání, já použil tlačítko. Periodu čtení senzoru i dobu prodlevy mezi opakovaným vysíláním si v záhlaví sketche snadno nastavíš. Pokud v době mezi přijetím prvního alarmu a odesláním druhého hlášení přijde další alarm/alarmy, tak jsou prostě ignorovány. Knihovnu Interval nalezneš třeba zde
https://github.com/Pablo2048/Interval