Arduino programmerings frågor.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av orvar-e »

Försöker förstå det ni säger. Oavsett vad man kallar void rutinen så kan den inte ta emot eller lämna variabel.
När man läser av en ingång i void en rutin, det är ingen variabel eller??

Istället för att skriva void minrutin() så kan jag skriva boolean minrutin() eller int minrutin(). Men då måste minrutin deklareras i början av koden?

En fråga till för att stöka till det ytligare, hur gör man för att skapa ett pulståg utan att använda delay, tex 500 millisekunder på och 500 millisekund av?

Jag har inte programmerat nått innan så ha tålamod med mig. :)
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino programmerings frågor.

Inlägg av Icecap »

XXX Rutinnamn(YYY)

Då är YYY vad man skickar TILL rutinen så den har att jobba med. Det kan vara en pekare, ett värde eller liknande.

När rutinen sedan har gjort sitt jobb kan den låtsas vara ett värde (XXX).

Men om man skriver void som angivelse som endera eller båda värde betyder det 'ingenting'.

Så att läsa en portpinne i en rutin har inget med dessa värden till/från en rutin att göra.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino programmerings frågor.

Inlägg av sodjan »

> När man läser av en ingång i void en rutin, det är ingen variabel eller??

Om du har en rutin/funktion som av någon anledning ska "returnera" ett värde
så kan man i princip göra det på två olika sätt.

1. Via ett returvärde :

Kod: Markera allt

integer MinRutin(void);
{
  do something;
  return someting;
}

value = MinRutin();
2. Via en global variabel:

Kod: Markera allt

integer value1;

void MinRutin(void);
{
  do something;
  value1 = something;
}

MinRutin()
; Variabeln value1 innehåller nu värdet från MinRutin...
Det första exemplet brukar föredras...

Det första brukar vara att föredra.
Användarvisningsbild
Digitum
Inlägg: 153
Blev medlem: 9 februari 2006, 17:19:59

Re: Arduino programmerings frågor.

Inlägg av Digitum »

Orvar-e: här får du lite kod. Jag garanterar inte att den fungerar då jag inte har tillgång till hårdvaran.

Som motprestation vill jag ha en kort beskrivning av koden så att jag vet att du förstått vad den gör och varför .
Jag lovar att du lär dig mycket på det. :D

Kod: Markera allt

#include <LiquidCrystal.h>

int dMsg = 0; // Meddelande som skall visas, ändras av valfri funktion.
int cMsg = 0; // Meddelandet som just nu visas, ändras och läses endast av displayRefresh().
              // 0 = blank skärm
              // 1 och över är olika meddelanden

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);      

const int pinBlink = 10;

boolean btnStatus = false; // Anger knappens status vid senaste avläsningen, debouncat och klart. Läser inte ingången direkt då den kan vara störd.

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  pinMode(pinBlink, INPUT);
} 

void loop() {
  if(checkButton()) {
    dMsg = (btnStatus?1:0); // Visa meddelande 1 om knappen är intryckt, annars meddelande 0
    displayRefresh(); // Uppdatera displayen
  }

   // Gör annat vettigt här i stället för att slösa bort den på delay();
}

void displayRefresh()
{
   // Blinkfrekvens 1Hz, 50% dutycycle
   if(millis()%1000<500) {
      // % (modulo) returnerar resten av en division, dvs tusentalet i detta fall. 
      // Displayen skall vara tom under denna del av sekunden
      if (cMsg > 0) {  // Om den inte är det, blanka den nu
         cMsg = 0;
         lcd.clear();
      }
   } else {
      // Displayen skall visa ett meddelande under denna del av sekunden, om sådant finns
      if(cMsg != dMsg) {
         // Om inte rätt meddelande visas så skall meddelandet ändras, annars är det bara att låta det vara
         cMsg = dMsg;
         lcd.clear(); // Flyttade clear hit då det kanske blir rester kvar annars, kolla om det funkar.
         if (cMsg > 0) { // Meddelande 0 är blankskärm
            cMsg = 0;
         }
         if(cMsg = 1) {
            lcd.setCursor(5,0);
            lcd.print("Larm!");
            lcd.setCursor(3,1);
            lcd.print("High level!");
         }
         //... Osv. Allra bäst är det om du lägger textsträngarna i en array i stället och definierar dessa i början på programmet, Då kan du spara in några byte minne.
      }
   }
}


boolean checkButton()
{
   // Funktionen returnerar true om förändring har skett.
   // Tänk på att en debouncer kanske måste läggas till
   // Notera utropstecknen för 'not' (!)
   if(digitalRead(pinBlink) && !btnStatus) {
      btnStatus = true;
      return true;
   }
   if(!digitalRead(pinBlink) && btnStatus) {
      btnStatus = false;
      return true;
   }
   return false;
}
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av orvar-e »

Stort tack Digitum för den tid du lagt ner på koden .... :)

Jag kan inte påstå att jag förstår allt eller all sammanhang, men jag ska försöka bryta ner det så får du väl rätta och fylla i.

Till void loop(){ förstår jag nog. Men den här strängen ..... dMsg = (btnStatus?1:0), vad betyder frågetecken och 1:0, är det nån slags över gång 1 till 0 på btnStatus man kollar där. Som du skrev i kommentaren.

Så när knappen trycks så körs void displayRefresh() {.
if(millis()%1000<500) { är också lite klurig, tyvärr så märker jag inte av den på hårdvaran tror jag. Displayen blinkar iaf inte, eller är den till för nån toggel funktion?

if (cMsg > 0) {
cMsg = 0;
lcd.clear()
;
Man sätter alltså lcd.clear() om cMsg är noll. Lär mig också här att det inom klammerparentes eller engelska curly brackets är det som ska utföras/hända, i detta fall lcd.clear()

if(cMsg != dMsg) {
cMsg = dMsg;
lcd.clear();
if (cMsg > 0) {
cMsg = 0;

Det här förvirrar, if(cMsg != dMsg) okej och sedan gör man cMsg = dMsg;


Och sista raderna ser mest ut som en toggel funktion i mina ögon som kommer att växla btnStatus fram och tillbaka (om man slapp kontakt studs).
Användarvisningsbild
Digitum
Inlägg: 153
Blev medlem: 9 februari 2006, 17:19:59

Re: Arduino programmerings frågor.

Inlägg av Digitum »

Nja. Jag har säkert missat något då jag inte provkört koden själv.

if(millis()%1000<500)

mills() returnerar systemklockan i millisekunder sedan starten. Den rullar runt ungefär vart 50e dag. Genom att ta ut resten från en division av denna med 1000 så får vi reda på var i sekunden vi är i tid just nu. Är det första halvsekunden (under 500ms) så görs det ena, annars den andra.

Enkla villkorssatser där man bara skall tilldela ett värde till en variabel eller motsvarande så kan man korta den:
if(nåntingärsant) {
varibel = ettvärde;
// Körs när villkoret ovan är sant
} else {
varibel = ettannatvärde;
// Körs när villkoret ovan inte är sant
}

kan kortas ned till
varibel = (nåntingärsant ? ettvärde : ettannatvärde);
Alltså:
dMsg = (btnStatus?1:0)
Displayrefresh() behöver ju bara köras när det faktiskt skall ändras något på skärmen, annars är det ju onödigt att köra det. cMsg innehåller information om nuvarande meddelande. dMsg innehåller information om det meddelande som faktiskt skall visas. Alltså behöver vi ju endast köra uppdateringen om cMsg inte är samma som dMsg, kan skrivas som villkoret cMsg != dMsg (cMsg ej lika med dMsg). Då både displayen och minnet är samma nu så anger vi det med cMsg = dMsg.

F ö, jag är lite såsig i huvet nu, men det kanske är fel i denna sats:

Kod: Markera allt

         if (cMsg > 0) { // Meddelande 0 är blankskärm
            cMsg = 0;
         }
         if(cMsg = 1) {
            lcd.setCursor(5,0);
            lcd.print("Larm!");
            lcd.setCursor(3,1);
            lcd.print("High level!");
         }
Skall nog vara

Kod: Markera allt

         if(dMsg > 0) {
            lcd.setCursor(5,0);
            lcd.print("Larm!");
            lcd.setCursor(3,1);
            lcd.print("High level!");
         }
orvar-e skrev:Och sista raderna ser mest ut som en toggel funktion i mina ögon som kommer att växla btnStatus fram och tillbaka (om man slapp kontakt studs).
Njae, titta igen och försök att följa vad som händer om knappen trycks in resp släpps och vad som händer i olika faser. Vad som händer är att funktionen returnerar true endast om en förändring av knappens status har skett sedan senaste kontrollen. Själva värdet som knappen har returneras dock inte av funktionen utan skrivs direkt till btnStatus-variabeln.

En debouncer skulle kunna fungera så att du ändrar lite på checkButton)=-funktionen, så att den mäter tiden mellan nedtryckning (första villkoret) och uppsläpp (andra villkoret) genom att först lagra tiden när knappen trycktes ned i en uint64_t och sedan subtrahera med tiden när knappen släpptes upp. Om resultatet överstiger ett visst antal millisekunder så kan du returnera true, annars false. Gläm då inte av det omvända om det behövs. Värdet på själva knapptryckningen lagras som vanligt i btnStatus. Titta på funktionen millis() för att hålla koll på tiden.

F ö så tycker jag det är rätt kul att leda folk till lärande. Jag lär mig en del på det också...
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av orvar-e »

Svårt det här :) .
Tänkt beställa arduino for dummis för att kanske börja från nån slags början och lära mig i steg för steg.

Digitum ... jag uppskattar din inställning med lärandet, men jag måste nog ha mer kött på bena för att kunna tillgodo se mig det.
Förresten har du provat din kod på hårdvara så att du är säker på att den fungerar som du tänkt rent praktiskt??
Om inte så är mitt tips att göra det.
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av Miramithe »

Jag har boken "getting started whit arduino" lite matnyttigt från blinka LED till nätverks styrd belysning. Även förklaring på tecken och allt sådant. Troubleshooting mm. Du kan få den om du vill.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av orvar-e »

Jag tar gärna hand om den. :)
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av Miramithe »

PMa adress så får du den till postlådan. :)
Användarvisningsbild
ensten
EF Sponsor
Inlägg: 3759
Blev medlem: 19 oktober 2004, 15:55:20
Ort: Hudiksvall

Re: Arduino programmerings frågor.

Inlägg av ensten »

Ibland älskar jag det här forumet! :tumupp:
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av orvar-e »

Döm av min förvåning igår när min kära sambo tömt postlådan på vägen hem från bussen och hon har "Getting Started With Arduino" boken i handen. Och hon frågar om jag redan skickat efter en sån där arduino bok. Nää svara jag, men ...... då trillade polletten ner. Miramithe är Borlänge bo, jag hade skickat PM om adress uppgifter ca 3 timmar tidigare. Så där ligger tom Farnell och electrokit i lä när det gäller snabbhet. :lol:

Ett Stort Tack, igen.
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av Miramithe »

Varsågod igen. Roligt att det var samma stad så man kunde lämna av den är vi ändå skulle handla.
Bra tråd det här oxå, extra intressant när man befinner sig ungefär lika i sin egen utveckling med microkintroller.
Thumbs up
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Arduino programmerings frågor.

Inlägg av vfr »

ensten skrev:Ibland älskar jag det här forumet! :tumupp:
Shysst leverans!
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino programmerings frågor.

Inlägg av orvar-e »

Gud vad bara det är att bli farsa, man måste ju ta det lugnt och näst intill se när den lille sover. Och då kan man lika gärna pilla med sin arduino som man aldrig skulle ha ro att sitta still och pilla med annars. Så nu har det gått 7 veckor sedan den lilla kom hem och jag har hunnit med mer än nånsin. :)
Gäller också att passa på innan lillkillen börjar få fler vaken timmar. Det bästa är att frugan tycker att min barnpassning är helt okej. :)

Jag har precis gjort färdig ett program för att styra farsans pelletsbrännare, ja inte lika super avancerad som enstens precis. Mer som en lite bättre termostat där man kan med hjälp av en display och knappar knappa in vid vilken pann-temperatur brännaren ska starta och vid vilken temperatur den ska stanna. Kanske skulle haft en övervakning att brännaren inte är igång när arduinon säger att rätt temperatur är upp nådd.
Blir en tråd om detta snart.......

Min fundering är hur använder man lcd.clear(); utan delay. Jag gillar inte delay lätt att knapptryckningar försvinner när den ligger till så jag använder millis() istället på alla ställen där tider på nått sätt är inblandat.
Det verkar inte som lcd.clear(); behövs, ändå så används den i exemplen.

PS: Jag är färdig med boken så jag skickar den gärna vidare till nån annan som behöver lite hjälp i början.
Skriv svar