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

Permalänk
Medlem

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(""); } }

Permalänk
Medlem

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.

Permalänk
Medlem

Hmm okej!

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

Permalänk
Inaktiv

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å

Permalänk
Medlem

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.

Permalänk
Datavetare

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.

Visa signatur

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

Permalänk
Medlem

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

Visa signatur

Dator:Ryzen 9 3900X, MSI B450 Tomahawk, 16 GB Ram, RTX 2070 Super.
Kameror: Panasonic G80, Canon G7xmk2 Gopro Hero7 black mm.
www.youtube.com/c/ronniejossan