Не понимаю почему код не работает!(

Тема в разделе "Arduino & Shields", создана пользователем AlinaR, 8 май 2016.

  1. AlinaR

    AlinaR Нуб

    Пробую програмировать в первый раз.
    Задумка такая:
    Лампа - реагирует на хлопки. Есть два режима: Рабочий(когда светит ярко белым) и режим отдыха Цветной(когда светит цветным). Рабочий режим включается по хлопку. Цветной режим основной(стартовый). Лампа не выключется, работает постоянно. Рабочий режим через некоторое время работы автоматический возвращается в цветной режим. Цветной режим, периодический уходит сон(тусколый свет), после возвращается обратно.
    ПРОБЛЕМА: Лампа, после загрузки кода на ардуино не включается сама(не горит). После хлопка горит белым, не меняет ни цвет, ни яркость ВООБЩЕ!

    Помогите, кто может, в чем проблема в коде?! С подключением все впрорядке. Совсем не понимаю в чем причина ..
    Вот код:
    Код (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;
      }
    }
    Заранее большое спасибо за вашу помощь)
     
  2. ostrov

    ostrov Гуру

    Плодите тему?

    А вообще надо вникать в логику, чтобы понять почему не работает. Это требует времени, которого у меня, например, мало, как и многих тут. Для начала упростите нам задачу, а именно сузьте круг возможных причин. Например, обойдите цветные шоуэффекты, обрабатываемые аж специальной библиотекой, и сделайте просто вкл-выкл по хлопкам и по времени при тех же условиях.
     
  3. Benny_Ray

    Benny_Ray Нерд

    Если мне правильно подсказывает небольшое знание языка то вот тут

    void playCurrentPhase(){

    должна еще приниматься какая либо переменная и соответственно в коде она должна передаваться, иначе у Вас постоянно выполняется условие что переменная = 0 и соответственно лампа горит только белым, хотя могу и ошибаться т.к. код не проверял а просто пробежался по нему, почитал.