Arduinohjälp. olydiga variabler

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Electricguy
Inlägg: 12479
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Arduinohjälp. olydiga variabler

Inlägg 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);
  }
 }
}
Användarvisningsbild
Icecap
Inlägg: 26629
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduinohjälp. olydiga variabler

Inlägg av Icecap »

Kod: Markera allt

    {
    case 'H':     
      relayVal1 ^= 1; // xor current value with 1 (causes value to toggle)
      break; // ESSENTIELL!!!   
    case whatever:
      break;
kodar-holger
EF Sponsor
Inlägg: 968
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Arduinohjälp. olydiga variabler

Inlägg 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.
Användarvisningsbild
Electricguy
Inlägg: 12479
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: Arduinohjälp. olydiga variabler

Inlägg 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..
Användarvisningsbild
Electricguy
Inlägg: 12479
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: Arduinohjälp. olydiga variabler

Inlägg 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);
 }
Nerre
Inlägg: 27184
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Arduinohjälp. olydiga variabler

Inlägg 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"....
Användarvisningsbild
Electricguy
Inlägg: 12479
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: Arduinohjälp. olydiga variabler

Inlägg av Electricguy »

Du fattar precis! :D
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.
Användarvisningsbild
Icecap
Inlägg: 26629
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduinohjälp. olydiga variabler

Inlägg 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;
  }
Senast redigerad av Icecap 2 september 2014, 10:17:37, redigerad totalt 1 gång.
Nerre
Inlägg: 27184
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Arduinohjälp. olydiga variabler

Inlägg 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.
ronnylov
Inlägg: 987
Blev medlem: 23 februari 2012, 12:06:19
Ort: Borås

Re: Arduinohjälp. olydiga variabler

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduinohjälp. olydiga variabler

Inlägg 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.
kodar-holger
EF Sponsor
Inlägg: 968
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Arduinohjälp. olydiga variabler

Inlägg 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.
ronnylov
Inlägg: 987
Blev medlem: 23 februari 2012, 12:06:19
Ort: Borås

Re: Arduinohjälp. olydiga variabler

Inlägg 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å.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduinohjälp. olydiga variabler

Inlägg 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... :-)
hizzle
Inlägg: 13
Blev medlem: 15 september 2014, 13:00:33

Re: Arduinohjälp. olydiga variabler

Inlägg 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.
Skriv svar