Raspberry Pi-Arduino-SignalR Home Automation navet (10 / 11 steg)
Steg 10: Öka automationssystem och relaterade korrigeringar
Detta system kan utökas genom att lägga till fler koder tagna från olika system. Även denna del är lätt, finns det två andra faktorer som du måste ta hänsyn till.
Förbättring 1 (snabb): Arbetar med IR-signaler av olika längder
- IR-koder för olika system kommer med olika längder, även mellan två produkter från samma tillverkare.
- Till exempel i det här fallet IR kod matrislängd för LED-TV är 67 medan det av Samsung Sound Bar omkring 87.
- Vilket betyder, om jag vände på Sound Bar första, den IR-buffert matrisen i Arduino skiss skulle fyllas med en IR-kod sekvens som innehåller 87 koder
- Efter detta om jag vände på LED TV, det skulle fylla matrisen IR-buffert med bara 67 koder, men återstående 20 koder från den föregående operationen skulle fortfarande vara runt
Resultatet? LED-TV startar inte eftersom IR-kod bufferten har skadats av de extra 20 koder inte saneras från den föregående operationen!
Fixa 1 (den lätt väg ute, inte rekommenderas)
Ändra den Arduino skiss enligt följande:
Ändra följande funktion samtal i i funktionen loop() {}
transmitIRCode();
att < br > transmitIRCode(c);
Göra ändringar i undertecknandet av funktionen ovan:
void transmitIRCode(int codeLen) < br > {< br > //RAWBUF konstant ersatt med codeLen < br > IRTransmitter.IRSendRaw::send (IRCodeBuffer, codeLen, 38);
}
Även detta är lätt, matrisen blir aldrig riktigt helt rensat och därför är detta inte en mycket bra lösning
Fixa 2 (inte hårt, rekommenderas)
Deklarera en variabel med ytterligare högst upp av Arduino skiss, efter kommentarerna:
unsigned int EMPTY_INT_VALUE;
Lägg till detta till toppen av setup() funktion:
Fånga det naturliga tillståndet av en tom osignerade heltalsvariabel < br > EMPTY_INT_VALUE = IRCodeBuffer [0];
Scrolla ner och lägga till en ny funktion omedelbart efter transmitIRCode() funktionen skiss:
void clearIRCodeBuffer(int codeLen) < br > {< br > //Clear alla koder från array < br > / / Obs: Ange matriselementen 0 är inte lösningen! < br > för (int jag = 1; jag < = codeLen; i ++) < br > {< br > IRCodeBuffer [i-1] = EMPTY_INT_VALUE; < br >} < br >}
Slutligen nya funktionen call ovan på följande plats i funktionen loop():
...
Återställ - Fortsätt läsa Serial Port < br > clearIRCodeBuffer(c); < br >...
Detta är ett mer renare tillvägagångssätt som det faktiskt återställer alla platser i matrisen IR-buffert som var befolkad av senaste IR-kod signalen utan att lämna något åt slumpen.
Tillbehör 2 (mer engagerade): upprepande IR signalöverföring för vissa enheter
- Vissa enheter kräva samma signal skickas flera gånger för att svara
Exempel: I det här fallet Samsung Sound Bar kräver samma kod skickas två gånger med ett mellanrum på 1 sekund
Fix i konceptet har diskuterats här eftersom det är lite mer engagerade och måste testa.
Att lägga till funktionen upprepa till Ardunio skiss kommer att innebära att du kommer att blinka skissen varje gång du lägger till en ny enhet till ditt hem Automation System
I stället gör lägger korrigeringsfilen till HTML SignalR klienten och Python SignalR tjänstprogrammet lösningen mycket mer flexibel. Och detta skulle kunna uppnås i princip enligt följande:
Ändra SignalR HTML-klienten om du vill överföra upprepa information till navet
Öppna index.html och bädda in Repetera värdet i på HTML-knappen som så:
värde = "SMSNG-SB-PWR-på"
skulle bli
värde = "SMSNG-SB-PWR-ON_2_1000"
Där 2 Repetera värdet och 1000 är försening värde i millisekunder mellan de två upprepa signalerna
När du klickar på denna knapp, får SignalR navet nyckeln kod + Repeat_Spec
Modifiera SignalR Server sida att tolka ut endast nyckeln koden:
- Använd nyckeln koden för att hämta IR-koden från databasen som vanligt
- Sända nyckel koden + Repeat_Spec och IRCode till SingalR klienterna som vanligt
Ändra Python SignalR tjänstprogrammet för överföring av signaler med hjälp av upprepa värdena:
Öppna den Python client och ändra följande två funktioner:
def print_command_from_hub (buttonId, cmdSrc):
# analysera den Repetera koden från buttonId värde
def transmitToArduino(IRSignalCode,delim,endPrefix):
# Ställ upp ett tag eller för slinga för att sända signalen på önskad frekvens
- Detta sätt Arduino behöver inte flashad upprepade gånger
- Valfritt antal upprepa frekvenser kunde byggas in i detta system
- Dessutom, om du använder UNO, det finns en gräns för storleken din skiss kan växa till!