Problem med arduino kod (eventuelt hur det är kopplat.)

Trädvy Permalänk
Medlem
Registrerad
Jun 2012

Problem med arduino kod (eventuelt hur det är kopplat.)

Tjena!

Jag fick nyligen en extra uppgift av men elmikro lärare, men jag sitter och har kört fast för stunden. Uppgiften lyder: Olle som är hörselskadad beställer föjande program av dig, Olle vill kunna välja mellan att koka ägg i 8min eller göra en sockerkaka på 20 minuter. Han vill ha två st knappar en för äggkokning samt en för sockerkaka. När han trycker på koka ägg knappen så tänds lysdiod 1, efter 5 minuter börjar den blinka med intervall(4s tänd, 4s släckt). När det återstår en minut av tiden blir intervallen för lysdiod (2s tänd, 2s släckt). När 8 minuter gått så tänds lysdiod 2 och 1 släcks.

När olle istället trycker på knapp2 så ska lysdiod 3 tändas efter 5 min, efter ytterligare 5 min tänds lysdiod 4, efter ytterliga 5 min tänds lysdiod 5, efter ytterliga 5 min tänds lysdiod 6 och då är sockerkakan klar, och samtliga lysdioder, lysdiod 3 till lysdiod 6 lyser.

Jag har bifogat min kod och jag skulle uppskatta all hjälp ni kan erbjuda!

Hoppas alla har en fortsatt bra dag!

int led = 13; int led2 = 12; int led3 = 11; int led4 = 10; int led5 = 9; int led6 = 8; int inpin = 2; int inpin2 = 1; void setup() { pinMode(led, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(inpin, INPUT); pinMode(inpin2, INPUT); //alla out/inputs blir tillsagda vilken roll dom har } void loop() { if(digitalRead(inpin)==LOW) { digitalWrite(led = HIGH); delay(300000); for(int i=0;i<15;i++) { digitalWrite(led, HIGH); delay(4000); digitalWrite(led, LOW); delay(4000) } for(int i=0;i<15;i++) digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW); delay(2000) } digitalWrite(led2, HIGH); // Tänder en led, efter 5 min börjar den blinka med en viss intervall sen börjar den blinka snabbare och tillslut så lyser den för att visa att äggen är klara. } void loop() { //inte helt hundra om det fungerar att ha 2st void loops if(digitalRead(inpin2=LOW)) // Efter 5 minuter tänds en lampa, osv tills det har gått 20 minuter då är alla lampor tända { delay(300000); digitalWrite(led3, HIGH); delay(300000); digitalWrite(led4, HIGH); delay(300000); digitalWrite(led5, HIGH); delay(300000); digitalWrite(led6, HIGH); } }

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Jul 2011

Har du testat att köra programmet? Två loop borde inte fungera, jag är inte helt säker på hur arduino översätter koden men du borde få ett klagomål på att du har en duplicerad funktion.

Jag tycker du ska kika lite på http://playground.arduino.cc/Code/Interrupts det låter en del som en uppgift som är gjord för just det. Då blir lösningen något i stil med att loop bara ligger och väntar på att en knapp trycks in, när det händer så kallar man på respektive funktion som kör rätt sekvens.

Trädvy Permalänk
Medlem
Registrerad
Jun 2012
Skrivet av Vesh:

Har du testat att köra programmet? Två loop borde inte fungera, jag är inte helt säker på hur arduino översätter koden men du borde få ett klagomål på att du har en duplicerad funktion.

Jag tycker du ska kika lite på http://playground.arduino.cc/Code/Interrupts det låter en del som en uppgift som är gjord för just det. Då blir lösningen något i stil med att loop bara ligger och väntar på att en knapp trycks in, när det händer så kallar man på respektive funktion som kör rätt sekvens.

Just det, glömde lägga med felet jag får.

/Users/patricmatsson/Documents/Arduino/sketch_may13a/sketch_may13a.ino: In function 'void loop()': sketch_may13a:27: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)' digitalWrite(led = HIGH); ^ In file included from sketch/sketch_may13a.ino.cpp:1:0: /Users/patricmatsson/Downloads/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:126:6: note: declared here void digitalWrite(uint8_t, uint8_t); ^ sketch_may13a:35: error: expected ';' before '}' token } ^ sketch_may13a:41: error: expected ';' before '}' token } ^ /Users/patricmatsson/Documents/Arduino/sketch_may13a/sketch_may13a.ino: In function 'void loop()': sketch_may13a:46: error: redefinition of 'void loop()' void loop() { //inte helt hundra om det fungerar att ha 2st void loops med samma namn ^ sketch_may13a:23: error: 'void loop()' previously defined here void loop() { ^ exit status 1 too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

Antigen är jag dum nog för att missa något väldigt självklar, eller så är det jag som inte vet hur jag löser felet.

Trädvy Permalänk
Medlem
Registrerad
Jun 2012

Jag fixade alla problem förutom ett. Vilket är att koden i bold körs direkt när man startar programmet. men jag vill att den ska köras efter

for(int i=0;i<15;i++); { digitalWrite(led, HIGH); delay(4000); digitalWrite(led, LOW); delay(4000); } for(int i=0;i<15;i++) digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW); delay(2000); }

Någon idé hur man löser detta?

int led = 13; int led2 = 12; int led3 = 11; int led4 = 10; int led5 = 9; int led6 = 8; int inpin = 2; int inpin2 = 1; void setup() { pinMode(led, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(inpin, INPUT); pinMode(inpin2, INPUT); //alla out/inputs blir tillsagda vilken roll dom har } void loop() { if(digitalRead(inpin)==LOW) { digitalWrite(led, HIGH); delay(300000); for(int i=0;i<15;i++); { digitalWrite(led, HIGH); delay(4000); digitalWrite(led, LOW); delay(4000); } for(int i=0;i<15;i++) digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW); delay(2000); } digitalWrite(led2, HIGH); //detta talar för sig själv. tänder en led, efter 5 min börjar den blinka med en viss intervall sen börjar den blinka snabbare och tillslut så lyser den för att visa att äggen är klara. if(digitalRead(inpin2) == LOW){ delay(300000); digitalWrite(led3, HIGH); delay(300000); digitalWrite(led4, HIGH); delay(300000); digitalWrite(led5, HIGH); delay(300000); digitalWrite(led6, HIGH); } }

Trädvy Permalänk
Medlem
Plats
Märsta
Registrerad
Jan 2002

Felen du har är

rad 27
digitalWrite(led = HIGH);

Här använder du funktionen digitalWrite(); felaktigt. Jämför med hur du gör på alla andra ställen i koden.

rad 34,40
saknar ; efter funktionen

rad 46
void loop() { //inte helt hundra om det fungerar att ha 2st void loops

Det funkar inte att ha 2st void loops

rad 48
if(digitalRead(inpin2=LOW))

Jämför med hur du använder funktionen digitalRead(); på rad 25

Sen är det inte jättesnyggt att skriva med blockerande kod som du gjort. Nu kommer du bara kunna köra en timer i taget.
Om du istället för att använda massa långa delay-funktioner använder micros() funktionen kan du spara tidpunkten för knapptryckningar och sedan tända och släcka dioderna vid rätt tid efter knapptryckningen. Då är din arduino inte låst under långa delay funktioner och kan köra båda timers samtidigt och mer. Men det kanske är överkurs för din skoluppgift.

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Jul 2011

@Matsson82:

digitalWrite(led = HIGH);

Här använder du funktionen fel, digitalWrite vill ha två argument, pinne och värde, byt det mot

digitalWrite(led, HIGH);

På rad 35 och 41 har du glömt att avsluta med ;

Det sista felet som dyker upp är att du definierat loop igen, det går bara att ha en funktion en gång med samma namn.

Som sagt tycker jag att du ska kolla upp interrupts för att lösa detta problem

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Dec 2008

@Matsson82: Det blev lite långt inlägg och om du inte är van att programmera kan det verka jättekrångligt, men vi bryter ned problemet i mindre bitar som är ganska enkla att hantera. Håll ut.

Det sker en del bakom kulisserna i arduino för att underlätta för programmeraren. Tanken är att först anropas setup() och där skall du göra allt som behöver fixas innan du kommer till loop(), precis som du gör. Sedan kommer loop() att anropas igen och igen och igen. Det betyder att det inte är en bra ide att lägga sig i en delay-loop och vänta på att det går 5 minuter. Ingen kommer kolla knappar medan du väntar i loopen.

En annan lösning vore att komma ihåg vilket tillstånd du har och varje gång loop() anropas kollar du om något har ändrats. Det gör att Olle både kan koka ägg och baka sockerkaka på en gång, vilket du skulle ha svårt att hantera med din lösning.

Hur skulle det se ut? Inom datalogin finns det ett begrepp som kallas tillståndsmaskin och din äggkokning passar fint för en sådan. Vi kommer ha ett antal tillstånd: Start => Led1On => Blink4 => Blink2 => Led2On och när vissa saker händer övergår man från ett tillstånd till ett annat. Det här blev en väldigt enkel tillståndsmaskin. Det är bara ett fåtal övergångar och enkel logik för att avgöra om man skall byta tillstånd eller inte.

Så länge du är i Start-tillståndet skall du kolla om någon trycker på knappen. När knappen trycks ner skall du 1) tända dioden 2) komma ihåg när knappen trycktes ner och 3) byta tillstånd till Led1On.

I tillståndet Led1On kolla om det gått 5 minuter eller mer sedan knappen trycktes ned, i så fall släck dioden, kom ihåg när den släcktes och byt tillstånd till Blink4.

I Blink4, kolla om det gått 5 + 3 minuter eller mer sedan knappen trycktes ned, i så fall byt till Blink2. I annat fall kolla om det gått 4 sekunder eller mer sedan dioden tändes/släcktes, i så fall toggla dioden och kom ihåg när.

I Blink2, kolla om det gått 5 + 3 + 1 minuter eller mer sedan knappen trycktes ned, i så fall släck diod1 och tänd diod2 och byt till Led2On. I annat fall kolla om det gått 2 sekunder eller mer sedan dioden tändes/släcktes, i så fall toggla dioden och kom ihåg när.

Din tillståndsmaskin hanterar du enklast med global state-variabel som du initierar i setup() och en switch i loop():

void loop() { switch (state) { case StartState: // Hantera start här break; case Led1OnState: // Hantera LedOn break; // osv } }

Detta gör att varje gång loop anropas kommer du hamna i den koden som hanterar ett visst tillstånd. När det är dags att byta tillstånd sätter du om state till det nya tillståndet och nästa gång loop() anropas kommer du till den koden. Läs på om switch och enum-typer (så du kan få bättre namn på tillstånden än 1, 2 och 3).

För att hantera sockerkaks-timern behövs en liknande tillståndsmaksin, men hur den ser ut och vad du skall göra i de olika tillstånden får du klura ut själv. Tänk igenom allt noga innan du börjar koda. När du tycker att det är dags att börja koda, tänk igenom det en gång till.

Lycka till.