Uppbyggnad av kod, Arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

Hej!

Nybörjare på Arduino men har fastnat för det :)

Håller just nu på med ett projekt med 7 ingångar HIGH/LOW inputs

Vid olika kombinationer av dessa så ska en eller flera utgångar av dom 6 möjliga slås på och av.
Om en kombination ändras så ska även resultatet ändras direkt. Om en ej godkänd kombination läses in ska alla utgångar gå ner och bli låga

Så som jag har skrivit så har jag angett varje scenario under en egen "if"..
Det blir mycket kod och jag har inte fått det att lira riktigt som jag vill, finns det smartare vis att skriva? Något man kan ändra eller som är bra att tänka på?

Exemplet nedan har jag i mitt fall upprepat 15 gånger för olika kombinationer..


Tex:
if (a == HIGH && b == HIGH && c == HIGH && d == LOW && e == HIGH && f == LOW && g == HIGH)
{
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
}
else
{
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}




Ha en bra kväll :)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Uppbyggnad av kod, Arduino

Inlägg av sodjan »

Vad är a, b, c o.s.v ?
Är det pinnar på samma port (tex PORTA)?
Kan du inte läsa hela porten o ch sedan jämföra med ett visst värde direkt?

Vad är en "godkänd" resp en "ej godkänd" kombination för något?

Är som i ditt exempel 1110101 en godkänd kobination och allt annat ej godkänt?
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

int A = 3;
int B = 4;



pinMode(A, INPUT);
pinMode(A, HIGH); ////PULL UPP
pinMode(B, INPUT);
pinMode(B, HIGH); ////PULL UPP

void loop

int a = digitalRead(A);
int b = digitalRead(B);


Är som sagt ny på detta och vet inte om det smidigaste sättet är följande.. Men det är exempel ut kopierat ur koden jag skrivit..
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

Bytte ut mina långa och krångliga namn för att det ska bli lättare och se vad jag skrivit. Projektet jag håller på med är att försöka få igång en gammal elcab. Vill ju gärna att rätt motor går enbart när rätt "brytarkombination" inläses.. Lätt att förstöra saker annars..
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Uppbyggnad av kod, Arduino

Inlägg av sodjan »

Ja, alltså... :-)

Enklast är det om alla in-pinnar sitter på samma port, t.ex PORTA.
Du kan du läsa alla ingångar på en gång och testa det som ett
värde för att avgöra vad du ska göra.

Kan de 7 ingångarna vara hög/låg helt oberoende av varandra?
I så fal har du 128 tänkbara kombinationer. Hur "mappar" dessa
mot dina tänkbara "godkända" resp "ej godkända" kombinationer?

Enligt ditt inlägg så har du bara angett 15 olika kombinationer.
Är de övriga kombinationerna inte möjliga alls?

Det saknas på tok för mycket information här.

Vad 17 är det du gör? Vad är Arduinon kopplad till? O.s.v o.s.v....

OK, kom lite mer info där...

> Vill ju gärna att rätt motor går enbart när rätt "brytarkombination" inläses..

Och vad är "rätt" och vad är "fel"?
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

Låter intressant :)

Men hur ska jag kunna läsa av 7 lägesgivare/strömbrytare på en port?

Jag var och köpte mig en Arduino MEGA, transistorer, motstånd, dioder och relän. Då det är en gammal bil där alla elmotorer har dubbla spolar, en för vänster varv och en för högervarv.

Det finns brytare som känner av när bakluckan är öppen(A)/stängd(B) eller inget av det (i rörelse).
När taket är uppe(C) eller nedfällt(D) eller inget av det (i rörelse).
Om bakluckan är låst(E)
Om en täcklucka är öppen(6)/stängd(7) eller inget av det (i rörelse).

Ja, det blir ju egentligen 9 med manöverknapparna Upp/Ner...
Vill ju kunna avbryta och vända en cykel om något skulle bli fel, genom att släppa ena knappen och på den andra knappen..

Det är totalt ca 20 kombinationer som är godkända, har dom uppskrivna men inte här för stunden..


Dålig på att förklara, men hoppas du hänger med lite grann :)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46930
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Uppbyggnad av kod, Arduino

Inlägg av TomasL »

Använd switch case i stället, betydligt enklare att följa.
kodar-holger
EF Sponsor
Inlägg: 970
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Uppbyggnad av kod, Arduino

Inlägg av kodar-holger »

Det finns många genvägar att ta för att få koden mindre, men frågan är om du verkligen vill det....

Till att börja med är det mycket bättre att du ger dina variabler namn som går att förstå. Ex.vis.

Kod: Markera allt

int port_lid_open = 3;
int port_lid_closed = 4;


pinMode(port_lid_open, INPUT);
pinMode(port_lid_cosed, INPUT);

void loop

int lid_open = digitalRead(port_lid_open);
int lid_closed = digitalRead(port_lid_closed);
En annan sak du måste fundera på och förklara för oss är varför en ogiltig kombination av sensorvärden från baklucka skall påverka utgångar för ex.vis takstyrning. Men det kanske är något jag inte förstått.

Nu när jag smakar på dina ord, är det en sekvensiering av en cab du vill göra? I så fall är troligen en tillståndsmaskin något du bör fundera över.
Senast redigerad av kodar-holger 8 juni 2015, 22:39:48, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46930
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Uppbyggnad av kod, Arduino

Inlägg av TomasL »

I så fall är troligen en tillståndsmaskin något du bör fundera över.
Ja exakt, dvs switch case.
typ:

Kod: Markera allt

	switch (PORTA)
	{
		case 1:									
			Do something;
			break;
//------------------------------------------------------------------------------	
	
		case 2:								
 			Do something else;
			break;
//------------------------------------------------------------------------------	
		
		case 4:								
			Do something complete different	;
			break;
//------------------------------------------------------------------------------	
		default:								
			Do something default;
			break;
	}
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

Visst är det så att jag inte nödvändigtvis måste ha koden kortare, men jag tänkte när jag skrev att man måste kunna göra det här på en kompaktare sätt. Nu är dock huvudsaken att jag får det funka.

En tillståndsmaskin låter som något i rätt riktning..

När taket är nedfällt ligger det i bakluckan. Så av den anledningen vill vi veta att bakluckan är fullt öppen innan taket börjar fällas upp eller ner. Så för att inte ha sönder något så vill jag veta att "vägen är fri".

case1 //Låser upp baklucka
case2//Öppnar baklucka
case3//Fäller ut täckplåt
case4//Taket fälls ner
case5//baklucka stängs
case6//låser baklucka

case1 //Låser upp baklucka
case2//Öppnar baklucka
case3//Fäller in täckplåt
case4//Taket fälls upp
case5//baklucka stängs
case6//låser baklucka

Det där med att använda switch case lät mycket trevligt! Är det någon funktionell skillnad mot if som jag skrivit?
Och finns det andra fördelar med den här typen än att det bli överskådligt?

Tusen tack för att ni hjälper till :) Värt mycket :)
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

Funderade lite till och googlar på switch case just nu.. Hur hade ni använt det till applikationen jag pysslar med?

På något sätt måste jag ju veta hur alla brytare står för att veta i vilket case jag är i och vart jag ska fortsätta..

Den där maskinteorin det länkades till var ju smart då den bara tillät rätt lösningar. Kör jag min if variant så kan ju vid fel eller om man kommer åt en lägesgivare komma helt ur fas. Nu är ju inte det särskilt troligt, men jag gillade tanken även om det är överkurs och något jag inte kommer hinna lära mig tills jag vill ha det här igång ;)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46930
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Uppbyggnad av kod, Arduino

Inlägg av TomasL »

Tydligare och enklare kod.

Använder väldigt ofta switch case när olika saker skall hända beroende på en variabels värde.
I 99 % av fallen är variabeln en enum, typ:

Kod: Markera allt

enum status (baklucka_last,baklucka_upplåst, backlucka_oppnar......)
Det hela beror ju på hur du har konfigurerat det hela elektriskt sas.
Men du kan enumrera alla tillstånd, och använda dem i switch-satsen.
Om du till exempel har 8 brytare på en port, så blir det typ så här:

Kod: Markera allt

enum brytare (Brytare0=0,Brytare1=1, brytare2=2, brytare3=4...... osv)
Då använder du:

Kod: Markera allt

switch (brytare)
{
      case Brytare0:
              gör nånting;
              break;
      default:
               förmodligen har något blivit fel;
               break;

}
Det viktiga är att inte glömma "break" och "default"
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

Tackar för tålamodet Ni har!

Dessvärre förstod jag inget av det senaste som skrevs..

Jag beskriver ett par förfaranden så kanske det kan översättas till switch case så jag förstår helheten.


När vi vi börjar är (taket uppfällt)
Tak uppe HIGH
Tak nere LOW
Baklucka Uppe LOW
Baklucka Stängd/låst HIGH
Cablucka ute LOW
Cablucka inne HIGH

Ovan aktiverar lås upp motor

Den första som släppet är baklucka stängd/låst
Tak uppe HIGH
Tak nere LOW
Baklucka Uppe LOW
Baklucka Stängd/låst LOW
Cablucka ute LOW
Cablucka inne HIGH

Ovan aktiverar Hydral motor, hydral ventil, samt ytterliggare en motor. Som tillsammans gör att bakluckan öppnas


Nästa som kommer att hända är att bakluckan når sitt fullt öppna läge och det ser ut såhär:
Tak uppe HIGH
Tak nere LOW
Baklucka Uppe HIGH
Baklucka Stängd/låst LOW
Cablucka ute LOW
Cablucka inne HIGH

Det ska aktivera cabluckans motor
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46930
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Uppbyggnad av kod, Arduino

Inlägg av TomasL »

Du gör ett par olika maskiner, en som fäller ned taket, och en somm fäller upp det.
Sedan får du definiera dina tllstånd på ett vettigt sätt.
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Uppbyggnad av kod, Arduino

Inlägg av ludde_018 »

Aha.. Tänkte inte i banan att dela upp det så..

Får klura lite på den och tacka för all hjälp hittills :)
Ska försöka mig på en switch case ikväll så får vi se hur det funkar med att bryta ner det :)


Tar tacksamt emot fler tips och idéer om någon har något som kan passa!
Skriv svar