Arduino – sterownik schodowy LED 12V + kinkiet 230V

Jako że cena gotowych rozwiązań sterownika schodowego jest moim zdaniem nieco naciągana, a fajnie jest zrobić coś samemu, przedstawiam krótki opis jak wykonać taki sterownik. Gdyby coś było mało jasne – proszę o komentarze.

Arduino jako sterownik schodowy led reagujący na ruch

Zaczynamy!


Jako, że jest to projekt oparty o Arduino – zazwyczaj wykonuję go w oparciu o gotowe klocki. Moduł irf520 jest dość drogi – ale coś za coś. Mozna go też wykonać samemu znacznie taniej, ale tu już odsyłam na strony poświęcone czystej elektronice.

Co będzie potrzebne?

1. dowolna płytka arduino z wyjściami cyfrowymi w ilości min. 16 szt

2. 10 modułów IRF520 np. stąd (uwaga! nie wiem czy to najtańsza oferta, pierwszy lepszy wynik z googla) http://electropark.pl/moduly-wejsc-wyjsc/6640-modul-sterownika-irf520-n-mosfet.html

Zamawiamy tyle, ile mamy ledów schodowych oddzielnie wyprowadzonych.

3. Przekaźnik do arduino 5v np. taki https://botland.com.pl/przekazniki/1293-modul-przekaznika-rm1-z-izolacja-optoelektroniczna.html

4. Idealnie byłoby cały układ solidnie zlutować, ja niestety robiłem go na płytkach prototypowych. W przyszłości go zlutuję (na peeeewnooooo!). Więc dla leniwych – kupcie chociaż jedną płytę stykową

5. czujki ruchu PIR te najprostsze 🙂

Montaż podzespołów w skrócie:

  1. Do modułu irf520 podłączamy do pinów arduino – sygnał (wpinamy kolejno do arduino do pinów od 2 do 11), +5v, masa
  2. Do IRF520 do złącz po prawej stronie VIN i GND podłączamy zasilanie ledów / taśmy – o napięciu 12v.
  3. V+ i V- to wyjścia zasilania dla taśmy

Poniżej zdjęcie mojego zmontowanego układu, niestety kiepskiej jakości.

 

 

A tutaj do pobrania gotowy sketch arduino schody

Co potrafi ten kod?

  1. jeśli załączymy rozświetlanie z dołu, a ktoś z góry będzie chciał skorzystać ze schodów – włączą sie wszystkie ledy natychmiastowo.
  2. tryb party 🙂
  3. obsługa 2x PIR + 2x switch

 

Cały kod do przeanalizowania (nie radzę stąd kopiować, jak potrzebujesz pobierz – schody)

/*
 vsx.pl Marcin Przybysz
*/
 
#include <SoftwareSerial.h>
#define czujnikDol 22
#define czujnikGora 24
#define przyciskDol 26
#define przyciskGora 28
#define kinkietPin 12
int czas = 15000;
unsigned long fadetime = 7;
int ledPin = 11; // LED connected to digital pin 9
long previousMillis = 0; 
long previousMillis2 = 0; 
bool wykrytoRuch = false;
bool RuchZdolu = false;
bool RuchZgory = false;
int kierunek = 0;
int status_button;
int StanLed[10];
bool pressed = false;
unsigned long pressedtime = 0;
unsigned long Timer1 = 0;
bool Timer1Active=false;
 int button_delay=0;
bool PartyMode=false;
void setup() {
 Serial.begin(9600); 
 Serial.print("Rozpoczynam odliczanie 30 sek.");
digitalWrite(kinkietPin,HIGH);
digitalWrite(kinkietPin,LOW);
digitalWrite(kinkietPin,HIGH);
Serial.print("Start.");
for (int x=0;x<10;x++) StanLed[x]=0;
 pinMode(czujnikDol,INPUT);
 pinMode(czujnikGora,INPUT);
 pinMode(przyciskDol,INPUT_PULLUP);
 pinMode(przyciskGora,INPUT_PULLUP);
 pinMode(kinkietPin,OUTPUT);
for (int i=0;i<30;i++) {
 analogWrite(2,255);
 delay(800);
 analogWrite(2,0);
 delay(200);
 
}
 // nothing happens in setup
for (int n=2;n<12;n++) {
for (int fadeValue=0;fadeValue<255;fadeValue+=2){
 analogWrite(n, fadeValue);
 delay(2);
}
 analogWrite(n, 0);
kinkiet(0);
}
delay(200);
ZapalWszystkieSzybko(); delay(100); ZgasWszystkieSzybko();delay(100);ZapalWszystkieSzybko();delay(100);ZgasWszystkieSzybko();
}
void kinkiet(int n) {
if (n==0) {digitalWrite(kinkietPin,HIGH);Serial.println("- Zgaszono kinkiet.");} else
 if (n==1) {digitalWrite(kinkietPin,LOW); Serial.println("+ Zapalono: KINKIET");}
}
//--------------------------------------------------------------------------------------------- MAIN LOOP
void loop() {
unsigned long teraz = millis();
if (PartyMode==false) {
if (digitalRead(czujnikDol)==1) {Timer1Start(); Serial.println("czujnik dol"); ZapalzDoluDoGory(); kierunek=1;}
if (digitalRead(przyciskDol)==LOW) {Timer1Start();delay(200);Serial.println("przycisk dol"); ZapalzDoluDoGory(); kierunek=1; }
if (digitalRead(czujnikGora)==1) {Timer1Start(); Serial.println("czujnik gora");ZapalzGoryNaDol(); kierunek=0;}
if (digitalRead(przyciskGora)==LOW) {Timer1Start();delay(200);Serial.println("przycisk gora"); ZapalzGoryNaDol(); kierunek=0;}
 
if (((teraz - Timer1) > czas) && (Timer1Active==true)) { 
 Serial.println("Timer przekroczyl czas");
 Timer1Stop(); 
 if (kierunek==1) ZgasZdoluDoGory(); else ZgasZGoryNaDol();
 }
delay(2);
if (digitalRead(przyciskDol)==LOW){
button_delay++;
 delay(30);
 Serial.println(button_delay);
 if (button_delay > 2) { PartyMode=true; Serial.println("Party Mode!");button_delay=0;ZmianaTrybu();}
} else button_delay=0;
}
if (PartyMode==true) { //--------------------------------------------------- PARTY MODE ----------------------------
if (digitalRead(przyciskDol)==LOW) PartyMode=false;
if (PartyMode==true) for (int b=0;b<3;b++) Demo3();
if (PartyMode==true) for (int a=0;a<2;a++) {Demo2(); Demo4();}
if (PartyMode==true) for (int c=0;c<3;c++) Waz();
ZgasWszystkieSzybko();
if (PartyMode==true) for (int d=0;d<6;d++) Demo1();
}
//Serial.print("Party Mode: ");
//Serial.println(PartyMode);
}
//-----------------------------------------------------------------------------------------
void Timer1Start(){
 Serial.println("Odpalam Timer1");
Timer1Active=true;
Timer1=millis();
}
void Timer1Stop(){
 Serial.println("zatrzymano T1.");
Timer1Active=false;
Timer1=0;
}
int Zapal(int pin){
int fadeValue=0;
while (fadeValue<254) {
 unsigned long currentMillis = millis();
 if(currentMillis - previousMillis > fadetime) {
 previousMillis = currentMillis;
 
 if (StanLed[pin-2]==0) analogWrite(pin, fadeValue);
 
 if (fadeValue<64) fadetime=7;else fadetime=3;
 fadeValue+=3;
 
 }
 
 }
 analogWrite(pin, 255);
 Serial.print("+ Zapalono: "); Serial.println(pin-1);
 StanLed[pin-2]=1;
}
void ZapalWszystkieSzybko(){
for (int n=2;n<12;n++) {
 
 analogWrite(n,255);StanLed[n-2]=1;}
 kinkiet(1);
 Serial.println("+ Zapaliłem wszystkie.");
}
void ZgasWszystkieSzybko() {
for (int n=2;n<12;n++) {analogWrite(n,0);
 StanLed[n-2]=0;
 }
 Serial.println("- WSZYSTKIE ZGAS!.");
 kinkiet(0);
}
void ZgasZdoluDoGory(){
 Serial.println("- Gasze od dolu.");
kinkiet(0);
for (int n=2;n<12;n++) {
 if (digitalRead(czujnikGora)==1) {Serial.println("Wykryto wlaczenie: czujnik gora");ZapalWszystkieSzybko();break;}
 if (digitalRead(przyciskGora)==LOW) {Serial.println("Wykryto wlaczenie: przycisk gora");ZapalWszystkieSzybko();break;}
 if (digitalRead(czujnikDol)==1) {Serial.println("Wykryto wlaczenie: czujnik dol");ZapalWszystkieSzybko();break;}
 if (digitalRead(przyciskDol)==LOW) {Serial.println("Wykryto wlaczenie: przycisk dol");ZapalWszystkieSzybko();break;}
 
 Zgas(n);
 
}
}
void ZgasZGoryNaDol(){
 Serial.println("Gasze od gory.");
kinkiet(0);
for (int n=11;n>1;n--) {
 if (digitalRead(czujnikGora)==1) {Serial.println("Wykryto wlaczenie: czujnik gora");ZapalWszystkieSzybko();break;}
 if (digitalRead(przyciskGora)==LOW) {Serial.println("Wykryto wlaczenie: przycisk gora");ZapalWszystkieSzybko();break;}
 if (digitalRead(czujnikDol)==1) {Serial.println("Wykryto wlaczenie: czujnik dol");ZapalWszystkieSzybko();break;}
 if (digitalRead(przyciskDol)==LOW) {Serial.println("Wykryto wlaczenie: przycisk dol");ZapalWszystkieSzybko();break;}
 
 Zgas(n);
}
}
void ZapalzDoluDoGory(){
for (int n=2;n<12;n++) {
 if (digitalRead(czujnikGora)==1) {ZapalWszystkieSzybko(); ;break;}
 if (digitalRead(przyciskGora)==LOW) {ZapalWszystkieSzybko(); break;}
 
 Zapal(n);
}
kinkiet(1);
}
void ZapalzGoryNaDol(){
for (int m=11;m>1;m--) {
 if (digitalRead(czujnikDol)==1) {ZapalWszystkieSzybko(); break;}
 if (digitalRead(przyciskDol)==LOW) {ZapalWszystkieSzybko(); break;}
 Zapal(m);
 }
 kinkiet(1);
}
int Zgas(int pin){
int fadeValue=255;
while (fadeValue>1) {
 unsigned long currentMillis = millis();
 if(currentMillis - previousMillis > fadetime) {
 previousMillis = currentMillis;
 
 if (StanLed[pin-2]==1) analogWrite(pin, fadeValue);
 if (fadeValue<64) fadetime=7;else fadetime=3;
 fadeValue-=3;
 
 }
 
 }
 analogWrite(pin, 0);
 Serial.print("- Zgaszono: ");
 Serial.println(pin-1);
 StanLed[pin-2]=0;
}
void Waz () {
for (int n=2;n<12;n++) {
if (n%2==0) analogWrite(n,255);else analogWrite(n,0);
}
delay(500);
for (int n=2;n<12;n++) {
if (n%2==1) analogWrite(n,255); else analogWrite(n,0);
}
delay(500);
}
void Demo1() {
for (int n=2;n<12;n++) {
for (int fadeValue=0;fadeValue<255;fadeValue+=5){
 if (digitalRead(przyciskDol)==LOW) { PartyMode=false; ZmianaTrybu(); break;}
 analogWrite(n, fadeValue);
 delay(1);
}
 analogWrite(n, 0);
}
for (int n=11;n>1;n--) {
for (int fadeValue=0;fadeValue<255;fadeValue+=5){
 if (digitalRead(przyciskDol)==LOW) { PartyMode=false; ZmianaTrybu();break; }
 analogWrite(n, fadeValue);
 delay(1);
}
 analogWrite(n, 0);
}
 
}
void Demo2() {
for (int n=2;n<12;n++) {
 if (digitalRead(przyciskDol)==LOW) { PartyMode=false; ZmianaTrybu(); break;}
 analogWrite(n,255);
 analogWrite(n-1,64);
 analogWrite(n-2,32);
 analogWrite(n-3,2);
 
 
 delay(170);
 
}
}
void Demo4() {
for (int n=11;n>0;n--) {
 if (digitalRead(przyciskDol)==LOW) { PartyMode=false; ZmianaTrybu();break; }
 analogWrite(n,255);
 analogWrite(n+1,100);
 analogWrite(n+2,40);
 analogWrite(n+3,0);
 
 
 delay(170);
 
}
}
void Demo3(){
 
 for (int o=0;o<255;o++) {
 if (digitalRead(przyciskDol)==LOW) { PartyMode=false; ZmianaTrybu();break; }
 for (int k=2;k<12;k++) analogWrite(k,o);
 delay(2);
 }
 for (int o=255;o>0;o--) {
 if (digitalRead(przyciskDol)==LOW) { PartyMode=false; ZmianaTrybu();break; }
 for (int k=2;k<12;k++) analogWrite(k,o);
 delay(2);
 }
 
 
 
}
void ZmianaTrybu(){
ZgasWszystkieSzybko();
delay(500);
for (int a = 0 ; a<16; a++) {
ZapalWszystkieSzybko(); delay(100); ZgasWszystkieSzybko();delay(100);
}
delay(1000);
}
Facebook - komentarze