Sida 1 av 1
Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 09:24:09
av Electricguy
Då var man igång igen..
Denna gången så snickrar jag på en kod som tar emot seriell data och togglar digitala pinnar av och på, med samma kommando.
Det fungerar jättebra med bara en utgång, men när jag lägger till fler så "kolliderar" variablerna och den första i switch caset triggar den andra, både av och på. Dock går den andra att styra som det ska. Så det ska till någon form av avdelare i switch caset som gör att dom inte kommer åt varandra. Jag har testat med "break;" och det fungerar inte. (Jag antar att jag måste lägga if/else satserna i ett void för att det ska gå)
Jag har även flyttat runt variablerna, testat olika typer av variabler osv.
Här har vi koden:
Kod: Markera allt
void setup()
{
pinMode(3, OUTPUT); //pin 3 as output
pinMode(2, OUTPUT); // pin 2 as output
Serial.begin(9600); // open serial
}
int relayVal1 = 0; //state variable
int relayVal2 = 0; //state variable
void loop()
{
int cmd;
while (Serial.available() > 0)
{
cmd = Serial.read(); //read serial, put into variable
switch (cmd) // switch case that reads from variable cmd
{
case 'H':
relayVal1 ^= 1; // xor current value with 1 (causes value to toggle)
case 'J':
relayVal2 ^= 1; // xor current value with 1 (causes value to toggle)
if (relayVal1) // reads variable, controls digital pin accordingly
digitalWrite(3, HIGH);
else
digitalWrite(3, LOW);
if (relayVal2) // reads variable, controls digital pin accordingly
digitalWrite(2, HIGH);
else
digitalWrite(2, LOW);
}
}
}
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 09:30:03
av Icecap
Kod: Markera allt
{
case 'H':
relayVal1 ^= 1; // xor current value with 1 (causes value to toggle)
break; // ESSENTIELL!!!
case whatever:
break;
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 09:31:16
av kodar-holger
Du verkar inte ha avslutat switch-satsen före if heller. Så med bara break så kommer du inte in i if i första fallet.
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 09:43:12
av Electricguy
Jaa, fast när jag lägger till break och avslutar switch caset på "traditionellt" sätt så slutar allting att fungera. Jag ska testa att lägga if else satsera i ett par voids och se vad det gör..
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 09:52:13
av Electricguy
Ja se där. Voids verkar vara lösningen. Jag hade hoppats att slippa det för att göra koden kompaktare, men är det ett måste så är det bara så
Kod: Markera allt
void setup()
{
pinMode(3, OUTPUT); //pin 3 as output
pinMode(2, OUTPUT); // pin 2 as output
Serial.begin(9600); // open serial
}
int relayVal1 = 0; //state variable
int relayVal2 = 0; //state variable
void loop()
{
int cmd;
while (Serial.available() > 0)
{
cmd = Serial.read(); //read serial, put into variable
switch (cmd) // switch case that reads from variable cmd
{
case 'H':
relay1(); // go to void
break;
case 'J':
relay2(); // go to void
break;
}
}
}
void relay1() {
relayVal1 ^= 1; // xor current value with 1 (causes value to toggle)
if (relayVal1) // reads variable, controls digital pin accordingly
digitalWrite(3, HIGH);
else
digitalWrite(3, LOW);
}
void relay2() {
relayVal2 ^= 1; // xor current value with 1 (causes value to toggle)
if (relayVal2) // reads variable, controls digital pin accordingly
digitalWrite(2, HIGH);
else
digitalWrite(2, LOW);
}
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 09:57:47
av Nerre
Det känns lite som "jag vet inte vad jag pysslar med men om jag gör lite annat som jag inte fattar så verkar det funka"....
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 10:00:13
av Electricguy
Du fattar precis!
Man får väl ursäkta så mycket att man inte en fena på programmering. Man måste ju börja någonstans.
Ursäkta om det stör dig att alla inte kan allt.
Hur som helst verkar problemet vara löst, för tillfället.
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 10:03:50
av Icecap
Men snälla, dessa tillägg av funktionskall kan möjligen göra koden lättare att läsa men de har ingen betydelse annars. Skillnaden är att du numera har "break;" med.
I en switch kommer koden i den aktuella case att köra fram till break!
Kod: Markera allt
switch(Select)
{
case 0:
// Do something if Select == 0
break; // Här "hopps" det ur switch'en
case 1:
case 2:
case 10:
// Do something if Select == 1, 2 or 10
break; // Här "hopps" det ur switch'en
case 3:
// Do something if Select == 3
// OBS: ingen "break;" här!
case 4:
// Do this if Select == 3 or 4
break; // Här "hopps" det ur switch'en
default:
// här kör koden för alla andra värden av Select än dom som det finns case för
break;
}
Re: Arduinohjälp. olydiga variabler
Postat: 2 september 2014, 10:08:23
av Nerre
Menade inte att det stör mig, men som jag ser det finns ju inget som helst problem med att flytta in koden för de där void-funktionerna till platsen där funktionsanropet är. Eller lägga if-satserna efter switch-satsen. Så att det började funka när du gjorde sådär måste helt enkelt bero på nåt annat.
Gå igenom koden och räkna klamrar ordentligt och justera intendeteringen så det verkligen syns tydligt så tror jag att du får det att funka med samma grundkod som i början.
Re: Arduinohjälp. olydiga variabler
Postat: 3 september 2014, 12:52:02
av ronnylov
Ska man inte alltid ha de funktioner man anropar skrivna (eller åtminstone deklarerade) innan anropet?
Tänker på att funktionerna relay1() och relay2() kommer efter funktionen loop() medans de anropas ifrån loop().
När jag lärde mig C runt 1990 så lade man alltid main() sist just av den anledningen.
Men det kanske inte spelar någon roll längre?
Re: Arduinohjälp. olydiga variabler
Postat: 3 september 2014, 13:03:19
av sodjan
Lite osäker här, men jag har för mig att bearbetningen i Arduino IDE't
kommer att dynamiskt skapa .h filer som har delarationerna för
funktionerna. Så kompilatorn kommer sedan att få "rättad" kod.
Re: Arduinohjälp. olydiga variabler
Postat: 3 september 2014, 13:06:00
av kodar-holger
Det spelar absolut fortfarande roll om man programmerar i ren C/C++. Men nu är det här C/C++ med arduino-miljö.
För filer som heter .ino (tror jag det är) så körs en automatiskt h-filsgenerering före ordinarie kompilering. Så i detta fall måste inte saker stå i en viss ordning.
Sen kan jag tycka att man ändå bör göra saker i rätt ordning för plötsligt upptäcker man att arduino-miljön inte är så optimal och att då gå till en annan miljö kan ge mer huvudvärk än man räknat med.
Re: Arduinohjälp. olydiga variabler
Postat: 3 september 2014, 16:02:13
av ronnylov
Jaha, jag förstod inte att Arduino inte är ren C-miljö, ser väldigt likt ut C tycker jag.
Fast kompilatorn hade väl kanske gett någon varning om det inte hade gått att göra så.
Re: Arduinohjälp. olydiga variabler
Postat: 3 september 2014, 17:09:40
av sodjan
Det är i princip C, det hela handlar ju bara om vad du gör med koden,
och det ser du ju inte på själva koden...

Re: Arduinohjälp. olydiga variabler
Postat: 11 oktober 2014, 18:13:21
av hizzle
Electricguy,
Det ser ut som om du behöver få lite bättre grepp om
syntax,
block och
funktioner för att bli en effektiv programmerare.
Som någon skrev så programmerar man en Arduino med
C, och till sin hjälp har man även mjukvarubiblioteket
Wiring och Arduinos bootloader. Bootloadern ser till att de fördefinierade funktionerna
setup() och
loop() anropas. Först
setup() och sedan
loop() om och om igen tills strömmen bryts. Wiring innehåller mycket annat smått och gott, som de förträffliga hjälpfunktionerna
analogWrite()/
digitalRead() till exempel.
Arduino.cc's egna referens är utmärkt att vända sig till om man är osäker.
http://arduino.cc/en/Reference/HomePage
Det låter lite som om du pratar om
viod som om det vore en typ av funktion. Men det är det inte. Void betyder ungefär "ingenting". Syntaxen kräver att innan sitt metodnamn ska man definiera vilken typ som metoden returnerar. Till exempel
int eller
string. Void använder man när man inte vill att sin funktion ska returnera någonting alls.
Kod: Markera allt
int returnFive() {
// den här metoden svarar med siffran fem
return 5;
}
void returnNothing() {
// Den här metoden svarar inte med något
}
Angående block: Det verkar nästan som när man tittar på din kod att du har kodat en del
Python. I Python bestäms nämligen blocken utifrån indentering. Så är det inte i C utan där använder man måsvingar. Eller för case block när man använder nyckelordet break (eftersom hela switch-satsen är ett "måsvinge"-block).
Om du inte anger break efter ett case kommer arduinon fortsätta att köra koden hela vägen till switch-satsens egna blockslut. Det kan man ha nytta utav i bland men det gäller att ha tungan mitt i mun.
Titta gärna på
http://arduino.cc/en/Reference/SwitchCase
Jag rekommenderar att du använder måsvingar oftare än du behöver för att hålla koll på dina block. Så även för if-satser med bara en kodrad borde du använda dem.
Här står mer
http://arduino.cc/en/Reference/Braces
Kod: Markera allt
if (someValue == 1) {
// Om someValue är lika med 1
} else {
// Om someValue är allt annat än 1
}
En processor gör exakt som man säger till den, så det gäller att veta vad det är man säger. Den kommer aldrig tänka, han borde mena såhär, och göra så istället.
Hoppas detta var till någon hjälp. Men framförallt. Vänd dig till Arduino.cc's dokumentation. Den är utmärkt.