Пробую програмировать в первый раз. Задумка такая: Лампа - реагирует на хлопки. Есть два режима: Рабочий(когда светит ярко белым) и режим отдыха Цветной(когда светит цветным). Рабочий режим включается по хлопку. Цветной режим основной(стартовый). Лампа не выключется, работает постоянно. Рабочий режим через некоторое время работы автоматический возвращается в цветной режим. Цветной режим, периодический уходит сон(тусколый свет), после возвращается обратно. ПРОБЛЕМА: Лампа, после загрузки кода на ардуино не включается сама(не горит). После хлопка горит белым, не меняет ни цвет, ни яркость ВООБЩЕ! Помогите, кто может, в чем проблема в коде?! С подключением все впрорядке. Совсем не понимаю в чем причина .. Вот код: Код (C++): #include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h> //adafruit driver should be included into library as .ZIP #ifdef __AVR__ #include <avr/power.h> #endif // Which pin on the Arduino is connected to the NeoPixels? // On a Trinket or Gemma we suggest changing this to 1 #define PIN 10 // How many NeoPixels are attached to the Arduino? #define NUMPIXELS 12 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // Arduino pin numbers const int DO_pin = 2; //Digital pin 2 const int AO_pin = 0; //Analogue pin 0 int sound; int led1 = 10; //adafruit neopixel LED = Digital 10 // это массив задержек между переключениями состояния системы ( в милисекундах) unsigned long delays[] = { // Состояние White cделано по аналогии с RGB только в обратную сторону. 1200000UL, 180000UL, 15000UL, // RGB состояние, оно же стартовое 480000UL, 15000UL, 240000UL, 180000UL }; const int RGB_START_STATE = 3; // начальное состояние const int WHITE_DISABLED = 5; // без возможности переключения обратно посредством хлопка. int currentState = RGB_START_STATE; // текущее состояние системы unsigned long startPhase = 0; // это число милисекунд с начала работы программы, в момент изменения состояния. Переполнится за 50 дней если хелп не врет. void setup() { pinMode(DO_pin, INPUT); //Sound is at Digital pin 0 !!!!!!!!!!!!!!!!!!!!!!!!!!!! pinMode(led1, OUTPUT); //neopixel LED is at digital 10 Serial.begin(9600); currentState = RGB_START_STATE; startPhase = millis(); strip.begin(); strip.show(); // Initialize all pixels to 'off' !!!!!!!!!!!!!!!!!!!!!!!!!!!!! } void loop() { sound = analogRead(AO_pin); //sound is detected with Sound Sensor at Analog pin 0. //When sound is louder, number gets smaller******** if (sound < 500) { //When sound sensor detects sound less than 500, delay(500); //it pauses for .5 seconds so that commands are read if (currentState != WHITE_DISABLED) { // без возможности переключения обратно посредством хлопка. currentState = 0; // Хлопок переводит ее из обычного осотояния, в состояние свечения белым светом, ярко. startPhase = millis(); playCurrentPhase(); } } unsigned long currentTick = millis(); if (currentTick - startPhase > delays[currentState]) { // время текущей фазы истекло, переключаемся startPhase = currentTick; currentState++; if (currentState == sizeof(delays)) currentState = RGB_START_STATE; // дошли до конца программы, возвращаемся в стартовое состояние playCurrentPhase(); } } void rainbow(uint8_t wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, Wheel((i+j) & 255)); } strip.show(); delay(wait); } } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, c); strip.show(); delay(wait); } } void colorSet(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, c); delay(wait); } strip.show(); } void playCurrentPhase() { switch(currentState){ case 0: colorWipe(strip.Color(255, 255, 255),50); // white break; case 1: strip.setBrightness(128); break; case 2: strip.setBrightness(64); break; case 3: colorWipe(strip.Color(79, 240, 231),50); break; case 4: colorWipe(strip.Color(79, 240, 98),50); delay(200); colorWipe(strip.Color(204, 239, 11),50); delay(200); colorWipe(strip.Color(239, 167, 11),50); break; case 5: rainbow(40); break; case 6: colorSet(strip.Color(241, 15, 137),50); break; } } Заранее большое спасибо за вашу помощь)
Плодите тему? А вообще надо вникать в логику, чтобы понять почему не работает. Это требует времени, которого у меня, например, мало, как и многих тут. Для начала упростите нам задачу, а именно сузьте круг возможных причин. Например, обойдите цветные шоуэффекты, обрабатываемые аж специальной библиотекой, и сделайте просто вкл-выкл по хлопкам и по времени при тех же условиях.
Если мне правильно подсказывает небольшое знание языка то вот тут void playCurrentPhase(){ должна еще приниматься какая либо переменная и соответственно в коде она должна передаваться, иначе у Вас постоянно выполняется условие что переменная = 0 и соответственно лампа горит только белым, хотя могу и ошибаться т.к. код не проверял а просто пробежался по нему, почитал.