Basic Home Automation med Phidgets (5 / 10 steg)
Steg 5: Mer om koden
Koden använder ajax och json för att synkronisera webbgränssnittet till SBC och mongoose för webbservern (båda nödvändiga jquery och mongoose källfilerna finns i projektmappen för dig). Detta gör att webbsidan så att visa verklig tid uppdaterar från SBC: N på ett ganska rent sätt.
homeAutomation.c är hjärtat i det, så låt oss börja där.
Globals
Överst i filen homeAutomation.c är de globala definitionerna. Måste du ange serienumret för SBC: en du använder, sätta i systemlösenord (det som används för att logga in på webbgränssnittet), index för sensorer och index för det ljus du styr. I det här fallet serienumret är 250000, lösenordet är lösenord, ljussensorn är på ingång 0, sund sensorn är på ingång 2 och är lampan tänd utgång 0.
#define SbcSerial 250000
#define SbcSystemPassword "PASSWORD"
#define LightSensorIndex 0
#define SoundSensorIndex 2
#define Output_Light1Index 0
När du lägger till fler Phidgets, du kan lägga till dem till de globala makrona också.
Vi sätter vissa kalibrering siffrorna och skapat en global CPhidgetInterfaceKitHandle för våra Sbc, som vi döpt till McflySbc.
Tolkning av inkommande data och kalibrering
Vissa kalibreringsvärden sätts också där uppe. Ljussensorns värden ändra från Phidget till Phidget så kolla klistermärket bifogas sensorn för m och b värden och skriv de i.
#define LightCalibrationMValue 1.478777
#define LightCalibrationBValue 33.67076
Funktionen get_data
hanterar de ajax-kanaliseras önska meddelanden, som sensorn värden. När du lägger till fler sensorer du ska lägga dem i denna kod i en annan " else if (!strncmp(request_info->query_string, "sound", reqlen))...
" gillar villkor uttalande. Du kan kopiera och klistra in befintliga och redigera formeln i inre om det uttalande som behövs. Kolla användarhandboken för enheten för särskilda formler och värden, men ljus- och de är redan klar.
Styra utdata
Funktionen get_data skickar meddelanden till SBC att ändra utdata staterna (som att vända en ljus på eller av). Förfrågningar kommer in via Ajax, som "light1On" och "light1Off" och lämpliga utdata staten ligger på SBC. Du kan ansluta fler lampor i denna mode (ersätter 1 med stigande nummer), eller något annat du vill styra i hemmet (men var försiktig när du arbetar med el och se till att du vet vad du gör, eller be någon som gör, innan jävlas med elektriska strömmar).
Händelsehanteraren
Event_handler ansluter den set_data
och get_data
fungerar när Ajax blir en send_message
eller SbcAttach
begär, respektive. Inget att röra runt med här.
Fästa i gränssnittet Kit
window.onload = function() {
sätter upp i gränssnittet kit på SBC med proportionerlig, anger sensorn ändra utlösaren till 1 för anslutna sensorer och datan klassar också. När du lägger till fler sensorer måste du lägga till dem i listan och sätta datahastigheten till något i lägre hundratals utbud. För insatsvaror är inte i bruk, har vi ställt datahastigheten till 1000ms.
Index.html är ansiktet av programmet... som de flesta webbsidor, du vet hur det fungerar.
Vi använder jquery och några mycket enkla css. Den jquery filen är tillgänglig online och i källfilerna för detta projekt. Style.css är ganska grundläggande så det inte kommer att förklaras här, men gärna leka med den eller använda en egen formatmall. Du kan kolla in en CSS tutorial på W3 skolor.
Ställa in Ajax-begäranden
Vi börjar med några javascript som anger intervallet för dataförfrågningar SBCn via Ajax. Alla sensorer måste lastas direkt och sedan kontrolleras regelbundet. Du kan ange olika sensorer att ha olika intervall genom att sätta dem i olika setInterval metoder och ändra den andra parametern är antalet millisekunder mellan dataförfrågningar. Se till att ge alla dina sensorer ett unikt och beskrivande namn. Observera att i det här exemplet kommer vi också att avkänning om vårt ljus bifogas SBC är på eller av.
Vi har också element med ID "light1On" och "light1Off" att när du klickar på vi vill skicka en förfrågan via Ajax till SBC. Vi anger funktionen onclick här. Varje element (knappen eller bilden eller vad du vill att orsaka utdata till ändra) behöver ett eget unikt och beskrivande.
var turnon1 = document.getElementById("light1On");
var turnoff1 = document.getElementById("light1Off");
turnon1.onclick = function() {
$("light1On").load('/ajax/send_message?light1On');
$("light1On").load('/ajax/return false;?light1On');
}
turnoff1.onclick = function() {
$("light1Off").load('/ajax/send_message?light1Off');
$("light1Off").load('/ajax/return false;?light1Off');
}
}
/ajax/get_data?light
Observera att vi behåller id namnet på elementet (som "light", "output_light1" och "light1Off") samma som meddelandet som skickas via Ajax till c programmet. Så id visas också i slutet av Ajax begäran (dvs. /ajax//ajax/send_message?light1On?light
för elementet "light" och /ajax/else if (else if(!strncmp(request_info->query_string, "[SENSORNAME]", reqlen)?light1On
för elementet "light1On"). Du kan ändra dessa meddelanden, och sedan se till variabeln i slutet av Ajax begäran motsvarar vad som finns i c-programmet, men ni kan föreställa er hur förvirrande det skulle få, så vi rekommenderar att hålla dem samma.
Webbsidan Slutligen, kroppen. Tabellcellerna där vi vill sensor värdena som ska visas ges ID Vi använde bara att upprätta ajax begäran. Detta gör det så att deras innehåll uppdateras med varje ny SbcAttach begäran, beskrivs lite tidigare.
Också, tabellcellerna som vi vill använda för att styra lampor ges lämpligt ID ("light1On" och "light1Off") så att när de klickas onclick funktionen skickar Ajax begäran.
Du kan lägga till fler rader för olika sensorer, ger den cell där du vill dina data visas det id som du har valt (som "temperatur", om du hade en temperaturgivare).