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:
- Do modułu irf520 podłączamy do pinów arduino – sygnał (wpinamy kolejno do arduino do pinów od 2 do 11), +5v, masa
- Do IRF520 do złącz po prawej stronie VIN i GND podłączamy zasilanie ledów / taśmy – o napięciu 12v.
- 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?
- 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.
- tryb party 🙂
- 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); }