Hjälp med kod Arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Hjälp med kod Arduino

Inlägg av EonX »

God dag!

Jag har fått supermycket bra hjälp här och nu har jag stött på nästa problem, kan säkerligen vara superenkelt för er som begriper att fixa de.

Det jag val uppnå är följande:

När jag trycker på en knapp skall en diod (ledPin2) lysa. dock vill jag att den skall vara beroende av om en annan diod(ledPin1) lyser eller ej.
ledPin1 är i detta fall prioriterad och ledPin2 skall altid lysa tillsammans med denna. Men om ledPin1 är släkt skal ledPin2 styras av en knapp.

Här är den koden jag har nu som gör att jag kommer närmast min lösning. Dock släcks inte ledPin2 när knappen släpps(när ledPin1 är släckt).
ledPin2 tänds tidigare i koden då den skal lysa samtidigt med ledPin1.

{
if (buttonState4 == HIGH)
digitalWrite(ledPin2, HIGH);
if (buttonState4 == LOW and ledPin1 == LOW)
digitalWrite(ledPin5, LOW);
}

Tacksam för lösningar.
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Hjälp med kod Arduino

Inlägg av Klas-Kenny »

I koden du postat här så släcker du ledPin5, inte 2...
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino

Inlägg av EonX »

Sorry fel, ska så klart va ledPin2 på sista raden me


{
if (buttonState4 == HIGH)
digitalWrite(ledPin2, HIGH);
if (buttonState4 == LOW and ledPin1 == LOW)
digitalWrite(ledPin2, LOW);
}
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Hjälp med kod Arduino

Inlägg av Klas-Kenny »

Jag förmodar att ledPin1 är numret på den utgången där led1 sitter?
Så du jämför alltså tex ledPin1=3 med LOW=0, vilket alltid kommer att vara falskt.

I just detta fall bör det kunna fungera fint med att bara göra

Kod: Markera allt

if (buttonState4 == HIGH)
   digitalWrite(ledPin2, HIGH);
if (buttonState4 == LOW && digitalRead(ledPin1) == LOW)
   digitalWrite(ledPin2, LOW);
Det är inte alltid rekommenderat att läsa tillbaka en utgång på det viset, då det under vissa omständigheter kan bli felaktigt. Men här lär det nog fungera finfint.

För övrigt, använd gärna code-taggar

Kod: Markera allt

[code]/*din kod*/
[/code] när du postar kod, blir mycket mer läsbart.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino

Inlägg av EonX »

Tackar för det snabba svaret Klas-Kenny, det fungerar alldeles ypperligt.

Vad kan man få för problem med att använda en wright som read? eller ja, som jag i detta fal gör?
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Hjälp med kod Arduino

Inlägg av Klas-Kenny »

Det som händer är att man läser vad som faktiskt *finns* på utgången, inte vad du skrivit att utgången ska vara.

Så, om man tex. får en kortslutning till jord på utgången, då kommer den alltid att läsas låg även om du skrivit att den ska vara hög.
Eller om man har en stor kapacitiv last på utgången och läser tillbaka den *precis* efter att man satt ett nytt läge på den, så kan det också bli fel. Med mera.

Sättet man gör för att undvika detta är att ha ett så kallat skuggregister, helt enkelt att du använder variabler för att hålla koll på vilket läge du satt utgången till.
Så du kunde ha tex. en variabel som heter ledPin1State, och varje gång du sätter ledPin1 hög så skriver du även 1 till den variabeln. Och vice versa. Sen använder du den variabeln för att hålla koll på vad du sist satte utgången till.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hjälp med kod Arduino

Inlägg av SeniorLemuren »

Det där med skuggregister vill jag minnas att jag lärde mig förr i tiden när jag höll på med PIC16FXX. men att det senare när jag började använda PIC18FXX blev överflödigt. Portarna hanterades i stället av ett LAT-register.

Bara för att inte röra till det för frågeställaren så får man nog väcka frågan om detta problem inte bara var ett Microchips problem, som inte existerar på andra kretsar.

Länk:
Uppföljarna till PIC16F-kretsarna, PIC18-kretsarna har
inbyggt stöd för att undvika problemet (LAT-register),
så RMW-problemet får nog betraktas som en
”konstruktionsmiss” från Microchips sida.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino

Inlägg av EonX »

Eran lösning fungerar alldeles utmärkt när jag skriver den för att lösa ut uppgiften där förutsättningen är som i mitt exempel.

När jag provar tillämpa den lite "tvärt om" så får jag det inte att fungera.

Kod: Markera allt

/
//Övervakning och återstart om flamman slocknar
{
if (digitalRead(ledPin1) == LOW && (buttonState2 == LOW))
  digitalWrite(ledPin2, LOW);
else
  digitalWrite(ledPin2, HIGH);
 }
/
Det jag här vill uppnå är att buttonState2 skall styra ledPin2 men bara om ledPin1 är låg. När jag kör denna kod så tar ledPin2 bara hänsyn till ledPin1 och tar inte alls hänsyn till läget på buttonState2.

Vad gör jag för fel?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hjälp med kod Arduino

Inlägg av sodjan »

Vad händer om du skriver (lade till ett par parenteser):

Kod: Markera allt

{
if ((digitalRead(ledPin1) == LOW) && (buttonState2 == LOW))
  digitalWrite(ledPin2, LOW);
else
  digitalWrite(ledPin2, HIGH);
 }
Notera också att (i alla fall med normal optimering) då man har ett
villkor som (A && B) så kommer B aldrig att kollas om A är "false".
Finns ju ingen anledning eftersom det inte spelar någon roll vad B är.
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino

Inlägg av EonX »

Tyvärr ingen skillnad på funktionen.

Jag är med på den där A && B, I detta fall kommer den ju då alltid att läsa ledPin1 först, och är det värdet inte true hoppar den vidare. Som det verkar när jag kör detta bryr den sig inte om B (buttonState2) utan låter A (ledPin1) styra hela tiden.
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Hjälp med kod Arduino

Inlägg av Klas-Kenny »

Hur är buttonState2 definierad?
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino

Inlägg av EonX »

Jag använder buttonState2 tidigare i programmet och då fungerar den rätt.

men det jag har med innan ang den är:

const int buttonPin2 = 3; // FLAMMVAKT

int buttonState2 = 0;

pinMode(buttonPin2, INPUT);

buttonState2 = digitalRead(buttonPin2);

Jag ursäktar min okunskap men är det detta du frågar efter?

Kan ju tillägga att om någon har någon bättre lösning på hur jag skall åstadkomma samma sak är det givetvis välkommet
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Hjälp med kod Arduino

Inlägg av Klas-Kenny »

Du svarade utmärkt på min fråga. :)

Där emot gjorde det inte att jag har någon förklaring. Så som du beskriver, borde fungera. :humm:
EonX
Inlägg: 48
Blev medlem: 11 januari 2010, 23:36:56

Re: Hjälp med kod Arduino

Inlägg av EonX »

Hmm då är det ju väldigt märkligt.

jag kör ju en sekvens som ser ut på liknande sätt som fungerar:

Kod: Markera allt

/{
if (buttonState4 == HIGH)
  digitalWrite(ledPin5, LOW);
if (buttonState4 == LOW && digitalRead(ledPin1) == HIGH)
  digitalWrite(ledPin5, HIGH);
 }/
Här läser jag in en write som en read och det funkar kanon.

Finns det något annat sätt att lösa mot problem, i praktiken är signalen ledPin1 aktiveringen av en fläkt/bränslepump och är således en signal som säger att systemet i drift.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Hjälp med kod Arduino

Inlägg av Janson1 »

Bör det inte vara hakparanteser (heter dom så) efter if-satsen? Ex if(buttonstate4==HIGH) { digitalWrite(ledpin5, LOW); }
Nu är jag inte säker på att dom alltid behövs men jag har alltid dom oavsett...
Skriv svar