Voting resources, early voting, and poll worker information - VOTE. ... Adafruit is open and shipping.
0

Timed LED Light On/Off
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Timed LED Light On/Off

by booyah323 on Fri Jul 31, 2020 6:59 am

Hey no one responded to my 2nd question on my 1st post so I'm assuming I should create a new topic after my first one-I hope this is fine:

I read through the Adafruit Neopixel library and implemented the change I was recommended by an admin (change to my relay function code to program my Neopixels to pulsate for 3 ms every 8 seconds). However, I have one last problem. The change to the code I inserted is actually messing with my LCD now. I can usually navigate between three screen with three buttons however, now I can't get to the other screens with the buttons at all and also the time doesn't change from second to second-it jumps up by 5 seconds every 5 seconds which it shouldn't be doing. I'll post the snippet of code for the original relay function:

Code: Select all | TOGGLE FULL SIZE
//----Relay Function----//
if(onhour1 == offhour1 && onmin1==offmin1 && onsec1==offsec1){
   digitalWrite(Relay, LOW);
}

if(on_Time1 < off_Time1){
 
             if(Time >= on_Time1 && Time < off_Time1){  //Start
             digitalWrite(Relay, HIGH);
             }
             else if(Time >= off_Time1) {
             digitalWrite(Relay, LOW);
             }
             else{
             digitalWrite(Relay, LOW);
             }
}
if (on_Time1 > off_Time1){

            if(Time >= on_Time1 && Time <= 235959){     //Start
            digitalWrite(Relay, HIGH);
            }
            else if(Time < off_Time1 ){
            digitalWrite(Relay, HIGH);
            }
            else if(Time >= off_Time1 && Time < on_Time1){
            digitalWrite(Relay, LOW);
            }
}


}//void loop




And the updated code for the Neopixels:


Code: Select all | TOGGLE FULL SIZE
 //----Relay Function----//
  if (onhour1 == offhour1 && onmin1 == offmin1 && onsec1 == offsec1) {
    pixels->clear();
    for (int i = 0; i < numPixels; i++) { // For each pixel...
      pixels->setPixelColor(i, pixels->Color(0, 0, 0));
      pixels->show();
      delay(DELAYVAL);

    }

    if (on_Time1 < off_Time1) {

      if (Time >= on_Time1 && Time < off_Time1) { //Start
        pixels->clear();
        for (int i = 0; i < numPixels; i++) { // For each pixel...
          pixels->setPixelColor(i, pixels->Color(0, 0, 0));
          pixels->show();
          delay(8000);

          pixels->clear();
          for (int i = 0; i < numPixels; i++) { // For each pixel...
            pixels->setPixelColor(i, pixels->Color(255, 255, 255));
            pixels->show();
            delay(3);
          }}
      } else if (Time >= off_Time1) {
            pixels->clear();
            for (int i = 0; i < numPixels; i++) { // For each pixel...
              pixels->setPixelColor(i, pixels->Color(0, 0, 0));
              pixels->show();
              delay(DELAYVAL);
            }}
            else {
              pixels->clear();
              for (int i = 0; i < numPixels; i++) { // For each pixel...
                pixels->setPixelColor(i, pixels->Color(0, 0, 0));
                pixels->show();
                delay(DELAYVAL);
              }
            }
            if (on_Time1 > off_Time1) {

              if (Time >= on_Time1 && Time <= 235959) {   //Start
                pixels->clear();
                for (int i = 0; i < numPixels; i++) { // For each pixel...
                  pixels->setPixelColor(i, pixels->Color(0, 0, 0));
                  pixels->show();
                  delay(8000);

                  pixels->clear();
                  for (int i = 0; i < numPixels; i++) { // For each pixel...
                    pixels->setPixelColor(i, pixels->Color(255, 255, 255));
                    pixels->show();
                    delay(3);
                  }}
              }else if (Time < off_Time1 ) {
                    pixels->clear();
                    for (int i = 0; i < numPixels; i++) { // For each pixel...
                      pixels->setPixelColor(i, pixels->Color(0, 0, 0));
                      pixels->show();
                      delay(8000);

                      pixels->clear();
                      for (int i = 0; i < numPixels; i++) { // For each pixel...
                        pixels->setPixelColor(i, pixels->Color(255, 255, 255));
                        pixels->show();
                        delay(3);
                      }}
                  }else if (Time >= off_Time1 && Time < on_Time1) {
                        pixels->clear();
                        for (int i = 0; i < numPixels; i++) { // For each pixel...
                          pixels->setPixelColor(i, pixels->Color(0, 0, 0));
                          pixels->show();
                          delay(DELAYVAL);
                        }}
                      }}


  }}//void loop



I made sure to confirm that the problem is absolutely the relay function code change and nothing else. I spent some hours trying to isolate the issue but I cannot figure this out. The relay function code just writes high or low power states to the 13th digital pin of my arduino at specific times dictated by my RTC. Why would changing that code affect my LCD? Here's the LCD code btw:


Code: Select all | TOGGLE FULL SIZE
//--------Show  Time On LCD

lcd.setCursor(7,1);                 
if(now.hour() < 10)
{
lcd.print("0");
}
lcd.print(now.hour(), DEC); //Print hour
lcd.print(':');
if(now.minute() < 10)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC); //Print min
lcd.print(':');
if(now.second() < 10)
{
lcd.print("0");
}
lcd.print(now.second(), DEC); //Print sec
    //case 1
    break;

    case 2:                   //Content and functions of page 2
      lcd.setCursor(0,0);
      lcd.print("T1");
      lcd.setCursor(3,0);
      lcd.print("ON");
      lcd.setCursor(1,1);
      lcd.write(byte(1));
      lcd.setCursor(3,1);
      lcd.print("OFF");

            lcd.setCursor(7,0);    //Printing on/off values
            if(onhour1<10){
              lcd.print("0");
            }
            lcd.print(onhour1);
            lcd.setCursor(10,0);
            if(onmin1<10){
              lcd.print("0");
            }
            lcd.print(onmin1);
            lcd.setCursor(13,0);
            if(onsec1<10){
              lcd.print("0");
            }
            lcd.print(onsec1);
            lcd.setCursor(7,1);
            if(offhour1<10){
              lcd.print("0");
            }
            lcd.print(offhour1);
            lcd.setCursor(10,1);
            if(offmin1<10){
              lcd.print("0");
            }
            lcd.print(offmin1);
            lcd.setCursor(13,1);
            if(offsec1<10){
              lcd.print("0");
            }
            lcd.print(offsec1);
                       
//--------------Modifying on/off values-------//
     // Sub counter control
     if (last_sel== LOW && current_sel == HIGH){ //select button pressed
      if(subpage1_counter <7){                    // subpage counter never higher than 7 (total of items)
     subpage1_counter ++;                         //subcounter to move beetwen submenu
     }
     else{                                       //If subpage higher than 7 (total of items) return to first item
      subpage1_counter=1;
     }
     }
     last_sel=current_sel;                      //Save last state of select button

     //First item control(subpage_counter =1) onhour1
     if(subpage1_counter==1){
     lcd.setCursor(0,1);         //Delete last arrow position (back)
     lcd.print(" ");                                         
     lcd.setCursor(6,0);          //Place arrow in front of selected item
     lcd.write(byte(2));         
     //Move item + or -
     if (last_up== LOW && current_up == HIGH){  //Up
      if(onhour1 < 23){
     onhour1 ++;
      }
      else{
     onhour1 =0;
      }
     }
     last_up=current_up;
     
     if(last_down== LOW && current_down == HIGH){//Down
     if(onhour1 >0){
      onhour1 --;
     }
     else{
      onhour1=23;
     }
     }
     last_down=current_down;
    }//subpage1_counter 1

     //Second item control(subpage_counter =2) onmin1
     if(subpage1_counter==2){
     lcd.setCursor(6,0);         //Delete last arrow position (onhour1)
     lcd.print(" ");                                         
     lcd.setCursor(9,0);          //Place arrow in front of selected item
     lcd.write(byte(2));         
     //Move item + or -
     if (last_up== LOW && current_up == HIGH){  //Up
      if(onmin1 < 59){
     onmin1 ++;
      }
      else{
     onmin1 =0;
      }
     }
     last_up=current_up;
     
     if(last_down== LOW && current_down == HIGH){//Down
     if(onmin1 >0){
      onmin1 --;
     }
     else{
      onmin1=59;
     }
     }
     last_down=current_down;
    }//subpage1_counter 2
   
     //Thirth item control(subpage_counter =3) onsec1
     if(subpage1_counter==3){
     lcd.setCursor(9,0);         //Delete last arrow position (onmin1)
     lcd.print(" ");                                       
     lcd.setCursor(12,0);          //Place arrow in front of selected item
     lcd.write(byte(2));         
     //Move item + or -
     if (last_up== LOW && current_up == HIGH){  //Up
      if(onsec1 < 59){
     onsec1 ++;
      }
      else{
     onsec1 =0;
      }
     }
     last_up=current_up;
     
     if(last_down== LOW && current_down == HIGH){//Down
     if(onsec1 >0){
      onsec1 --;
     }
     else{
      onsec1=59;
     }
     }
     last_down=current_down;
    }//subpage1_counter 3

     //fourth item control(subpage_counter =4) offhour1
     if(subpage1_counter==4){
     lcd.setCursor(12,0);         //Delete last arrow position (onsec1)
     lcd.print(" ");                                         
     lcd.setCursor(6,1);          //Place arrow in front of selected item
     lcd.write(byte(2));         
     //Move item + or -
     if (last_up== LOW && current_up == HIGH){  //Up
      if(offhour1 < 23){
     offhour1 ++;
      }
      else{
     offhour1 =0;
      }
     }
     last_up=current_up;
     
     if(last_down== LOW && current_down == HIGH){//Down
     if(offhour1 >0){
      offhour1 --;
     }
     else{
      offhour1=23;
     }
     }
     last_down=current_down;
    }//subpage1_counter 4

     //fifth item control(subpage_counter =5) offmin1
     if(subpage1_counter==5){
     lcd.setCursor(6,1);         //Delete last arrow position (offhour1)
     lcd.print(" ");                                         
     lcd.setCursor(9,1);          //Place arrow in front of selected item
     lcd.write(byte(2));         
     //Move item + or -
     if (last_up== LOW && current_up == HIGH){  //Up
      if(offmin1 < 59){
     offmin1 ++;
      }
      else{
     offmin1 =0;
      }
     }
     last_up=current_up;
     
     if(last_down== LOW && current_down == HIGH){//Down
     if(offmin1 >0){
      offmin1 --;
     }
     else{
      offmin1=59;
     }
     }
     last_down=current_down;
    }//subpage1_counter 5

     //sixth item control(subpage_counter =6) offsec1
     if(subpage1_counter==6){
     lcd.setCursor(9,1);         //Delete last arrow position (offmin1)
     lcd.print(" ");                                         
     lcd.setCursor(12,1);          //Place arrow in front of selected item
     lcd.write(byte(2));         
     //Move item + or -
     if (last_up== LOW && current_up == HIGH){  //Up
      if(offsec1 < 59){
     offsec1 ++;
      }
      else{
     offsec1 =0;
      }
     }
     last_up=current_up;
     
     if(last_down== LOW && current_down == HIGH){//Down
     if(offsec1 >0){
      offsec1 --;
     }
     else{
      offsec1=59;
     }
     }
     last_down=current_down;
    }//subpage1_counter 6
         

     //seventh item control(subpage_counter =7) back
     if(subpage1_counter==7){
     lcd.setCursor(12,1);         //Delete last arrow position (offsec1)
     lcd.print(" ");                                         
     lcd.setCursor(0,1);          //Place arrow in front of selected item
     lcd.write(byte(2));         
     //Move item + or -
     if (last_up== LOW && current_up == HIGH){  //Up
      lcd.setCursor(0,1);         //Delete last arrow position (back) to exit
      lcd.print(" ");
     subpage1_counter=0;         //Exit submenu. Up/down butons enabled to move main pages     
     }
     last_up=current_up;
     
     if(last_down== LOW && current_down == HIGH){//Down
      lcd.setCursor(0,1);         //Delete last arrow position (back)
      lcd.print(" ");
     subpage1_counter=1;         //Go to first item (onhour1)
     }
     last_down=current_down;
    }//subpage1_counter 7
    //case 2
    break;

    case 3:                //Page 3 display and functions
      lcd.setCursor(4,0);
      lcd.print("PRESS SEL");
      lcd.setCursor(5,1);
      lcd.print("TO SAVE");
     if (last_sel== LOW && current_sel == HIGH){  //select button pressed.Save settings to eeprom
  EEPROM.write(0, onhour1);
  EEPROM.write(1, onmin1);
  EEPROM.write(2, onsec1);
  EEPROM.write(3, offhour1);
  EEPROM.write(4, offmin1);
  EEPROM.write(5, offsec1);
  lcd.clear();                 //Print message "SAVED!"
  lcd.setCursor(5,1);
  lcd.print("SAVED!");
  delay(2000);
  lcd.clear();               //Clear lcd and go to main page
  page_counter=1;
     }
     last_sel=current_sel;  //Save last state of select button
     
    //Case 3
    break;
  }//switch


//-------------Conversion----------//

//---------Converting clock time into single number
 
Hour = now.hour();
Min = now.minute();
Sec = now.second();
Time = (Hour*10000+ Min*100 +Sec*1);

//--------Converting firt timer on/off into single number
on_hour1=onhour1;
on_min1=onmin1;
on_sec1=onsec1;
on_Time1=(on_hour1*10000 + on_min1*100 + on_sec1);

off_hour1=offhour1;
off_min1=offmin1;
off_sec1=offsec1;
off_Time1=(off_hour1*10000 + off_min1*100 + off_sec1);



I'd really appreciate anyone who could point me in the right direction because I've hit a brick wall. Just to reiterate, the goal of the Neopixel code I used is to make the light pulsate 3 ms every 8 seconds.

Thank you.

booyah323

booyah323
 
Posts: 7
Joined: Wed Jul 29, 2020 9:35 am

Re: Timed LED Light On/Off

by adafruit_support_bill on Fri Jul 31, 2020 7:15 am

You have a lot of nested loops with delays in them like this one:
Code: Select all | TOGGLE FULL SIZE
        for (int i = 0; i < numPixels; i++) { // For each pixel...
          pixels->setPixelColor(i, pixels->Color(0, 0, 0));
          pixels->show();
          delay(8000);

          pixels->clear();
          for (int i = 0; i < numPixels; i++) { // For each pixel...
            pixels->setPixelColor(i, pixels->Color(255, 255, 255));
            pixels->show();
            delay(3);
          }}


The delay function in an Arduino is a 'busy wait'. The processor can do nothing else during that delay. That means no checking of buttons and no updating of the display.

In order to keep things responsive, you will need to re-structure the code to eliminate the delays. We have a series of guides which explain how to do this:

https://learn.adafruit.com/multi-taskin ... 1/overview
https://learn.adafruit.com/multi-taskin ... 2/overview
https://learn.adafruit.com/multi-taskin ... 3/overview

adafruit_support_bill
 
Posts: 78758
Joined: Sat Feb 07, 2009 10:11 am

Re: Timed LED Light On/Off

by booyah323 on Fri Jul 31, 2020 7:44 am

Oh man, thank you. This is all I needed. You're awesome!

booyah323
 
Posts: 7
Joined: Wed Jul 29, 2020 9:35 am

Please be positive and constructive with your questions and comments.