Smart Appliance Switch (3 / 5 steg)

Steg 3: kodning

Först logik verkade enkelt: om det är mörkt och det finns rörelse - slå på apparaten (lampan i mitt fall), annars stänga av. Vänta n sekunder och kolla igen.

Men när jag testar och lägger till nya lägen på min enhet, ingen av ovan nämnda arbetade som enkel.

Du kan inte använda om (mörka == true & & rörelse == true) {och slå sedan på} annat {inaktivera}; fördröjning (n);

eftersom du kommer att få otäcka feedback effect: mörka? -Ja, rörelse? -ja då slår på; vänta; mörka? -Nej (eftersom vi har bara vände på lamporna), rörelse? -ja då stänga av; mörka? -Ja... Så blinkar med denna logik får du konstant.

Det är därför i förfarande light_on() kontrollera vi först om det är mörkt och sedan gå till loop, tända ljus och ständigt kontrollera om förslaget är närvarande. Vi kontrollerar inte dessa två villkor samtidigt.

Som för kommandot fördröjning (n), som Pausar körning för n millisekunder, vi kan inte använda det eftersom under dröjsmål, om du trycker på permanent eller manuell läge knappar, Arduino inte kommer att märka det, eftersom det sover. Det är därför vi använder i samma slingan, som kontroller för rörelser i light_on () förfarande, fungerar millis() och tilldela dess värde till variabel "nu". Millis() returnerar antalet millisekunder som gått sedan Arduino var påslagen. Detta sätt är vi kunna få ut av loop när nu + delay_time > millis().

Så, alla villkor för att få ut av loop i light_on() procedur:

  • Det finns ingen rörlighet;
  • delay_time har passerat sedan senast rörelse upptäcktes;
  • enhetsläge ändrades genom att trycka på en av knapparna.

Andra kommentarer som jag ingår i själva koden.

Jag gjorde två klasser: fotocell och pir.

För knappen debouncing använder jag Bounce2 bibliotek som du kan ladda ner från här. Ladda ner biblioteket och packa upp innehållet i ~/Documents/Arduino/libraries (på en Mac) eller My Documents\Arduino\libraries (på en Windows maskin).

< p > //#define __DEBUG__ / / avkommentera detta definierar för felsökningsinformation i följetong monitor < br > #include "Bounce2.h"
#include "photocell.h"
#include "pir.h" < /p >< p > //SETUP
CONST unsigned int PHOTOCELL_PIN = A0;
CONST unsigned int RELAY_PIN = 10;
CONST unsigned int PERMANENT_LED_PIN = 13.
CONST unsigned int PERMANENT_MODE_PIN = 12;
CONST unsigned int MANUAL_MODE_PIN = 11;
CONST unsigned int PIR_INPUT_PIN = 2;
CONST unsigned int BAUD_RATE = 9600;
CONST unsigned int LIGHT_DELAY = 5000;
CONST unsigned int DEBOUNCE_DELAY = 20;
CONST int DEFAULT_THRESHOLD = 130;
SETUP < /p >< p > int tröskel = 0;
Bounce permanent_mode_button, manual_mode_button;
booleska button_state = false;
fotocell p_cell(PHOTOCELL_PIN);
PIR ir_sensor(PIR_INPUT_PIN);
enum lägen {default_, permanent, manual, threshold_changed}; Vi måste också kunna avgöra, när under manuellt läge, manuellt lägesknappen trycktes igen
int prev_mode = default_;
int läge = default_; < /p >< p > //check tillstånd av knappen
booleska button_pressed (studs & knappen, boolean och staten) {
om (button.update() & & button.read() == 1) {
State =! statligt;
}
returnera staten.
} < /p >< p > //determine nuvarande läge
int check_mode() {
om (button_pressed (permanent_mode_button, button_state))
läge = permanent; permanent lägesknappen intryckt < /p >< p > annars om (manual_mode_button.update() & & manual_mode_button.read() == 1) {
tröskel = p_cell.value(); < /p >< p > #ifdef __DEBUG__
Serial.println ("tröskel:" + String(threshold));
#endif < /p >< p > läge = threshold_changed; tröskeln har ändrats
} < /p >< p > annars om (tröskelvärde > 0) {
läge = manuell; manuellt läge
} < /p >< p > annat
läge = default_; standardläget < /p >< p > återvända läge;
} < /p >< p > / / Kontrollera, wheter mode ändrades
bool mode_changed() {
om (prev_mode! = check_mode()) {
prev_mode = check_mode(); < /p >< p > #ifdef __DEBUG__
Serial.println ("sant, tidigare läge:" + String(prev_mode));
#endif
return true;
}
annat {
#ifdef __DEBUG__
Serial.println ("falska, tidigare läge:" + String(prev_mode));
#endif
returnera false;
}
} < /p >< p > //turn på ljus
void light_on (int tröskel, const unsigned int & pin, const unsigned int & delay_time) {
digitalWrite (PERMANENT_LED_PIN, 0);
om (p_cell.value() < = tröskelvärde) {< /p >< p > osignerade länge nu = 0;
booleska mode_change = mode_changed(); < /p >< p > för (; ((ir_sensor.motion_detected() & &! mode_change) & & (nu = millis())) || ((millis() < (nu + delay_time)) & &! mode_change); mode_change = mode_changed()) {
digitalWrite (pin, 1); Vi får ut av denna loop när det finns ingen rörlighet eller enhetsläge ändrades eller delay-tiden har gått
#ifdef __DEBUG__
Serial.println ("inuti loop, rörelse:" + String(ir_sensor.motion_detected()));
Serial.println ("nu:" + String(now));
#endif
}
digitalWrite (pin, 0);
}
digitalWrite (pin, 0);
} < /p >< p > void setup() {
#ifdef __DEBUG__
Serial.BEGIN(BAUD_RATE);
#endif
permanent_mode_button.attach(PERMANENT_MODE_PIN);
permanent_mode_button.Interval(DEBOUNCE_DELAY);
pinMode (PERMANENT_MODE_PIN, indata);
manual_mode_button.attach(MANUAL_MODE_PIN);
manual_mode_button.Interval(DEBOUNCE_DELAY);
pinMode (MANUAL_MODE_PIN, indata);
pinMode (RELAY_PIN, OUTPUT);
pinMode (PERMANENT_LED_PIN, OUTPUT);
} < /p >< p > void loop() {
om (läge == permanent) {
digitalWrite (RELAY_PIN, 1);
digitalWrite (PERMANENT_LED_PIN, 1);
#ifdef __DEBUG__
Serial.println ("permanent läge på");
#endif
} < /p >< p > annars om (läge == manual) {
#ifdef __DEBUG__
Serial.println ("manuellt läge på");
#endif
light_on (tröskel, RELAY_PIN, LIGHT_DELAY);
} < /p >< p > annars om (läge == default_) {
#ifdef __DEBUG__
Serial.println ("standardläge på");
Serial.println ("värde:" + String(p_cell.value()));
#endif
light_on (DEFAULT_THRESHOLD, RELAY_PIN, LIGHT_DELAY);
}
check_mode();
} < /p >

photocell.h

< p > #include "arduino.h" < /p >< p > klass fotocell {
privat:
unsigned int _pin;
int buffer_size; < /p >< p > offentliga:
fotocell (const unsigned int pin) {
_pin = pin;
buffer_size = 10;
} < /p >< p > int värde () {
float summan = 0;
för (int jag = 1; jag < = buffer_size; i ++) {//we använda buffert för att få fin medelvärdet
summa += analogRead(_pin);
}

återvända round(sum / buffer_size);
}
}; < /p >

pir.h

< p > #ifndef __PIR__ < br > #define __PIR__
#include "arduino.h" < /p >< p > klass PIR {
int _input_pin; < /p >< p > offentliga:
PIR (const unsigned int input_pin) {
_input_pin = input_pin;
pinMode (_input_pin, ingång);
} < /p >< p > bool motion_detected() {
återgå digitalRead(_input_pin) == hög;
}
};
#endif < /p >

Det är all kod som du behöver. Nu kan du överföra den till din Arduino och test, om allt fungerar som det ska, innan med hög spänning och montering för enheten.

Också bifogade jag filer med koder. På min maskin sammanställer allt utan problem.

Se Steg
Relaterade Ämnen

Bygga ett Smart hem med en Wifi trådlös Switch av Apple App kontroll

Smarta hem har nu blivit ett mode, så jag följer denna trend och att göra mitt hus ett sant smarta hem. Jag har sökt om smarta hem prylar för en tid, att finna att det finns massor av trådlös switch, wifi switch, app switch eller wifi socket produkte...

SMART switch

Världen har förändrats så snabbt och det är alla grund teknik och vetenskap. Saker har förbättrats, ny era har kommit av en bättre och en smart värld. Men enligt mig finns det en sak som inte har ändrats ännu... En växel! Ja en elektrisk strömbrytare...

Arduino NodeMCU ESP8266 baserade WIFI Smart Strip 4 Relay Switch Board med Raw TCP/IP, Mqtt & Android App

Nod MCU är en öppen källkod ESP8266 baserade Wifi aktiverat IoT plattform för alla. Vad vi har gjort skapas en fyra relay board för det och det coolaste är att styrelsen också har en 100-240V-AC till 5V DC strömförsörjning ombord så du kommer att kun...

Domótica, Interruptor Inteligente - Home automation - Smart Switch

En esta oportunidad les ofrezco un proyecto sv el cual he estado trabajando y del cual esperaría recibir comentarios, idéer, mejoras, con el fin de lograr alguno de los mejores sistemas disponibles sv la red.En el presente artículo encontrará todo el...

Samsung Galaxy - överföra filer med Samsung Smart Switch App

Steg för steg om hur du överför dina filer från en Samsung telefon till en annan....

Chronobot: En Smart alarm klocka

Chronobot är en smart väckarklocka som kan känna av sin egen inriktning. Det är en analog klocka med en awesome letar fall. Klockan är ganska lätt att bygga och ställa in. Det är gjorts med hjälp av en ardunio mini och en TFT-skärm. Chronobot är anpa...

HackerBoxes 0001: Robotic Smart Car, NodeMCU, 3D LED-julgran

Detta instructable delar grunderna i arbetar med HackerBoxes #0001. HackerBoxes är den månatliga box prenumerationstjänsten för elektronik hobbyister, beslutsfattare och hackare. Om du vill få en box som denna rätt till din brevlåda varje månad, kan...

BLUETOOTH kontrollerad ROBOCAR med ANDROID SMART PHONE

Syftet med detta projekt för att kontrollera saker via trådlöst i ett band som Bluetooth. Nu en dagar Android smart telefon är ett modeord och många saker kan styras av Android via Bluetooth, WiFi. Så, mitt motiv är att göra ett kommunikationssystem...

DIY Remote Control Switch Kit av 2262/2272 M4 bröd styrelsen & relä för Maker

smarta hem kommer till våra liv. om vi vill smarta hem besannats, behöver vi många fjärrkontroll switch.idag göra vi kommer för att göra ett test, en enkel krets att lära sig teorin om fjärrkontrollen switch.Detta kit design av SINONING ROBOTVi har g...

DIY Smart Garage dörröppnare

Jag vet att du har fått 5 minuter på vägen och frågade dig själv, "gjorde jag stänga garageporten?".Nu, istället för att vrida runt eller lämnar ditt garage och hus sårbara för tjuvar, kan du kontrollera och stänga den med telefonen med ditt val...

ESP-8266 Smart diskmaskin (smart plugg / smart socket)

Vi köper el från en lokal vindkraftspark. Naturligtvis är vi anslutna till vanliga nätet med en stadig leverans av el. Men jag har alltid velat att justera vår konsumtion patern enligt tillgängliga vinden. Därför bygga jag ett system för att övervaka...

SMART CAR och SMART parkering SYSTEM

Detta instructable är den skriftliga versionen av min "Arduino: hur till bygga en skarp bil och SMART parkering SYSTEM"Robotics är en del av dagens meddelande. I dagensvärlden robotics är en snabbväxande och intressanta området. Är det enklaste...

Mikrokontroller baserade smarta batteriladdare

Kretsen vad du kommer att se en smart batteriladdare baseras på ATMEGA8A med auto avskurna. Olika parametrar visas via en LCD under olika laddning stater. Kretsen kommer också göra ljud via en Summer efter laddning.Jag byggde i princip laddaren för a...

Smart grenuttag baserat på Beaglebone Black och OpenHAB

!!!!! Spela med elnätet (110/220V) är farliga, vänligen vara väldigt väldigt försiktig!Det finns vissa befintliga smart power strip designer baserad på "Raspberry Pi" och två Arduinos, vilket visas i bilden "Gamla design".Den nya desig...

Gör din egen smart Watch-klocka

Detta dokument är också översatt till polska(med Sebastian), koreanska språket.Olika användare gjorde sin egen klocka. Se sidan "Jag gjorde det!"!De flesta IT-företag deltar i loppet för att ta tag i människors handled. En smart Watch-klocka bli...

Smart coaster

tydligen är jag en "nekojita," (japanska för en person som inte kan hantera varm mat). Katter gillar inte höga temperaturer mat (de säger), så en person som inte gillar smält bitar i sin mun kallas nekojita (katten tungan).Med en lärande sensor...

Fattiga-Mans Smart-Grid - Blackout skydd av UPS och elektrisk motorcykel

för ett tag sedan, Billigt batteriladdaren jag använde till min elektrisk motorcykel gick på fritz. Jag bestämde mig att få kreativ för att se om det fanns ett sätt att inte bara få en bra laddare gratis, men också öka nyttan av min personliga elbil....

Transistor grunderna - switch

Transistorer är utan tvekan den viktigaste elektroniska komponenten används idag. De är anledningen till att vi har de tekniska framsteg som vi har i dag. Det finns ingen radio eller datorer utan dem, och i sin tur det finns inga moderna TV-apparater...

Batteri ansvarsfrihet protector utstansade switch med ATtiny85 för bly syra bil eller Lipo batteri

Jag hade hittat de kommersiella som på $49 till dyra som jag behöver flera batteri beskyddare för mina bilar och solsystem. De använder också för mycket makt med 6 mA. Jag kunde inte hitta några instruktioner i ämnet. Så jag gjorde min egen drar som...