И снова проект на Arduino: подсветка лестницы
Сей проект должен решить задачу подсветки лестницы в темноте при обнаружении движения одним из двух датчиков. Ну бонусом — кнопка принудительного включения и кнопка «новогодних эффектов». Подсветка осуществляется при адресной 5 вольтовой светодиодной ленты, с внешним питанием.
Разработку платы вёл традиционно в веб версии EasyEDA, Принципиальная схема получилась следующая:
А вот тут она-же, но уже в виде текстолитовой однослойной платы, которую вполне можно потравить и самому:
В «железе» пока еще готового варианта нет, детальки едут и Китая и прочих источников, но теоретическую модель в эмуляторе уже можно потрогать тут:
https://wokwi.com/projects/417413301092687873
Код следующий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#include <Adafruit_NeoPixel.h> #include <SPI.h> #include "button.h" button btn1(9); // указываем пин кнопки включения/выключения света button btn2(12); // указываем пин кнопки включения/выключения эффектов boolean button_state; // текущее состояние ленты по кнопке свет вкл/выкл boolean button_effect; // текущее состояние ленты по кнопке эффектов #define PIN_PHOTO_SENSOR A0 int pirPin1 = 3; int pirPin2 = 5; #define LED_COUNT 16 #define LED_PIN 7 Adafruit_NeoPixel LED_Ring = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() { pinMode(13, OUTPUT); pinMode(pirPin1, INPUT); pinMode(pirPin2, INPUT); button_state=false; LED_Ring.begin(); } void button_press(){ button_state=!button_state; if (button_state==true){ digitalWrite(13, HIGH); for (int i = 0; i < LED_COUNT; i++){ LED_Ring.setPixelColor(i, LED_Ring.Color(255,255, 0)); LED_Ring.show(); }; } else { digitalWrite(13, LOW); for (int i = 0; i < LED_COUNT; i++){ LED_Ring.setPixelColor(i, LED_Ring.Color(0,0, 0)); LED_Ring.show(); }; }; delay(1000); } // показываем всякие эффекты, пока снова не нажманута любая кнопка void button_effect_press(){ int randLed; int randR; int randG; int randB; while(true){ if (btn1.click()) {break;}; if (btn2.click()) {break;}; randLed = random(0, LED_COUNT); randR = random(0, 255); randG = random(0, 255); randB = random(0, 255); LED_Ring.setPixelColor(randLed, LED_Ring.Color(randR,randG, randB)); LED_Ring.show(); delay(100); } } void sleep(int ms){ unsigned long time_old; time_old = millis(); while(true){ if (btn1.click()) {button_press();}; if ((millis()- time_old) >= ms){ break; } }; } void loop() { while(true){ if (btn1.click()) {button_press();}; //нажата кнопка включения-выключения света if (btn2.click()) {delay(1000);button_effect_press();}; //нажата кнопка включения-выключения света int light_level = analogRead(PIN_PHOTO_SENSOR); // если >300, то считаем что и так светло light_level=100; // для отладки - потом убрать! int move1 = digitalRead(pirPin1); int move2 = digitalRead(pirPin2); if ((move1 == HIGH) or (move2 == HIGH)){ if (button_state==false){ // если свет не включен кнопкой if (light_level<250){ // если на леснице темно for (int i = 0; i < LED_COUNT; i++){ if (move1 == HIGH){ LED_Ring.setPixelColor(i, LED_Ring.Color(255, 0, 0)); // Красный цвет. } else { LED_Ring.setPixelColor(LED_COUNT-i-1, LED_Ring.Color(255, 0, 0)); // Красный цвет. }; LED_Ring.show(); sleep(300); if (button_state==true){break;}; }; if (button_state==false){ for (int i = 0; i < LED_COUNT; i++){ LED_Ring.setPixelColor(i, LED_Ring.Color(0, 0, 200)); }; LED_Ring.show(); sleep(6000); for (int i = 0; i < LED_COUNT; i++){ if (move1 == HIGH){ LED_Ring.setPixelColor(i, LED_Ring.Color(0, 0, 0)); // Красный цвет. } else { LED_Ring.setPixelColor(LED_COUNT-i-1, LED_Ring.Color(0, 0, 0)); // Красный цвет. }; LED_Ring.show(); sleep(300); if (button_state==true){break;}; }; }; } }; }; }; } |