Behydro Skrevet 17. april 2012 Del Skrevet 17. april 2012 (endret) Har holdt på en stund nå med å lage lys styring i heimen og tenkte at det var vel på tide å legge opp litt her og få litt feedback og tips på kodingen. Morroa begynte med at jeg kjøpt en MultiTrx fra mr. Skagemo http://skagmo.gotdns...trx_productpage https://www.diskusjon.no/index.php?showtopic=1269805&view=findpost&p=16373715 Han har laget egen server og interface men jeg ville gjøre det litt anerledes, nemlig ha en Arduino som tar seg av alle auto funksjoner, routing og interface mot Android. Jeg kan og skrive kode men jeg er ingen programmerer, derfor gjør jeg sikkert ting litt tungvint og ikke på letteste måte, men forum er jo en perfekt måte å få feedback og tips på. Så langt har jeg styring på: spot stue, lampe stue, akvarium, trapp til kjeller, trapp til loft, bad og soverom. Skal snart få fikset kjøkken og utelys. Jeg har ikke funnet opp kruttet på nytt, men hentet ideer og kode fra andre som pusler med det samme og tilpasset det mitt eget bruk. På HW siden så har jeg som sagt en MultiTrx som kommuniserer med div Nexa og Wavemann utstyr, samt en Esic temp transmitter. Dette er koblet til en laptop som bridger com port til ethernet port. Jeg har bestilt ethernet shield slik jeg får vekk helt laptopen og telefonenen kommuniserer direkte med Arduinoen, en Nano som står der nå, kan hende den blir byttet ut med en 2560. På telefonene så kjører jeg DomoticHome, ennå orginal software men jobber på å tilpasse den. http://www.domotichome.net/ Denne siden autogenererer koden til Arduino, flott utgangspunkt å bygge videre på. Har møtt litt veggen nå, koden begynner å opprøre seg litt rart og jeg misstenker at jeg bruker for mye ram. En av de tingene jeg ser er at Serial.print failer ofte, spesiellt i "GET /?out=all" Så langt har jeg kommet meg unna problemet ved å kjøre Serial.print fra EEPROM men for å løse problemet tror jeg må gå vekk i fra å definere telegramene som string og bare sette de rett i koden.... Hvis ikke noen andre har en bedre løsning Er masse rusk i koden og en del test funksjoner men det er no normalt i et prosjekt under utvikling #include &--#60;SoftwareSerial.h&--#62; #include &--#60;LiquidCrystal.h&--#62; //const char hellostr[] PROGMEM = "{\"ip\" : \"192.168.2.248\", \"devices\" : [{ \"type\" : \"light\", \"name\" : \"TV Stue\", \"out\" : \"30\"},{ \"type\" : \"light\", \"name\" : \"Spise stue\", \"out\" : \"31\"},{ \"type\" : \"Plug\", \"name\" : \"Sofalampe\", \"out\" : \"32\"},{ \"type\" : \"Plug\", \"name\" : \"Tusle\", \"out\" : \"33\"},{ \"type\" : \"Plug\", \"name\" : \"Fiskane\", \"out\" : \"34\"},{ \"type\" : \"light\", \"name\" : \"Kjeller\", \"out\" : \"35\"},{ \"type\" : \"gate\", \"name\" : \"Stue25%\", \"out\" : \"40\"},{ \"type\" : \"gate\", \"name\" : \"Stue50%\", \"out\" : \"41\"},{ \"type\" : \"gate\", \"name\" : \"Stue75%\", \"out\" : \"42\"},{ \"type\" : \"gate\", \"name\" : \"Stue100%\", \"out\" : \"43\"},{ \"type\" : \"gate\", \"name\" : \"Godnatt\", \"out\" : \"44\"}]}"; SoftwareSerial mySerial(6, 7); //6 TX fra kontroller til MultiTRX LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //********************Variables******************** int day = 1; int bevegelseLoft1 = 0; int bevegelseLoft2 = 0; int bryterLoft = 0; String readString = String(30); char p_buffer[80]; #define P(str) (strcpy_P(p_buffer, PSTR(str)), p_buffer) //********************Adresses******************** //Test char testOn[] = "$N16349B2021"; char testOff[] = "$N16349B2020"; //Dusk/dawn sensor char fotocelleOn[] = "$N13D60E2091"; //Natt, lys på char fotocelleOff[] = "$N13D60E2090"; //Dag, lys av //PIR utenfor inngansparti char bevegelseInngangspartiOn[] = "0"; char bevegelseInngangspartiff[] = "0"; //Soverom stort Waveman char soveromStortOn[] = "$WB021"; char soveromStortOff[] = "$WB020"; //Bad loft char badLoftOn[] = "$N1670FD2091"; char badLoftOff[] = "$N1670FD2090"; //Trapp loft -&--#62; Hovedetasje software ID char swTrappLoftHovedOn[] = "$N1A536C2091"; char swTrappLoftHovedOff[] = "$N1A536C2090"; char swTrappLoftHovedDim25[] = "$N1A536C20924"; char swTrappLoftHovedDim50[] = "$N1A536C20928"; char swTrappLoftHovedDim75[] = "$N1A536C2092C"; char swTrappLoftHovedDim100[] = "$N1A536C2092F"; //PIR Loft gang char bevegelseTrappLoftHovedOppeOn[] = "$N1B4C2A2091"; char bevegelseTrappLoftHovedOppeOff[] = "$N1B4C2A2090"; //PIR Trapp loft -&--#62; Hovedetasje char bevegelseTrappLoftHovedNedeOn[] = "$N1B536C2091"; char bevegelseTrappLoftHovedNedeOff[] = "$N1B536C2090"; //Tv stue dimmer char tvStueOn[] = "$N1B714220B1"; char tvStueOff[] = "$N1B714220B0"; char tvStueDim25[] = "$N1B714220B24"; char tvStueDim50[] = "$N1B714220B28"; char tvStueDim75[] = "$N1B714220B2C"; char tvStueDim100[] = "$N1B714220B2F"; //Spise stue dimmer char spiseStueOn[] = "$N1B714220A1"; char spiseStueOff[] = "$N1B714220A0"; char spiseStueDim25[] = "$N1B714220A24"; char spiseStueDim50[] = "$N1B714220A28"; char spiseStueDim75[] = "$N1B714220A2C"; char spiseStueDim100[] = "$N1B714220A2F"; //Lampe bak sofa char lampeBakSofaOn[] = "$N157C852001"; char lampeBakSofaOff[] = "$N157C852000"; //Lys Skilpadde akvarium char lysSkilpaddeOn[] = "$N157C852011"; char lysSkilpaddeOff[] = "$N157C852010"; //Lys Fisk Akvarium char lysFiskOn[] = "$N157C852021"; char lysFiskOff[] = "$N157C852020"; //Trapp hovedetasje -&--#62; kjeller char trappHovedKjellerOn[] = "$WB011"; char trappHovedKjellerOff[] = "$WB010"; //********************Transmitters******************** //Esic temp sample //$E1,1,4.4,44,0 //Nexa remote 1 /* 1: OFF $N157C852000 ON $N157C852001 Lampe bak sofa 2: OFF $N157C852010 ON $N157C852011 Skilpadde akvarium 3: OFF $N157C852020 ON $N157C852021 Fiske akvarium */ //Nexa remote 2 /* 1: OFF $N16349B2000 ON $N16349B2001 Lampe bak sofa 2: OFF $N16349B2010 ON $N16349B2011 Skilpadde akvarium 3: OFF $N16349B2020 ON $N16349B2021 Fiske akvarium All off: $N16349B2100 */ boolean n = false; void setup() { digitalWrite(6, LOW); pinMode(13, OUTPUT); Serial.begin(9600); mySerial.begin(9600); lcd.begin(20, 4); lcd.setCursor(0, 0); lcd.print("MultiTRX"); pinMode(10, INPUT); } void loop() // run over and over { serialReader(); androidInterface(); //serialEcho(); //force(); //test(); } void test(){ if (digitalRead(10) == true) { n = true; } else { n = false; } if (n == true) { mySerial.println(lampeBakSofaOn); } else { mySerial.println(lampeBakSofaOff); } delay(5000); } /*void force () { digitalWrite(13, HIGH); mySerial.println("$N16349B2021"); delay(2000); digitalWrite(13, LOW); delay(1000); }*/ /* void serialEcho (){ if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.println(Serial.read()); } */ void serialReader(){ int makeSerialStringPosition; int inByte; char serialReadString[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; const int terminatingChar = 10; //Terminate lines with CR inByte = mySerial.read(); makeSerialStringPosition=0; if (inByte &--#62; 0 && inByte != terminatingChar) { //If we see data (inByte &--#62; 0) and that data isn't a carriage return delay(100); //Allow serial data time to collect (I think. All I know is it doesn't work without this.) while (inByte != terminatingChar && mySerial.available() &--#62; 0){ // As long as EOL not found and there's more to read, keep reading serialReadString[makeSerialStringPosition] = inByte; // Save the data in a character array makeSerialStringPosition++; //Increment position in array //if (inByte &--#62; 0) Serial.println(inByte); // Debug line that prints the charcodes one per line for everything recieved over serial inByte = mySerial.read(); // Read next byte } //Serial.println(inByte); if (inByte == terminatingChar) //If we terminated properly { serialReadString[makeSerialStringPosition] = 0; //Null terminate the serialReadString (Overwrites last position char (terminating char) with 0 //Serial.println(serialReadString); //lcd.clear(); lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print(serialReadString); //********************Dusk/Dawn flagg******************** if (strcmp(serialReadString, fotocelleOff) == 0) { day = 1; lcd.setCursor(0, 1); lcd.print("Fotocelle Dag"); //Serial.println("Fotocelle Dag"); } if (strcmp(serialReadString, fotocelleOn) == 0) { day = 0; lcd.setCursor(0, 1); lcd.print("Fotocelle Natt"); //Serial.println("Fotocelle Natt"); } //********************Trapp loft -&--#62; Hovedetasje******************** if (strcmp(serialReadString, bevegelseTrappLoftHovedOppeOn) == 0) { bevegelseLoft1 = 1; loftTrapp(); } if (strcmp(serialReadString, bevegelseTrappLoftHovedOppeOff) == 0) { bevegelseLoft1 = 0; loftTrapp(); } if (strcmp(serialReadString, bevegelseTrappLoftHovedNedeOn) == 0) { bevegelseLoft2 = 1; loftTrapp(); } if (strcmp(serialReadString, bevegelseTrappLoftHovedNedeOff) == 0) { bevegelseLoft2 = 0; loftTrapp(); } /* if (bevegelseLoft1 + bevegelseLoft2 &--#62; 0) { if (day == 0) { mySerial.println(swTrappLoftHovedDim50); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 50%"); //Serial.println("Trapp LH ON 50%"); } if (day == 1) { mySerial.println(swTrappLoftHovedDim75); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 75%"); //Serial.println("Trapp LH ON 75%"); } } if (bevegelseLoft1 + bevegelseLoft2 &--#60; 1) { if (bryterLoft == 0) { mySerial.println(swTrappLoftHovedOff); lcd.setCursor(0, 1); lcd.print("Trapp LH Off"); } if (bryterLoft == 1) { mySerial.println(swTrappLoftHovedDim25); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 25%"); } } */ //********************Lesing av ute temp******************** if (strncmp(serialReadString, "$E1,1,4.4,44,0", 5) == 0) { lcd.setCursor(0, 3); lcd.print("Ute temp: "); if (strncmp(serialReadString, "$E1,1,4.4,44,0", 7) == 0) { for(int x = 0; x &--#60; 3; x++) { lcd.print(serialReadString[x + 6]); //Serial.print(serialReadString[x + 6]); } lcd.print("C "); //Serial.print("C "); for(int x = 0; x &--#60; 2; x++) { lcd.print(serialReadString[x + 10]); //Serial.print(serialReadString[x + 10]); } lcd.print("%"); //Serial.println("%"); } else { for(int x = 0; x &--#60; 4; x++) { lcd.print(serialReadString[x + 6]); //Serial.print(serialReadString[x + 6]); } lcd.print("C "); //Serial.print("C "); for(int x = 0; x &--#60; 2; x++) { lcd.print(serialReadString[x + 11]); //Serial.print(serialReadString[x + 11]); } lcd.print("%"); //Serial.println("%"); } } } delay(20); } } void loftTrapp () { if (bevegelseLoft1 + bevegelseLoft2 &--#62; 0) { if (day == 0) { mySerial.println(swTrappLoftHovedDim50); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 50%"); //Serial.println("Trapp LH ON 50%"); } if (day == 1) { mySerial.println(swTrappLoftHovedDim75); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 75%"); //Serial.println("Trapp LH ON 75%"); } } if (bevegelseLoft1 + bevegelseLoft2 &--#60; 1) { if (bryterLoft == 0) { mySerial.println(swTrappLoftHovedOff); lcd.setCursor(0, 1); lcd.print("Trapp LH Off"); //Serial.println("Trapp LH Off"); } if (bryterLoft == 1) { mySerial.println(swTrappLoftHovedDim25); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 25%"); //Serial.println("Trapp LH ON 25%"); } } } //********************Android Interface******************** void androidInterface() { if (Serial.available()) { char c = Serial.read(); if (readString.length() &--#60; 30) { readString = readString + c; } if (c == '\n') { Serial.println(P("HTTP/1.1 200 OK")); Serial.println((P"Content-Type: text/html")); Serial.println(); if(readString.startsWith("GET /?out=30&status=1")) { mySerial.println(tvStueOn); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"30\"}")); } if(readString.startsWith("GET /?out=30&status=0")) { mySerial.println(tvStueOff); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"30\"}")); } if(readString.startsWith("GET /?out=31&status=1")) { mySerial.println(spiseStueOn); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"31\"}")); } if(readString.startsWith("GET /?out=31&status=0")) { mySerial.println(spiseStueOff); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"31\"}")); } if(readString.startsWith("GET /?out=32&status=1")) { mySerial.println(lampeBakSofaOn); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"32\"}")); } if(readString.startsWith("GET /?out=32&status=0")) { mySerial.println(lampeBakSofaOff); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"32\"}")); } if(readString.startsWith("GET /?out=33&status=1")) { mySerial.println(lysSkilpaddeOn); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"33\"}")); } if(readString.startsWith("GET /?out=33&status=0")) { mySerial.println(lysSkilpaddeOff); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"33\"}")); } if(readString.startsWith("GET /?out=34&status=1")) { mySerial.println(lysFiskOn); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"34\"}")); } if(readString.startsWith("GET /?out=34&status=0")) { mySerial.println(lysFiskOff); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"34\"}")); } if(readString.startsWith("GET /?out=35&status=1")) { mySerial.println(trappHovedKjellerOn); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"35\"}")); } if(readString.startsWith("GET /?out=35&status=0")) { mySerial.println(trappHovedKjellerOff); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"35\"}")); } if(readString.startsWith("GET /?out=36&status=1")) { mySerial.println(soveromStortOn); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"36\"}")); } if(readString.startsWith("GET /?out=36&status=0")) { mySerial.println(soveromStortOff); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"36\"}")); } if(readString.startsWith("GET /?out=37&status=1")) { mySerial.println(badLoftOn); Serial.print(P("{\"status\" : \"0\" , \"out\" : \"37\"}")); } if(readString.startsWith("GET /?out=37&status=0")) { mySerial.println(badLoftOff); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"37\"}")); } if(readString.startsWith("GET /?out=38&status=1")) { bryterLoft = 1; Serial.print(P("{\"status\" : \"1\" , \"out\" : \"38\"}")); } if(readString.startsWith("GET /?out=38&status=0")) { bryterLoft = 0; Serial.print(P("{\"status\" : \"0\" , \"out\" : \"38\"}")); } if(readString.startsWith("GET /?out=40&status=1")) { mySerial.println(tvStueDim25); mySerial.println(spiseStueDim25); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"40\"}")); } if(readString.startsWith("GET /?out=41&status=1")) { mySerial.println(tvStueDim50); mySerial.println(spiseStueDim50); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"41\"}")); } if(readString.startsWith("GET /?out=42&status=1")) { mySerial.println(tvStueDim75); mySerial.println(spiseStueDim75); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"42\"}")); } if(readString.startsWith("GET /?out=43&status=1")) { mySerial.println(tvStueDim100); mySerial.println(spiseStueDim100); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"43\"}")); } if(readString.startsWith("GET /?out=44&status=1")) { //mySerial.println(soveromStortOff); mySerial.println(swTrappLoftHovedOff); mySerial.println(tvStueOff); mySerial.println(spiseStueOff); mySerial.println(lampeBakSofaOff); mySerial.println(lysSkilpaddeOff); mySerial.println(lysFiskOff); mySerial.println(trappHovedKjellerOff); Serial.print(P("{\"status\" : \"1\" , \"out\" : \"44\"}")); } if(readString.startsWith("GET /?out=all")) { Serial.print(P("{\"ip\" : \"192.168.2.248\", ")); Serial.print(P("\"devices\" : ")); Serial.print(P("[{ \"type\" : \"light\", \"name\" : \"TV-Stue\", \"out\" : \"30\"}")); Serial.print(P(",{ \"type\" : \"light\", \"name\" : \"Spisestue\", \"out\" : \"31\"}")); Serial.print(P(",{ \"type\" : \"Plug\", \"name\" : \"Sofalampe\", \"out\" : \"32\"}")); Serial.print(P(",{ \"type\" : \"Plug\", \"name\" : \"Tusle\", \"out\" : \"33\"}")); Serial.print(P(",{ \"type\" : \"Plug\", \"name\" : \"Fiskane\", \"out\" : \"34\"}")); Serial.print(P(",{ \"type\" : \"light\", \"name\" : \"Kjeller\", \"out\" : \"35\"}")); Serial.print(P(",{ \"type\" : \"light\", \"name\" : \"Soverom\", \"out\" : \"36\"}")); Serial.print(P(",{ \"type\" : \"light\", \"name\" : \"Bad\", \"out\" : \"37\"}")); Serial.print(P(",{ \"type\" : \"light\", \"name\" : \"Loft\", \"out\" : \"38\"}")); Serial.print(P(",{ \"type\" : \"gate\", \"name\" : \"Stue25%\", \"out\" : \"40\"}")); Serial.print(P(",{ \"type\" : \"gate\", \"name\" : \"Stue50%\", \"out\" : \"41\"}")); Serial.print(P(",{ \"type\" : \"gate\", \"name\" : \"Stue75%\", \"out\" : \"42\"}")); Serial.print(P(",{ \"type\" : \"gate\", \"name\" : \"Stue100%\", \"out\" : \"43\"}")); Serial.print(P(",{ \"type\" : \"gate\", \"name\" : \"Godnatt\", \"out\" : \"44\"}")); Serial.print(P("]}")); } readString=""; } } } Endret 18. april 2012 av Behydro 1 Lenke til kommentar
Behydro Skrevet 17. april 2012 Forfatter Del Skrevet 17. april 2012 Tenkte det var geit å dele opp litt På "power" siden så har jeg brukt sendere og mottakere fra Nexa og Waveman kjøpt på Clas og Jula. Waveman kjøpte jeg hovedsaklig fordi de skulle selge ut alt på clas med 50% rabatt, ulempen med de er at jeg klarer ikke å dimme de, kun av og på På Nexa siden så bruker jeg http://www.clasohlso...px?id=165894303 http://www.clasohlso...px?id=165060201 http://www.clasohlso...px?id=165064917 http://www.clasohlso...px?id=165065184 http://www.clasohlso...px?id=165065088 http://www.jula.no/f...-pakning-408028 http://www.jula.no/ir-sensor-408027 Temp sensoren er: http://www.clasohlso...px?id=154374067 Lenke til kommentar
Behydro Skrevet 17. april 2012 Forfatter Del Skrevet 17. april 2012 MultiTrx kommer med FT232 chip noe som jeg ikke trenger, men for å lett kunne koble den til PC har jeg ikke tatt den vekk, men koblet ledninger på to punkt på kortet slik jeg kommer rett på RX TX til microkontrolleren. Denne er på 3.3V mens Arduinoen min er 5V så litt triksing måtte til for å få kom til å funke. Jeg kjører software serial på Arduinoen. Jeg har også et LCD display som viser telegram som kommer inn, hva funskjoner som har blitt trigget og temp lesningene. Fungerer fint for enkel debugging siden serie porten er opptatt med kommunikasjonen til DomoticHome. Når jeg får Ethernet shield begynner morroa med å tilpasse koden.... På laptopen som er tilkoblet Arduinoen kjører jeg ComFoolery for å bridge Com port og en Ethernet port, fungerer som smurt! Lenke til kommentar
Behydro Skrevet 17. april 2012 Forfatter Del Skrevet 17. april 2012 Noen bilder fra DomoticHome, ikke modifisert utgave. Vanligvis vises ikke menyen under, men fikk ikke til å ta screenshot uten.... Lenke til kommentar
Behydro Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 Tenkte trappe funksjonen min trenger en liten forklaring, den ble litt tungvint men jeg ville forsikre meg at så lenge en av sensorene er aktivert så skal lyset ikke slå seg av. Er litt trist vist man først aktiverer den nede, så holder man på med noe oppe og lyset slår seg av når sensoren nede timer ut. Lys styrken er basert på om det er natt eller dag, trenger ikke så mye lys på kvelden. Tenkte jeg skulle også legge til funksjon som kun setter på lyset 5-10% på gang og bad når huset står i "nattmodus" Som en ekstra piff på trappen så kan jeg velge om lyset skal slå seg av eller dimme til 25% når der ikke er noe bevegelse, jeg foretrekker at der er litt lys borte ved trappen på kvelden. //********************Trapp loft -> Hovedetasje******************** if (strcmp(serialReadString, bevegelseTrappLoftHovedOppeOn) == 0) { bevegelseLoft1 = 1; loftTrapp(); } if (strcmp(serialReadString, bevegelseTrappLoftHovedOppeOff) == 0) { bevegelseLoft1 = 0; loftTrapp(); } if (strcmp(serialReadString, bevegelseTrappLoftHovedNedeOn) == 0) { bevegelseLoft2 = 1; loftTrapp(); } if (strcmp(serialReadString, bevegelseTrappLoftHovedNedeOff) == 0) { bevegelseLoft2 = 0; loftTrapp(); } void loftTrapp () { if (bevegelseLoft1 + bevegelseLoft2 > 0) { if (day == 0) { mySerial.println(swTrappLoftHovedDim50); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 50%"); //Serial.println("Trapp LH ON 50%"); } if (day == 1) { mySerial.println(swTrappLoftHovedDim75); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 75%"); //Serial.println("Trapp LH ON 75%"); } } if (bevegelseLoft1 + bevegelseLoft2 < 1) { if (bryterLoft == 0) { mySerial.println(swTrappLoftHovedOff); lcd.setCursor(0, 1); lcd.print("Trapp LH Off"); //Serial.println("Trapp LH Off"); } if (bryterLoft == 1) { mySerial.println(swTrappLoftHovedDim25); lcd.setCursor(0, 1); lcd.print("Trapp LH ON 25%"); //Serial.println("Trapp LH ON 25%"); } } } Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå