Моя светодиодная лента не выключается
/*
* when it's bright the lights will turn off
* when it's dark the lights will glow blue and green
* when it is in between, the lights will turn red
*/
#include <Adafruit_NeoPixel.h>
#ifdef _AVR_
#include <avr/power.h> //требуется для 16 МГц adafruit trinket
#endif
//какой контакт на Arduino подключен к пикселям neo?
#define PIN 7
//сколько neoPixel подключено к arduino
#define NUMPIXELS 10 //популярный размер кольца NeoPixel
//при настройке библиотеки neoPixel мы сообщаем ей, сколько пикселей и какой пин использовать для отправки сигналов.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int photoPin = A0;
int pin7 = 7;
void setup(){
Serial.begin(9600); //включить последовательный монитор
pixels.begin(); //ИНТИАЛИЗИРУЕМ объект полосы NeoPixel (ОБЯЗАТЕЛЬНО)
}
void loop() {
pixels.clear(); //установить все цвета пикселей на 'off'
int lightRaw = analogRead (photoPin); //получаем показания из photoPin и помещаем их в новый контейнер с именем lightRaw
int light = map(lightRaw, 1023, 0, 10, 0); //берем переменную lightEaw и преобразуем ее в значение от 0 до 10.
Serial.println("the current light level is:"); //вывести это сообщение на последовательный монитор
Serial.println(light); //вывести переменную light на последовательный монитор
if(light <4){
//pixels.color() принимает значения RGB от 0,0,0 до 255,255,255
pixels.clear(); //установить все цвета пикселей на 'off'
pixels.setPixelColor(0, pixels.Color(255, 252, 222));
pixels.setPixelColor(1, pixels.Color(255, 252, 222));
pixels.setPixelColor(1, pixels.Color(255, 252, 222));
pixels.setPixelColor(3, pixels.Color(255, 252, 222));
pixels.setPixelColor(4, pixels.Color(255, 252, 222));
pixels.setPixelColor(5, pixels.Color(255, 252, 222));
pixels.setPixelColor(6, pixels.Color(255, 252, 222));
pixels.setPixelColor(7, pixels.Color(255, 252, 222));
pixels.setPixelColor(8, pixels.Color(255, 252, 222));
pixels.setPixelColor(9, pixels.Color(255, 252, 222));
pixels.show(); //отправляем обновленные цвета пикселей на оборудование
} else if(light <2) {
//pixels.color() принимает значения RGB от 0,0,0 до 255,255,255
pixels.clear(); //установить все цвета пикселей на 'off'
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.setPixelColor(1, pixels.Color(0, 0, 0));
pixels.setPixelColor(1, pixels.Color(0, 0, 0));
pixels.setPixelColor(3, pixels.Color(0, 0, 0));
pixels.setPixelColor(4, pixels.Color(0, 0, 0));
pixels.setPixelColor(5, pixels.Color(0, 0, 0));
pixels.setPixelColor(6, pixels.Color(0, 0, 0));
pixels.setPixelColor(7, pixels.Color(0, 0, 0));
pixels.setPixelColor(8, pixels.Color(0, 0, 0));
pixels.setPixelColor(9, pixels.Color(0, 0, 0));
pixels.show(); //отправляем обновленные цвета пикселей на оборудование
} else {
pixels.clear(); //установить все цвета пикселей на 'off'
pixels.show(); //отправить обновленные цвета пикселей на оборудование.
}
delay(1000); //небольшая задержка, чтобы программа не проверяла каждую миллисекунду.
}
@Sophie Dunn, 👍0
Обсуждение2 ответа
if(light <4){
// сделать что-то
}
else if(light <2){
// сделать что-то еще
}
else{
// сделать что-то еще
}
Если light низкий (например, 1), то первый тест пройден, а два других теста ничего не дают. В конце концов, 1 меньше 4 и меньше 2.
Вам нужно переосмыслить способ проведения тестов, возможно, изменив «меньше чем» на «больше чем», что будет иметь больше смысла.
Возможно, дело не только в этом. Код в последнем блоке else выполнится, когда light >= 4. Похоже, этот код предназначен для выключения света. Конечно, автор оригинального поста не проводил тестирования в таких условиях и, следовательно, не видел выключения света. Возможно также, что код неисправен. Отсюда и предостережение в моём комментарии выше., @6v6gt
Вам нужно будет что-то переставить. Если уровень света > 4, выключите свет, если > 2, включите синий и зелёный, иначе включите красный., @Nick Gammon
Проблема неоднозначных значений может быть решена всего одной перестановкой строки кода. Просто отталкиваясь от первого ответа. Попробуйте:
if(light <2){
// сделать что-то
}
else if(light <4){
// сделать что-то еще (в зависимости от значений от 2 включительно до 4 (не включительно)
}
else{
// сделать что-то еще (в зависимости от значений 4 и выше)
}
В противном случае значения меньше 4 удовлетворяют первому условию «if» слишком широко, и вы выполняете первое «что-то», что в некоторых случаях не соответствует вашим намерениям. Вариант Switch… — это альтернативный способ достижения цели.
Вы можете варьировать направления при тестировании значений, но лучше двигаться в одном направлении. Также работает и противоположное предложенному:
Больше 4?
Больше или равно 2?
Все остальное (которое здесь <2).
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.
- Адресная RGB-полоса работает по отдельности, но не может настроить все светодиоды на полностью белый цвет.
- Настройка 10 RGB-лент независимо от одного Arduino
- Светодиодная лента WS2812B + First Pixel продолжает ломаться
- ESP32 + Фастлед + WS2801
- FastLED fill_rainbow - Неожиданный красный пиксель
- Использование аккумуляторов 18650 с повышающим преобразователем 3,7 В в 5 В.
какой у вас конкретный вопрос? ... пожалуйста, добавьте в свой пост конкретный вопрос, на который можно ответить, @jsotola
сократите свой код до простейшей программы, которая включает один светодиод на одну секунду, выключает на одну секунду, а затем повторяет, @jsotola
Это бессмысленно, так как
else if(light <2)следует заif(light <4), потому что никогда не выполнится. Вероятно, вы хотите поменять условия местами для случая, когдаlightнаходится между 2 и 4. Хотя, возможно, это не ваша главная проблема., @6v6gtДа ладно, @jsotola, в теме письма ясно указано, что светодиоды не выключаются, и, глядя на код, становится понятно, почему. Если не хотите читать пост, не тратьте время на комментарии. Вопрос стоит так: «Почему мои светодиоды не выключаются?», но он сформулирован не совсем так., @Nick Gammon
@NickGammon вопрос также может звучать так: «как мне это отладить?», @jsotola
Я думаю, вам нужно опубликовать некоторые номера моделей, схемы электропроводки и т. д., @Rohit Gupta
Больше никакой информации не требуется. Как сказал Ник, ответ очевиден, если немного изучить код. И действительно ли нам нужны слишком многословные заголовки? В английском языке, если вы говорите кому-то: «У меня не работают фары в машине», обычно можно с уверенностью предположить (в 99,9% случаев), что вам нужна помощь. Так стоит ли нам скармливать неявный вопрос «как это отладить?»?, @Greenonline
Это не решение, но
int pin7 = 7;должно бытьint pin7 = PIN;. Вы создали#define, так что используйте его., @Greenonline