Hej Ivan,
Ja, jeg ved heller ikke hvad du vil gøre ... det siger din beskrivelse ikke
Og her kan du se det første trin du er nødt til at tage fat på et blank papir og skriv 3 til 6 linjer med hvad der skal ske. (Mine eksempler her er fri fantasi)
- Check om der er gået 5 minutter siden sidst, blink med grøn LED, med mindre noget af nedenstående er sket.
- Hvis PIR er ON så tænd rød LED, men ikke hvis sensor A er aktiv.
- Hvis PIR er OFF og sensor B måler mindre end "20" i 3 minutter så blink med rød LED.
Så forfiner men det.
Udvid sætningerne med lidt flere detaljer om hvad der skal måles, grænseværdier, hvor lang tid er "et blink" osv. Du skal ikke tænke på programmeringen endnu. Du kan dog tænk på hvordan sensoren giver data og hvordan man får et "rent" signal. (Her tænker jeg på f.eks. kontakt bounce, analog jitter/spikes. Den slags kan løses enten i software eller med mere elektronik.)
Du bliver ved med pøse lidt detaljer på i et par omgange. Der kan godt være nogle "Pile" mellem sætningerne, som f.eks. at udførsel af linje 2 skal "registreres" af linje 1.
Hvis det bliver for rodet så begynd forfra - dit første sæt var ikke en god beskrivelse af rimeligt selvstændige begivnheder.
--
Når du har den slags design færdig kan vi begynde lave det maskin venligt. Med lidt held er hver linje et lille selvstændigt modul. Skriv i detalje (uden at tænke på C-syntaksen) hvordan trinet udføres. Sådan her er "halvvejs" i detaljering.
Læs PIR værdi analog (3 gange med gennemsnit)
Hvis værdi > forrige værdi+20 kald det "ON".
Læs Sensor A.
Hvis Pir-ON og SensorA-On tænd Rød Led, start timer.
Hvis timer > 700 msec sluk Rød LED
Nu kan man begynde at skrive lidt kode. Et modul for hver linje. Et modul må ikke blive "hængende", det må ikke sidde i en løkke med at vente på en kontakt åbner/lukker. Hvis kontakten er forkert, så gør ikke aktionen (tænde LED). Om lidt kommer du tilbage til samme modul og kan gentage testen. delay() er netop sådan en løkke der venter. Derfor må den ikke bruges. Det er det som Blink-LED-without-delay forsøger demonstrere. Se også Arduino Playground - HomePage
For hvert modul vil der være nogle ting der skal gemmes til næste gang man kommer til modulet (timers, f.eks) eller en variabel som læses af et andet modul. De skal have en "start" tilstand eller steup, og det noterer du skal gøres i setup().
Din loop() kode skal helst kun af kalde alle 4-6 moduler på rad og række. Ingen if/then eller andet. Logikken for at holde styr på timers og blink er jo inde i hvert modul, og de antaglien få interaktioner gøres ved der skrives i de fælles variabler.
--
Ja, alt meget nemt for mig at skrive. Jeg har gjort det i 40+ år med diverse afstikker og pauser. Det vigtige er at du ikke tænker kode og C-syntaks før du har beskrevet opgaven; først grovt, og så trinvis forfine det. Hvis du tænker "her skal sensoren læses i en for-løkke... nej en while-løkke" inden du er enig med dig selv om hvordan den passer ind i helheds billedet, så bliver det spaghetti-kode der kun virker sommetider.
Der er nogle der søger/googler efter kode der "næsten" gør det de vil og så hamrer de på det med cut-n-paste indtil de kompilerer. Somme tider virker det men de ved ikke hvorfor, og derfor er det meget frustrende at arbejde videre med det.
--
Det der State motor er et af mange "skabeloner" man kan bruge i kodning. Hvis din detalje beskrivelse er detaljeret nok, så ender du nok op med en "state motor" uden at vide at det er det du har. Der er ikke så meget magi i det
Hvis man ved det er en state motor så kan man tilrette udseendet af koden så det fremgår mere tydeligt.
Forsat god lyst til dit projekt!