Всем привет, можно сказать только начал программировать на ардуине, никакого опыта ранее не было, немного побаловался со светодиодами, вентиляторами и всякими датчиками, теперь хочу реализовать более конкретный проект. Суть: хочу по ультразвуковому датчику плавно включать подсветку, затем по истечению времени плавно ее выключать, все скетчи подсветки лестниц, которые были обнаружены в интернете, как то резко все включают, да и хотелось все таки поэкспериментировать и самому попрактиковаться, поэтому код писал с нуля. Пока ультразвуковым датчиком не обладаю, для экспериментов использую кнопку, чувствую что код кривой, но самое интересное что все вроде как работает, хотя и не легко мне дался. Прошу помощи оптимизации кода, замечания, ошибки и тд. строго не судите, и прошу поподробнее выдавайте ценные указания, не забывайте, что я в этом деле новичок ))) Код (C++): int POT_PIN = A0; // пин потенциометра int downSensor = 12; // датчик-кнопка int brightness[6]; // переменные яркости для каждого LED пина int LED[6] = {2,3,4,5,6,7}; // LED пины int reg_speed = 3; // скорость увеличение яркости светодиодов int fade_speed = 1; void setup(){ pinMode(downSensor, INPUT); for (int i = 1; i <= 6; i++) { pinMode(LED[i], OUTPUT); Serial.begin(9600); } } void ledFadeIn(int n) { // создаем функцию увеличения яркости светодиода int x = analogRead(POT_PIN); int y = map (x, 0, 1000, 255, 0); y = constrain (y, 0, 255); // текущее значение потенциометра brightness[n] = y; for (brightness[n]; brightness[n] <= 255; brightness[n]=brightness[n]+reg_speed) { // яркость увеличивается до максимума analogWrite(LED[n], brightness[n]); delay(fade_speed); Serial.println(brightness[n]); } } void ledFadeOut(int n) { // создаем функцию уменьшения яркости светодиода int x = analogRead(POT_PIN); int y = map (x, 0, 1000, 255, 0); y = constrain (y, 0, 255); // текущее значение потенциометра for (brightness[n]=255; brightness[n] >= y; brightness[n]=brightness[n]-reg_speed) { // яркость уменьшается до значения потенциометра if (brightness[n] < reg_speed) { // в случае если значение потенциометра = 0 цикл не останавливался на 0, а продолжал вычитать из 65535 analogWrite(LED[n], y); } else { analogWrite(LED[n], brightness[n]); delay(fade_speed); Serial.println(brightness[n]); } } } void loop() { int x = analogRead(POT_PIN); int y = map (x, 0, 1000, 255, 0); y = constrain (y, 0, 255); // текущее значение потенциометра for (int i = 0; i <= 5; i++) { analogWrite(LED[i], y); // включаем светодиоды по значению потенциометра Serial.println(y); } if (digitalRead(downSensor) == HIGH) { // если срабатывает датчик for (int i = 1; i <= 4; i++) { brightness[i] = y; } for (int i = 0; i <=5; i++) { ledFadeIn(i); // зажигаем светодиды } delay(1000); for (int i = 0; i <=5; i++) { ledFadeOut(i); // гасим светодиды } } }
на UNO плавное включение (ШИМ) поддерживают только пины 3, 5, 6, 9, 10, и 11. Ну и немного оптимизации: Код (C++): #define POT_PIN A0; // пин потенциометра #define SENSOR_PIN 12; // датчик-кнопка int brightness[6]; // переменные яркости для каждого LED пина byte LED[6] = {3,5,6,9,10,11}; // LED пины byte reg_speed = 3; // скорость увеличение яркости светодиодов byte fade_speed = 1;
а зачем для пинов занимать в памяти диапазон 0...65535, если пинов максимум 54? А у byte диапазон 0...255. Блум протупил этот момент в своих уроках, теперь все по его примерам так и лепят...
они не избыточны, Serial.begin(9600) нужно из цыкла вывести, например после фигурных скобочек поставить.
в такой конструкции Код (C++): for (int i = 1; i <= 6; i++) { pinMode(LED[i], OUTPUT); } фигурные скобочки лишние, достаточно писать Код (C++): for (int i = 1; i <= 6; i++) pinMode(LED[i], OUTPUT); Хотя если их автоматом расставлять везде, это иногда убережет от непонятного поведения программы. А иногда приводит к ситуациям, как выше.
Ага, логику понял, спасибо Serial.begin(9600) в цикле, это я понял, сам тупанул подскажите как реализовать такой же алгоритм работы, но не используя delay( ) при задержке между включением и выключением подсветки? Как я понял из всяких обучалок, delay() довольно вредная функция. В дальнейшем планируется прикрутить еще некоторые датчики, возможно мне конечно не надо будет постоянно считывать с них данные, но просто для понимания
ну например вот так, вызывая нужные процедуры и функции по истичении некоторого времени... Код (C++): long timeToUpdate=0; void setup() { // put your setup code here, to run once: Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: if (millis() >= timeToUpdate) { Serial.println("Делаем чего то на "); Serial.print(millis()); Serial.println(" милисекунде."); timeToUpdate += 6000; } }