Motivací je, aby se o nějaké zatahováni nemusel člověk vůbec starat. Základem je v noci zataženo ve dne roztaženo. Ale co když v létě bude pražit slunce? Tak to by bylo dobrý kdyby se to taky zatahlo..
Řešení je v inteligentním systému, který bude myslet na všechny situace.
Návrh řešení: mikrokontroler s cidlem intenzity světla a cidlem teploty, k němu připojený relé.
Na Robotstore.cz jsem zakoupil tyto součástky:
BH1750FVI Měření Intenzity Světla Arduino Modul (139 Kč) – analog protokol I2C
5V 2 Kanálové Relé 10A DC24V AC250V Arduino Modul (119 Kč)
Dccduino Nano V3.0 ATmega328 CH340G Arduino Nano (149 Kč)
Dále součástky:
Teplotní čidlo DS18b20 – digitalni protokol
Program bude vypadat následovně:
Hodnota na BH1750 překročí hodnotu 100 lx po dobu 5min – sepne se relé napájení následně se se sepne relé vytažení rolety. Po 30s se vypíná se napájecí relé. V průběhu dne když intezita světla překročí 5000 – 10000 lx a teplota bude vyší jak 25°C, dochází k zatažení rolety. V případě poklesu intezity světla (100 lx – 4999 lx) se roleta vytahuje.
Ještě je potřeba dořešit vytažení rolety ručně přes spínač a v případě terasy, zajištění, aby vás rolety nezavřely na terase.
3.7. 2017
Dotykové tlačítko bylo slepá vývojová část. Nejenže se spínalo už prř pouhém přiblížení, ale začalo se samo spínat při teplotě 26°C a více. Pro tlačítko jsem použil klasické zvonkové tlačítko bez cedulky ( OBI 95,- Kč )
Svělelný senzor překoná úrveň 150 lx a sepne relé na výsuv. Večer světlo klesne pod 100 lx a relé sepne na zavření.
Popis funkce tlačítko:
Tlačítko přeruší aktuální cyklus a přepne smysl nastavení. To znamená, když je roleta vytažená, tak jí zatáhne, když je zatažená, tak jí vytáhne, když je roleta v pohybu, tak jí zaství. V kombinaci s funkcí. světelného senzoru se musí počítat s tím, že roleta musí být v logickém směru se senzorem. Tzn systém si musí myslet, že je buď roleta úplně vytažená nebo úplně zatažená.
Funkční kód
/* BH1750 library This example initalises the BH1750 object using the default high resolution mode and then makes a light level reading every second. Connection: VCC-5v GND-GND SCL-SCL(analog pin 5) SDA-SDA(analog pin 4) ADD-NC or GND */ #include <Wire.h> #include <BH1750.h> BH1750 lightMeter; const int raleyPin1 = 12; // faze const int raleyPin2 = 11; // smer const int buttonPin = 10; // tlacitko UP/DOWN const int pirPin = 9; // PIR modul - pohybovy modul unsigned long sleepTime; //how long you want the arduino to sleep int pirState = 0; // pir stat unsigned long pirDelay = 15*60*1000; // 15 min timeout int buttonState = 0; // kdyz je button 1 ma to naprostou prioritu int lastButtonState = LOW; // the previous reading from the input pin unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers int den = 1; int noc = 0; int distancZatazeni = 10; // bude odpocitavat pri zmene stavu int distancVytazeni = 10; // bude odpocitavat pri zmene stavu void setup(){ Serial.begin(9600); lightMeter.begin(); Serial.println("Running..."); pinMode(raleyPin1,OUTPUT); pinMode(raleyPin2,OUTPUT); pinMode(buttonPin, INPUT); //Set touch sensor pin to input mode vytazeni (); // pri startu vytahnoutzvvgk../l534boi8yh } void svetlo (){ uint16_t lux = lightMeter.readLightLevel(); } /* * bezi casovy limit delayInt a mezi tim ceka na tlacitko */ void myDelay (long delayInt ) { long i = 0; while ( delayInt > i ) { int reading = digitalRead(buttonPin); int pir = digitalRead(pirPin); if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } //Serial.println(digitalRead(buttonPin)); if ( (millis() - lastDebounceTime) > debounceDelay) { // if the button state has changed: if ( reading != buttonState ) {// kdyz je zmacknute talcitko tak delay neporbiha if ( reading == HIGH ) { //Read Touch sensor signal Serial.println("Tlacitko...zmacknute"); buttonState = 1; delay (1000); // 1s timeout break; } } } //Serial.println("Tlacitko...cekam"); delay(100); i = i + 100; lastButtonState = reading; } } void zatazeni () { noc = 1; den = 0; digitalWrite(raleyPin1, HIGH ); Serial.println("Zatazeni - spinam...fazi"); digitalWrite(raleyPin2, HIGH ); Serial.println("Zatazeni - spinam...zatazeni"); myDelay(40000); // 40s digitalWrite(raleyPin1, LOW ); Serial.println("Zatazeni - vypinam...fazi"); digitalWrite(raleyPin2, LOW ); Serial.println("Zatazeni - vypinam...zatazeni"); buttonState = 0; } void vytazeni () { den = 1; noc = 0; digitalWrite(raleyPin1, HIGH ); Serial.println("Spinam...fazi"); myDelay(40000); // 40s digitalWrite(raleyPin1, LOW ); Serial.println("Vypinam...fazi"); buttonState = 0; } void loop() { uint16_t lux = lightMeter.readLightLevel(); // buttonState se nemusi zadavat do podminek rotoze je tu timeout if ( lux < 100 && den == 1 ) { // zatazeni rolet podle lux if ( distancZatazeni < 1 ) { zatazeni (); }else { distancZatazeni -= 1; } } else { distancZatazeni = 10; // vraceni pocitadla } if ( lux > 120 && noc == 1 ) { // vytazeni rolet podle lux if ( distancVytazeni < 1 ) { vytazeni (); }else { distancVytazeni -= 1; } } else { distancVytazeni = 10; // vraceni pocitadla } if ( buttonState == 1 && den == 1 ) { // je zmacknute tlacitko a den tak se zatahne buttonState = 0; zatazeni (); } if ( buttonState == 1 && noc == 1 ) { // je zmacknute tlacitko a den tak se rolota vytahne buttonState = 0; vytazeni (); } Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); myDelay(10000); // 10s }