Функция выхода Arduino Adalight после тайм-аута

Я работаю над проектом с Arduino и Ledstrip. Я делаю комбинацию Philips Ambilight и Philips оттенка на одной полосе. Я использую кнопки для переключения между Hue и Ambilight, для этого я использую код adalight.

Я могу переключиться с Hue (color();) на функцию ambilight, но не обратно с adalight на функцию color, когда функция ambilight не получает ответ от обработки. Кажется, он остается в функции ambilight. когда он не получает ответа, начинает работать следующий фрагмент кода:

// If no data received for an extended time, turn off all LEDs.
              if((t - lastByteTime) > serialTimeout) {
                memset(leds, 0,  NUM_LEDS * sizeof(struct CRGB)); //filling Led array by zeroes
                FastLED.show();
                lastByteTime = t; // Reset counter
              }

Я много чего перепробовал, но ничего не получается. Итак, мой вопрос: как выйти из функции amblight и вернуться к функции цвета?

void loop() {
  if(state == 0){
    color();
  }

  if(state == 1){
     ambilight(); 
  }
}

void color(){
  for (i=0; i< strip.numPixels(); i++){
    strip.setPixelColor(i, 255,0,0);
    }
  strip.show();
}    

void ambilight(){
      button();
      uint8_t
        buffer[256],
      indexIn       = 0,
      indexOut      = 0,
      mode          = 0,
      hi, lo, chk, i, spiFlag;
      int16_t
        bytesBuffered = 0,
      hold          = 0,
      c;
      int32_t
        bytesRemaining;
      unsigned long
        startTime,
      lastByteTime,
      lastAckTime,
      t;
      int32_t outPos = 0;

      startTime    = micros();
      lastByteTime = lastAckTime = millis();

      for(;;) {

        // Implementation is a simple finite-state machine.
        // Regardless of mode, check for serial input each time:
        t = millis();
        if((bytesBuffered < 256) && ((c = Serial.read()) >= 0)) {
          buffer[indexIn++] = c;
          bytesBuffered++;
          lastByteTime = lastAckTime = t; // Reset timeout counters
        } 
        else {
          // No data received.  If this persists, send an ACK packet
          // to host once every second to alert it to our presence.
          if((t - lastAckTime) > 1000) {
            Serial.print("Ada\n"); // Send ACK string to host
            lastAckTime = t; // Reset counter
          }
          // If no data received for an extended time, turn off all LEDs.
          if((t - lastByteTime) > serialTimeout) {
            memset(leds, 0,  NUM_LEDS * sizeof(struct CRGB)); //filling Led array by zeroes
            FastLED.show();
            lastByteTime = t; // Reset counter
          }
        }

        if(mode == 0){

          // In header-seeking mode.  Is there enough data to check?
          if(bytesBuffered >= HEADERSIZE) {
            // Indeed.  Check for a 'magic word' match.
            for(i=0; (i<MAGICSIZE) && (buffer[indexOut++] == magic[i++]););
            if(i == MAGICSIZE) {
              // Magic word matches.  Now how about the checksum?
              hi  = buffer[indexOut++];
              lo  = buffer[indexOut++];
              chk = buffer[indexOut++];
              if(chk == (hi ^ lo ^ 0x55)) {
                // Checksum looks valid.  Get 16-bit LED count, add 1
                // (# LEDs is always > 0) and multiply by 3 for R,G,B.
                bytesRemaining = 3L * (256L * (long)hi + (long)lo + 1L);
                bytesBuffered -= 3;
                outPos = 0;
                memset(leds, 0,  NUM_LEDS * sizeof(struct CRGB));
                mode           = 1; // Proceed to latch wait mode
              } 
              else {
                // Checksum didn't match; search resumes after magic word.
                indexOut  -= 3; // Rewind
              }
            } // else no header match.  Resume at first mismatched byte.
            bytesBuffered -= i;
          }
        } 

       if (mode == 1){
          if(bytesRemaining > 0) {
            if(bytesBuffered > 0) {
              if (outPos < sizeof(leds))
                ledsRaw[outPos++] = buffer[indexOut++];   // Issue next byte
              bytesBuffered--;
              bytesRemaining--;
            }
            // If serial buffer is threatening to underrun, start
            // introducing progressively longer pauses to allow more
            // data to arrive (up to a point).
          } 
          else {
            // End of data -- issue latch:
            startTime  = micros();
            mode       = 0; // Begin next header search
            FastLED.show();
          }
        }

      } // end for(;;)
    }

0 ответов

Другие вопросы по тегам