Arduino telnet script voor opdrachten
In dit voorbeeld gaan we gebruik maken van de USB en seriële poort van de Arduino, eigenlijk is het een soort van TELNET functie om de Arduino aan te sturen.
Ik heb bedacht om met een # (hekje) te werken, deze geeft aan de Arduino aan wanneer het commando compleet is om daarop een actie uit te voeren, bijvoorbeeld het aan en uit zetten van het ledje op digitale poort 13 (zit op elke Arduino).
In het voorbeeld hieronder kun je via de seriële monitor commando’s sturen naar de Arduino:
aan# = LED AAN
uit# = LED UIT
tekst# = print “Hallo Wereld#”
Als je bijvoorbeeld iets hebt ingetikt zonder hekje, dan werkt het volgende (juiste) commando’s uiteraard niet omdat de seriele buffer nog steeds gevuld wordt TOTDAT er een HEKJE is, Het is aannemerlijk dat je het commando dan 2x moet versturen, de 1ste keer om de buffer leeg te maken en de 2e om het uit te voeren! (je kan ook altijd beginnen met een # voordat je het uiteindelijke commando verzend)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
int ledPin = 13; String inputString = ""; // een variabele om binnenkomende data vast te houden. boolean stringCompleet = false; // geeft aan wanneer het commando compleet is. void setup() { Serial.begin(9600); // zet de seriele poort aan op 9600 baud. inputString.reserve(64); // reserveer 64 bytes (maximale bufferlengte van de arduino) voor de variabele inputString } void loop() { // als de string compleet is (aangegeven door een # (hekje)) wat te doen? if (stringCompleet) { if (inputString == "aan#") { // Commando "aan#" ontvangen via de RX. digitalWrite(ledPin, HIGH); // Zet de LED AAN. } if (inputString == "uit#") { // Commando "uit#" ontvangen via de RX. digitalWrite(ledPin, LOW); // Zet de LED UIT. } if (inputString == "tekst#") { // Commando "tekst#" ontvangen via de RX. Serial.write("Hallo Wereld#"); // print "Hallo Wereld#" terug via TX. } inputString = ""; // Maak de string weer leeg voor nieuwe ontvangst. stringCompleet = false; // Reset de trigger. } } /* SerialEvent treedt op wanneer er een nieuwe data binnen komt op de RX. Deze routine wordt uitgevoerd tussen elke time loop(). Een vertraging binnen deze loop kan het process in het algemeen vertragen. Er kunnen meerdere bytes aan data beschikbaar zijn. */ void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); // lees een binnenkomende byte in. inputString += inChar; // voeg het karakter toe aan de binnenkomende data (inputString). // als een inkomende karakter een hekje is, geef door dat het commando compleet is. // en zet de vlag stringCompleet op waar zodat de main loop er wat mee kan doen! if (inChar == '#') { stringCompleet = true; // zet de vlag dat het commando compleet is. Serial.flush(); // maak de seriele buffer leeg. } } } |