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č )

Popis funkce svetelný senzor:

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
}