Domotic Arduino
Feutures:
- Move the roller shutter when push the button
- Stop the roller shutter when it is completely open or closed
- Stop the roller shutter when push the button up while it's moving down
- Stop the roller shutter when push the button down while it's moving up
Operation principle
Arduino counts the holes on the roller shutter with the infrared receiver; the infrared diode is positioned on the other side of the roller shutter. When the hole is aligned with them, Arduino increment or decrement a counter to determinate the position of the roller shutter. To connect the actuators and the sensor to Arduino I used two LAN cables (see last step)
Scheme
Downloads
Software
I hope comments are exhaustive:
// costants:
const int sm = 2; // moviment sensor
const int buttonPin_t3 = 5; // button up
const int buttonPin_t2 = 4; // button down
const int ledPin = 13; // LED for check buttons
const int d1 = 11; // motor UP
const int d0 = 12; // motor DOWN
// variables
int ContatoreSensoreMovimento = 0; // counter move sensor
int Contatore_t3_t2 = 0;
int RegistroOutputd1 = 0;
int RegistroOutputd0 = 0;
// variables sm:
int State_sm = 0; // state
int lastState_sm = 0; // last state
// variabili t3:
int buttonState_t3 = 0; // state
int lastButtonState_t3 = 0; // last state
// variabili t2:
int buttonState_t2 = 0; // state
int lastButtonState_t2 = 0; // last state
void setup() {
// initialization input pin:
pinMode(sm, INPUT);
pinMode(buttonPin_t2, INPUT);
pinMode(buttonPin_t3, INPUT);
// initialization output pin:
pinMode(d1, OUTPUT);
pinMode(d0, OUTPUT);
pinMode(ledPin, OUTPUT);
// iinitialize serial communications at 9600 bps:
Serial.begin(9600);
}
void loop() {
// sm
// read pin:
State_sm = digitalRead(sm);
// compare the buttonState to its previous state
if (State_sm != lastState_sm) {
// if the state has changed, increment the counter
if (State_sm == LOW) {
// if the current state is LOW then
// wend from off to on:
if (RegistroOutputd1 == 1) {
ContatoreSensoreMovimento++;
}
if (RegistroOutputd0 == 1) {
ContatoreSensoreMovimento--;
}
Serial.println("on_sm");
Serial.print("ContatoreSensoreMovimento: ");
Serial.println(ContatoreSensoreMovimento, DEC);
}
else {
// wend from off to on:
Serial.println("off_sm");
}
}
// save the current state as the last state
// for next time through the loop
lastState_sm = State_sm;
if (ContatoreSensoreMovimento % 4 == 0) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
// t3
// read pin:
buttonState_t3 = digitalRead(buttonPin_t3);
// compare the buttonState to its previous state
if (buttonState_t3 != lastButtonState_t3) {
// if the current state is HIGH then:
if (buttonState_t3 == HIGH) {
// if counter is <1:
if (Contatore_t3_t2 < 1) {
// increment the counter
// wend from off to on:
Contatore_t3_t2++;
Serial.println("on_t3");
Serial.print("Contatore_t3_t2: ");
Serial.println(Contatore_t3_t2, DEC);
}
}
else {
// if the current state is LOW then
// wend from on to off
Serial.println("off_t3");
}
}
// save the current state as the last state
// for next time through the loop
lastButtonState_t3 = buttonState_t3;
//valore massimo contatore 1
// t2
// lettura del pin:
buttonState_t2 = digitalRead(buttonPin_t2);
// compare the buttonState to its previous state
if (buttonState_t2 != lastButtonState_t2) {
// if the current state is HIGH then:
if (buttonState_t2 == HIGH) {
// if counter is >-1:
if (Contatore_t3_t2 > -1) {
// increment the counter
// wend from off to on:
Contatore_t3_t2--;
Serial.println("on_t2");
Serial.print("Contatore_t3_t2: ");
Serial.println(Contatore_t3_t2, DEC);
}
}
else {
// if the current state is LOW then
// wend from on to off:
Serial.println("off_t2");
}
}
// save the current state as the last state
// for next time through the loop
lastButtonState_t2 = buttonState_t2;
if (ContatoreSensoreMovimento < 35 && Contatore_t3_t2 == 1) {
digitalWrite (d1, HIGH);
RegistroOutputd1 = 1;
}
else {
digitalWrite (d1, LOW);
RegistroOutputd1 = 0;
if (ContatoreSensoreMovimento == 35 && Contatore_t3_t2 == 1) {
Contatore_t3_t2 = 0;
}
}
if (ContatoreSensoreMovimento > 0 && Contatore_t3_t2 == -1) {
digitalWrite (d0, HIGH);
RegistroOutputd0 = 1;
}
else {
digitalWrite (d0, LOW);
RegistroOutputd0 = 0;
if (ContatoreSensoreMovimento == 0 && Contatore_t3_t2 == -1) {
Contatore_t3_t2 = 0;
}
}
}