Re: Uppbyggnad av kod, Arduino
Postat: 9 juni 2015, 00:07:35
Tänk i sekvens, först så händer sak 1, sedan 2 osv.
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Sodjan gav ju ett enkelt exempel på hur man kan avläsa olika kombinationer av de olika ingångarnas status, men det du skriver ger ju intrycket av att du tror att en port är detsamma som en ingång (pinne) på µC. Så är det inte.ludde_018 skrev:Låter intressant
Men hur ska jag kunna läsa av 7 lägesgivare/strömbrytare på en port?
Kan du använda en port till alla ingångar så är det ju lättare att ta hand om resultatet. Du får läsa på om AND, OR, XOR det är dessa du använder för att manipulera de binära värden du får in på porten. Det går givetvis att använda fler än en port, men har du inte mer än 8 givare och en ledig hel port så är det ju enklare.ludde_018 skrev: Senior Lemuren, helt sant! Jag trodde port och pinne var samma sak. Hade ingen koll alls att det funkade så. Där hade man kunnat krymt och effektiviserat koden en hel del. Frågan är, finns det nackdelar att som jag har gjort att läsa från flera pinnar på olika portar?
Kod: Markera allt
#define TAK_UPPE (1<<0)
#define TAK_NERE (1<<1)
#define BAKLUCKA_UPPE (1<<2)
#define BAKLUCKA_NERE (1<<3)
#define CABLUCKA_UTE (1<<4)
#define CABLUCKA_INNE (1<<5)
switch(portData){
case TAK_UPPE|BAKLUCKA_NERE|CABLUCKA_INNE:
//unlockMotor();
printf("Unlock motor\n");
break;
case TAK_UPPE|CABLUCKA_INNE:
printf("Hydraul Motor|Ventil + Motor\n");
break;
case TAK_UPPE|BAKLUCKA_UPPE|CABLUCKA_INNE:
printf("Cabluckemotor\n");
break;
default:
printf("Default, disable everything\n");
break;
}
Kod: Markera allt
int RemoteActiv = 13;
int RemoteOpen = 12;
int RemoteClose = 11;
int RemoteA = 10;
int RemoteB = 9;
int Bryt1 = 31;
int Bryt2 = 32;
int Bryt3 = 3;
int Bryt4 = 4;
int Bryt5 = 35;
int Bryt6 = 36;
int Bryt7 = 37;
int ledPin = 53;
int hydralG= 38; ///1
int hydralR = 39; ///2
int cabluckaU = 40; ///3
int cabluckaI = 41; ///4
int LockL = 43; ///5
int LockO = 42; ///6
int Solinod_fram_AKTIV = 45;
int Solinod_Bak_AKTIV = 45;
void setup() {
pinMode(RemoteActiv, OUTPUT);
pinMode(RemoteOpen, INPUT);
pinMode(RemoteClose, INPUT);
pinMode(RemoteA, INPUT);
pinMode(RemoteB, INPUT);
pinMode(Bryt1, INPUT);
pinMode(Bryt2, INPUT);
pinMode(3,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(Bryt5, INPUT);
pinMode(Bryt6, INPUT);
pinMode(Bryt7, INPUT);
pinMode(RemoteOpen, INPUT);
pinMode(RemoteOpen, INPUT);
pinMode(RemoteOpen, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(hydralG, OUTPUT);
pinMode(hydralR, OUTPUT);
pinMode(cabluckaU, OUTPUT);
pinMode(cabluckaI, OUTPUT);
pinMode(LockL, OUTPUT);
pinMode(LockO, OUTPUT);
pinMode(Solinod_fram_AKTIV, OUTPUT);
pinMode(Solinod_Bak_AKTIV, OUTPUT);
Serial.begin(9600);
Serial.print("STARTAT");
digitalWrite(RemoteActiv, HIGH); // Aktiverar +5 volt till fjärr mottagare
}
void loop() {
int RemoteOpenState = digitalRead(RemoteOpen);
int RemoteCloseState = digitalRead(RemoteClose);
int RemoteAState = digitalRead(RemoteA);
int RemoteBState = digitalRead(RemoteB);
int Cab_Lucka_Ute = digitalRead(3); //Brytare märkt 3, ingång 3
int Cab_Lucka_Inne = digitalRead(Bryt2); //Brytare märkt 32, ingång 32
int Baklucka_Uppe = digitalRead(4); // Brytare märkt 4, ingång 4
int Baklucka_Lockt = digitalRead(Bryt5); //Brytare märkt 35, ingång 35
int Tak_Uppe = digitalRead(Bryt6); //36
int Tak_Nere = digitalRead(Bryt7); //37
////------------------------------------------------------------------------------------------------------------------------------------------------------------
///// START CABBA NER
////------------------------------------------------------------------------------------------------------------------------------------------------------------
if (RemoteOpenState == HIGH)
{
if (Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == LOW && Baklucka_Lockt == HIGH && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(LockO, HIGH);
delay(10);
Serial.println("1");
}
else
{
digitalWrite(LockO, LOW);
}
//// Ovan, bilens tak är på och sekvensen börjar när fjärren används. Enbart upplåsningsmotorerna går tills dess att "Baklucka_Lockt" Är LOW.
//// efter det så aktiveras nedan öppning av bagagelucka
if (Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == LOW && Baklucka_Lockt == LOW && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(LockO, HIGH);
digitalWrite(hydralG, HIGH);
digitalWrite(Solinod_Bak_AKTIV, HIGH);
delay(10);
Serial.println("2");
}
else
{
digitalWrite(LockO, LOW);
digitalWrite(hydralG, LOW);
digitalWrite(Solinod_Bak_AKTIV, LOW);
}
/// Ovan, bilens baklucka öppnas genom att aktivera hyralG samt Solinod BAK. För säkerhetsskull går låsO aktiv.
/// Detta görs fram tills bakluckan ställer sig fullt öppet läge som nedan..
if (Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(cabluckaU, HIGH);
delay(10);
Serial.println("4");
}
else
{
digitalWrite(cabluckaU, LOW);
}
//// Ovan, cabluckan börjar fällas ut när backluckan är fullt öppen (BLÅ/VIT) kabel
if (Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == LOW && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(cabluckaU, HIGH);
delay(10);
Serial.println("5");
}
else
{
digitalWrite(cabluckaU, LOW);
}
/// Ovan gör att cabluckan fortsätter att öppna fast kontakt med "Cablucka inne" bryts..
if (Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(hydralR, HIGH);
digitalWrite(Solinod_fram_AKTIV, HIGH);
delay(10);
Serial.println("6");
}
else
{
digitalWrite(hydralR, LOW);
digitalWrite(Solinod_fram_AKTIV, LOW);
}
////Ovan, cabluckan har nu nått sitt ändläge börjar sänka ner taket..
if (Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == LOW)
{
digitalWrite(hydralR, HIGH);
digitalWrite(Solinod_fram_AKTIV, HIGH);
delay(10);
Serial.println("7");
}
else
{
digitalWrite(hydralR, LOW);
digitalWrite(Solinod_fram_AKTIV, LOW);
}
/// Ovan fortsätter sänka taket trots brytare tak_uppe blir låg. Fortsätter tills det har aktiverat brytaren för tak nere, nedan:
if (Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(Solinod_Bak_AKTIV, HIGH);
digitalWrite(hydralR, HIGH);
digitalWrite(LockL, HIGH);
delay(10);
Serial.println("8");
}
else
{
digitalWrite(Solinod_Bak_AKTIV, LOW);
digitalWrite(hydralR, LOW);
digitalWrite(LockL, LOW);
}
///Ovan börjar sänka backluckan igen..
if (Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == LOW && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(Solinod_Bak_AKTIV, HIGH);
digitalWrite(hydralR, HIGH);
digitalWrite(LockL, HIGH);
delay(10);
Serial.println("9");
}
else
{
digitalWrite(Solinod_Bak_AKTIV, LOW);
digitalWrite(hydralR, LOW);
digitalWrite(LockL, LOW);
}
if (Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == LOW && Baklucka_Lockt == HIGH && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(hydralR, LOW);
Serial.println("10");
digitalWrite(LockL, LOW);
digitalWrite(Solinod_Bak_AKTIV, LOW);
Serial.println("10");
}
///////////////////////////////////////////////////Stänga taket//////////////////////////////////////////////////////////////////
if(RemoteCloseState == HIGH)
{
if(Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == LOW && Baklucka_Lockt == HIGH && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(LockO, HIGH);
delay(10);
Serial.println("11");
}
else
{
digitalWrite(LockO, LOW);
}
/// Ovan, börjar med taket nedfällt, LockO körs tills Baklucka_Lockt blir låg, då startar uppfällningen av bakluckan..
if(Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == LOW && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(LockO, HIGH);
digitalWrite(hydralG, HIGH);
digitalWrite(Solinod_Bak_AKTIV, HIGH);
delay(10);
Serial.println("12");
}
else
{
digitalWrite(LockO, LOW);
digitalWrite(hydralG, LOW);
digitalWrite(Solinod_Bak_AKTIV, LOW);
}
/// Ovan, Uppfällning av baklucka börjar...
if(Cab_Lucka_Ute == HIGH && Cab_Lucka_Inne == LOW && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(cabluckaI, HIGH);
delay(10);
Serial.println("13");
}
else
{
digitalWrite(cabluckaI, LOW);
}
/// Ovan, Bakluckan når sitt ändläge vilket börjar fälla in cabluckan..
if(Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == LOW && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(cabluckaI, HIGH);
delay(10);
Serial.println("14");
}
else
{
digitalWrite(cabluckaI, LOW);
}
/// Ovan, fortsätter fälla cabluckan fast cab_lucka_ute blir LOW
if(Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == HIGH)
{
digitalWrite(hydralG, HIGH);
digitalWrite(Solinod_fram_AKTIV, HIGH);
delay(10);
Serial.println("15");
}
else
{
digitalWrite(hydralG, LOW);
digitalWrite(Solinod_fram_AKTIV, LOW);
}
/// Ovan, när cabluckan nått ändläge börjar taket fällas ut..
if(Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == LOW && Tak_Nere == LOW)
{
digitalWrite(hydralG, HIGH);
digitalWrite(Solinod_fram_AKTIV, HIGH);
delay(10);
Serial.println("17");
}
else
{
digitalWrite(hydralG, LOW);
digitalWrite(Solinod_fram_AKTIV, LOW);
}
/// OVAN FORTSÄTTER FÄLLER UPP TAKET
if(Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == HIGH && Baklucka_Lockt == LOW && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(Solinod_Bak_AKTIV, HIGH);
digitalWrite(hydralR, HIGH);
digitalWrite(LockL, HIGH);
delay(10);
Serial.println("18");
}
else
{
digitalWrite(Solinod_Bak_AKTIV, LOW);
digitalWrite(hydralR, LOW);
digitalWrite(LockL, LOW);
}
/// Ovan, taket är helt uppfällt och bakluckan börjar sänkas..
if(Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == LOW && Baklucka_Lockt == LOW && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(Solinod_Bak_AKTIV, HIGH);
digitalWrite(hydralR, HIGH);
digitalWrite(LockL, HIGH);
delay(10);
Serial.println("19");
}
else
{
digitalWrite(Solinod_Bak_AKTIV, LOW);
digitalWrite(hydralR, LOW);
digitalWrite(LockL, LOW);
}
/// Fortsätter sänka bakluckan då Baklucka_upp blir LOW
if(Cab_Lucka_Ute == LOW && Cab_Lucka_Inne == HIGH && Baklucka_Uppe == LOW && Baklucka_Lockt == HIGH && Tak_Uppe == HIGH && Tak_Nere == LOW)
{
digitalWrite(Solinod_Bak_AKTIV, LOW);
digitalWrite(hydralR, LOW);
digitalWrite(LockL, LOW);
}
}
}
}
Denna idé är väldigt bra, och otroligt enkel att hålla koll på i koden. I min kod till min automatlådestyrning läser jag en port för att hålla koll på mina range-switchar i växellådan och det fungerar väldigt bra, men jag skall ta och implementera en #define på ingångarna som slo föreslår, mest för att lätt hålla koll på koden.slo skrev:Jag skulle #define ingångarna enligt vilken bit i Porten de är anslutna till, läsa in hela porten till en variabel och köra switch på den.Kod: Markera allt
#define TAK_UPPE (1<<0) #define TAK_NERE (1<<1) #define BAKLUCKA_UPPE (1<<2) #define BAKLUCKA_NERE (1<<3) #define CABLUCKA_UTE (1<<4) #define CABLUCKA_INNE (1<<5) switch(portData){ case TAK_UPPE|BAKLUCKA_NERE|CABLUCKA_INNE: //unlockMotor(); printf("Unlock motor\n"); break; case TAK_UPPE|CABLUCKA_INNE: printf("Hydraul Motor|Ventil + Motor\n"); break; case TAK_UPPE|BAKLUCKA_UPPE|CABLUCKA_INNE: printf("Cabluckemotor\n"); break; default: printf("Default, disable everything\n"); break; }
Hej.ludde_018 skrev:Just det, skulle behöva flytta bilen snarast och då cabben står fast i olämpligt läge tänkte jag vara fräck nog att fråga om någon har lust att skumma igenom koden jag har idag. För att se vad som gör att det inte funkar.
Anledningen som sagt är att jag inte kommer hinna lära och skriva helt nytt innan jag bör flytta bilen hem till mig..
Tack och bockKod: Markera allt
...
Kod: Markera allt
struct car_input {
int RemoteOpenState;
int RemoteCloseState;
int RemoteAState;
int RemoteBState;
int Cab_Lucka_Ute;
int Cab_Lucka_Inne;
int Baklucka_Uppe;
int Baklucka_Lockt;
int Tak_Uppe;
int Tak_Nere;
};
struct car_output {
int hydralG;
int hydralR;
int cabluckaU;
int cabluckaI;
int LockL;
int LockO;
int Solinod_fram_AKTIV;
int Solinod_Bak_AKTIV;
};
void getinputs(struct car_input *in)
{
/* I den här funktionen fyller du i alla fälten i variabeln "in". Se till att varje fält har antingen värdet 0 eller 1. */
in->RemoteOpenState = digitalRead(BLA, BLABLABLA);
in->RemoteCloseState = digitalRead(BLA, BLABLABLA);
etc...
}
void setoutputs(struct car_output *out)
{
/* Alla fält i structen out har antingen värdet 0 eller 1. */
digitalWrite(PORTID, out->hydralG);
etc...
}
int main(void)
{
struct car_input input;
struct car_output output;
while(1) {
getinputs(&input);
transform(&input, &output);
setoutputs(&output);
delay(10);
}
}
void transform(struct car_input *in, struct car_output *out)
{
/* Den här funktionen uppdaterar variabeln out, givet innehållet i variabeln in.
Om möjligt, försök att beskriva transformationen i tabellform och inte en
massa if-satser (jobbigt att underhålla). */
/*
Troligtvis kan man identifiera ett dussin tillstånd hos bilen eller delar av den.
*/
enum {
TAK_UPPE,
TAKE_RÖRSIG,
TAK_NERE
};
enum {
LUCKA_ÖPPEN,
LUCKA_STÄNGD
};
int takstate;
int luckstate;
if (in->a & in->c) {
takstate = TAK_UPPE;
} else if (in->d) {
takstate = TAK_RÖRSIG;
} else {
takstate = TAK_NERE;
}
/* Och samma för luckstate. Sedan kan man använda takstate och luckstate för att bestämma utgångarna (out).
Observera att detta förfarande innebär ännu en abstraktionsnivå. Dvs vi jobbar inte med givarnas värde längre. */
/* Givet takstate och luckstate sätter vi nu fälten i out-structen. */
}