Hjälp med Arduino programmering. Klarar inte if satser ens...

Trädvy Permalänk
Medlem
Registrerad
Apr 2016

Hjälp med Arduino programmering. Klarar inte if satser ens...

Hej på er!

Jag har precis börjat programmera och det är svårt men jag antar utmaningen

Jag ska göra en robot som jag ska aktivera genom att skriva kaffe eller tassimo så ska den göra olika saker.
Vad har jag gjort fel? det står att den ska funka men det gör den inte. den tar inte IF satsen.

Finns den någon vänlig själ som kan hjälpa mig?

tack på förhand

#include <Servo.h> String program; Servo myservo; //servon void setup() { myservo.attach(7); Serial.begin(9600); } void loop() { Serial.println("Sag ett program (kaffe eller tassimo)"); while (Serial.available()==0) { //medans den väntat på svar så händer inget } program = Serial.readString(); //läs från porten if (program == "kaffe") { myservo.write(160); delay(3000); myservo.write(20); delay(2500); myservo.write(160); delay(1000); myservo.write(20); delay(4000); for(;;){/*empty*/} } if (program== "tassimo") { myservo.write(140); delay(3000); myservo.write(50); delay(2500); myservo.write(160); delay(1000); myservo.write(20); delay(4000); for(;;){/*empty*/} } if ( program != "kaffe" && program != "tassimo") { Serial.println(""); Serial.println("Finns inget sadant program, prova igen"); Serial.println(""); } }

Trädvy Permalänk
Medlem
Registrerad
Mar 2016

Skulle tippa på att du låser tråden i och med att du kör en while-loop som aldrig blir klar.. Dvs. koden under din while kommer aldrig exekveras.

Du behöver nog fundera på att antingen lägga loopen i en annan tråd eller skriva om koden så att dina if-ar ingår i while-loopen.

Trädvy Permalänk
Medlem
Registrerad
Apr 2016

Hmm okej!

@huff: Ska jag flytta while till setup istället?

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Feb 2006

Du skulle kunna börja med att skriva ut texten du har i program variabeln, så får du veta var du är i koden och om du har något att "iffa" på

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

readString terminerar på en timeout, som kan sättas med setTimeout och som standard är en sekund. D.v.s. du måste skriva in kommandot på mindre än en sekund för att det ska fungera.

Du kan använda readStringUntil istället, som terminerar när den hittar ett givet tecken eller på timeout. Så du kan använda t.ex. readStringUntil('\n') för att läsa in allt till nästa nyradstecken, och sätta timeout till en lämpligt lång tid så att du hinner skriva in kommandot.

Du kan även använda read istället, och läsa in byte för byte. Se t.ex. denna sida som visar hur man kan göra.

Det är för övrigt inget fel på din while-loop, den kommer att terminera när Serial har data tillgängligt för att läsa precis som kommentaren säger.

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

Du måste hela tiden låta loop() köra igenom helt och hållet, i stället för att göra saker blockande får man titta vilka saker som hänt sedan sist.

Här är ett skelett till ditt program som jag tror gör vad du vill

String cmd; void setup() { Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } } void loop() { bool gotCmd = false; if (Serial.available() > 0) { char lastChar = Serial.read(); if (lastChar == '\n') { gotCmd = true; } else { cmd += lastChar; } } if (gotCmd) { if (cmd == "kaffe") { Serial.println("kaffedax"); } else if (cmd == "tassimo") { Serial.println("tassimo time!"); } else { Serial.println("vet inte vad '" + cmd + "' är"); } cmd = ""; } }

Detta program kollar om ett nytt tecken har kommit in via serieporten, om så är fallet konkateneras det tecknet till namnet på uppgiften som man vill utföra. När man ser ett radslut, '\n', anser man att ett helt kommando lästs in och man kan agera på det.

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Medlem
Plats
Jönköping
Registrerad
Dec 2004

Dum fråga kanske men är det i RAPID?

Acer Predator I17 hemma. Lenovo W540 i jobbet. DJI Phantom 3 i luften.
Samsung Galaxy S7 edge i handen. Fru och 2 barn i hjärtat.