Hello~
Here is my sketch for 2 string LED control.
I currently have a problem for sleep mode.
My sketch has no sleep mode when LED idle, so battery power consumption is too high.
I add " #include <Enerlib.h>" and "energy.PowerDown();" in sketch, but sketch can not work.
Any one can help me to verify how to improve the sketch.
The purpose is 328P goto sleep after 2 minutes if LED and charger no usage and press button to wake up.
In actually, I'm not sure sleep sketch and code position are correctly, but it can't go to sleep mode.
Thank you very much for your help!
#include <Wire.h>
#include <Enerlib.h>
Energy energy;
#define whiteLED_ON_OFF 5
#define yellowLED_ON_OFF 8
#define buttonPush 2
#define LEDdimming 3
#define Charge_detect A3 //電池充電
#define Discharge_detect 4 //USB放電按鈕
#define Vusb_out A7 // 偵測power bank 是否有在放電
#define read_Vbat A0
#define batval_1 9 //LED電量
#define batval_2 10 //LED電量
#define batval_3 11 //LED電量
#define batval_4 12 //LED電量
int button_bounce = 10; // 預防開關彈跳
int brightness_level_adj = 80 ; // 開關按下要大於80ms 才有動作
int brightness_level_timeout = 900 ;
int color_SEL_adj = 2000 ; // detect press BTN more than 2 second
int color_SEL_adj_timeout = 2100 ; // 0.5秒
int discharge_start = 3000 ; // 開關按下時間大於3S開始放電
int discharge_timeout = 4000 ; // 開關時間大於4S 不動做
int brightness_SEL = 0;
int color_SEL = 1 ;
int button_flag = 0;
int charge_flag = 0;
int BBB;
// ===========================Brightness adjuset for PWM output
//int brightness_100 = 250; //98%
int brightness_100 = 255; //100%
//int brightness_75 = 192 ; //75%
int brightness_75 = 128 ; //50%
int brightness_50 = 64 ; //50%
//int brightness_25 = 64 ; //25%
int brightness_25 = 32 ; //12%
int brightness_0 = 0 ; //0% , LED OFF
//================================Vbat status : 5V:1023 = Vbat_status:X
int Vbat_status_43 = 840; //4.3V
int Vbat_status_42 = 825; //4.2V
int Vbat_status_41 = 820; //4.1V
int Vbat_status_40 = 810; //4.0V
int Vbat_status_39 = 790; //3.9V
int Vbat_status_38 = 780; //3.8V
int Vbat_status_37 = 760; //3.7V
int Vbat_status_36 = 740; //3.6V
int Vbat_status_35 = 720; //3.5V
int Vbat_status_34 = 700; //3.4V
int Vbat_status_33 = 680; //3.3V
int Vbat_status_32 = 660; //3.2V
int Vbat_status_31 = 640; //3.1V
unsigned long startTime = 0; // 按鈕被按下的起始時間
unsigned long duration_time = 0; // 持續時間
unsigned long previousMillis = 0;
const long interval = 1000; //每次讀取電池的時間 : 1秒
unsigned long currentsleepTime = 0; // 休眠計時起始時間
unsigned long durationsleepTime = 120000; // 計時2分鐘
unsigned long previousseleepTime = 0;
void setup()
{
//CLKPR = 1 << CLKPCE;
//CLKPR = 8;// 将CPU速度设置为 16MHz / 256
//TCCR2A = 0b00100011; //62.5KHz
//TCCR2B = 0b00000001; //62.5KHz
//TCCR2A = 0b00100011; //1.92KHz
//TCCR2B = 0b00000011; //1.92KHz
TCCR2A = 0b00100011; // 975Hz
TCCR2B = 0b00000100; // 975Hz
attachInterrupt(0, wakeISR, LOW);
pinMode(whiteLED_ON_OFF, OUTPUT);
pinMode(yellowLED_ON_OFF, OUTPUT);
pinMode(LEDdimming, OUTPUT);
pinMode(buttonPush, INPUT);
pinMode(read_Vbat, INPUT);
pinMode(Charge_detect, INPUT);
pinMode(Discharge_detect, OUTPUT);
pinMode(Vusb_out, INPUT);
// battery voltage detect
pinMode(batval_1, OUTPUT);
pinMode(batval_2, OUTPUT);
pinMode(batval_3, OUTPUT);
pinMode(batval_4, OUTPUT);
digitalWrite (whiteLED_ON_OFF, LOW); // default, white LED is off
digitalWrite (yellowLED_ON_OFF, LOW); // default, yellow LED is off
digitalWrite (buttonPush, HIGH); // internal pull high
// digitalWrite (Charge_detect, HIGH); // default ACT2813 BTN = high
digitalWrite (Discharge_detect, HIGH); // default ACT2813 BTN = high
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, HIGH);
digitalWrite (batval_3, HIGH);
digitalWrite (batval_4, HIGH);
analogWrite(LEDdimming, 0); //default, LED PWM output =0
Serial.begin(9600);
}
void loop()
{
unsigned long currentMillis = millis();
previousMillis = currentMillis;
currentsleepTime = millis();
int vbattread = analogRead(Charge_detect);
if (vbattread <= 512 && brightness_SEL == 0 && analogRead(Vusb_out) <= 899) //沒有插USB充電器,LED沒有亮時,USB沒有在放電, LED電量指示燈關閉, 並開始計時是否睡眠
{
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, HIGH);
digitalWrite (batval_3, HIGH);
digitalWrite (batval_4, HIGH);
// 計時睡眠時間 -----------------------------------------------------
previousseleepTime = previousseleepTime + currentsleepTime;
if (millis()-previousseleepTime > durationsleepTime) // 大於2分鐘
{
delay(100);
Serial.println ( "Sleep now");
energy.PowerDown();
} // ----------------------------------------------------------------------
if (vbattread >= 513) // USB充電時,讀取充電LED電量
{
Charge_ReadVbat ();
}
// if (vbattread >= 513 && analogRead(Vusb_out) >= 900) // USB同時充電與放電時,讀取充電LED 電量
// {
// Charge_ReadVbat ();
// }
// if (vbattread <= 512 && brightness_SEL >0 || analogRead(Vusb_out) >= 900) // 沒有插USB充電, LED有亮, 或是有在放電 則為放電LED
if (analogRead(Vusb_out) >= 900) // 沒有插USB充電, LED有亮, 或是有在放電 則為放電LED
{
ReadVbat ();
}
}
if (digitalRead(buttonPush) == LOW)
{
// ----------------------------- Long button detect --------------------------------------------
if (digitalRead(buttonPush) == LOW)// Read status of tack switch
{
ReadVbat (); // 偵測到LOW 即顯示電量
startTime = millis(); // 按鈕起始時間計數開始
while (digitalRead(buttonPush) == LOW)
{
if (millis() - startTime > color_SEL_adj && millis() - startTime < color_SEL_adj_timeout && millis() - startTime > button_bounce ) // 按鈕按下時間介於設定起始值與中止值, 並且忽略掉開關彈跳時間, 當開關介於這時間內時,執行BTN_push
{
color_SEL++; // 顏色選擇判斷
if (color_SEL > 3)
{
color_SEL = 1;
}
BTN_push (); // 開關大於2s 後,依照Color sel 的設定執行顏色切換, 若按鈕仍沒有放開,則不會切換顏色,直到按鈕放開後,會跳開 while迴圈
}
}//=============================================== ultill button be released
duration_time = millis() - startTime; //按鍵總秒數統計
if (duration_time > discharge_start )
{
digitalWrite (Discharge_detect, LOW);
delay (300);
digitalWrite (Discharge_detect, HIGH);
}
button_flag = 1;
}
//--------------------------------END OF long button detect -------------------------------------
//===============Button detect for function select====================
if (button_flag == 1 && duration_time > brightness_level_adj && duration_time < brightness_level_timeout && duration_time > button_bounce)
// if (button_flag == 1 && duration_time > brightness_level_adj && duration_time > button_bounce)
// 當上面的回圈離開後,duration_time會統計秒數,如過秒數 250 ~ 1000 ms 之間,則認為要切換亮度,如過按鈕超過1S的話就不會執行亮度切換
{
//if (duration_time < brightness_level_adj)
//{
brightness_SEL++;
if (brightness_SEL > 4)
{
//RST_ALL ();
brightness_SEL = 0;
}
//}
BTN_push ();
} // end of button flag
button_flag = 0;
}
//======================================================
} //loop END mark
//=======================================================
void RST_ALL ()
{
analogWrite(LEDdimming, brightness_0);
digitalWrite (whiteLED_ON_OFF, LOW);
digitalWrite (yellowLED_ON_OFF, LOW);
brightness_SEL = 0;
}
//==================放電時的電壓指示 Battery voltage detect==================================
void ReadVbat ()
{
int val = analogRead(read_Vbat);
if (val >= Vbat_status_40 )
{
digitalWrite (batval_1, LOW);
digitalWrite (batval_2, LOW);
digitalWrite (batval_3, LOW);
digitalWrite (batval_4, LOW);
}
if (val <= Vbat_status_39 && val >= Vbat_status_38 )
{
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, LOW);
digitalWrite (batval_3, LOW);
digitalWrite (batval_4, LOW);
}
if (val <= Vbat_status_37 && val >= Vbat_status_36 )
{
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, HIGH);
digitalWrite (batval_3, LOW);
digitalWrite (batval_4, LOW);
}
/* if (val <=Vbat_status_37 && val>=Vbat_status_36) // <3.6V >3.5V
{
digitalWrite (batval_1,HIGH);
digitalWrite (batval_2,HIGH);
digitalWrite (batval_3,HIGH);
digitalWrite (batval_4,LOW);
}
*/
if (val <= Vbat_status_35) //<3.5
{
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, HIGH);
digitalWrite (batval_3, HIGH);
//digitalWrite (batval_4,LOW);
if ( BBB == HIGH)
{
digitalWrite (batval_4, LOW);
BBB = LOW;
}
else
{
digitalWrite (batval_4, HIGH);
BBB = HIGH;
}
}
}
//==================充電時的電壓指示 Battery voltage detect==================================
void Charge_ReadVbat ()
{
int val = analogRead(read_Vbat);
if (val > Vbat_status_43)
{
digitalWrite (batval_1, LOW);
digitalWrite (batval_2, LOW);
digitalWrite (batval_3, LOW);
digitalWrite (batval_4, LOW);
}
if (val <= Vbat_status_42 && val >= Vbat_status_40)
{
//digitalWrite (batval_1,HIGH);
if ( BBB == HIGH)
{
digitalWrite (batval_1, LOW);
BBB = LOW;
}
else
{
digitalWrite (batval_1, HIGH);
BBB = HIGH;
}
digitalWrite (batval_2, LOW);
digitalWrite (batval_3, LOW);
digitalWrite (batval_4, LOW);
}
if (val <= Vbat_status_39 && val >= Vbat_status_38)
{
digitalWrite (batval_1, HIGH);
//digitalWrite (batval_2, HIGH);
if ( BBB == HIGH)
{
digitalWrite (batval_2, LOW);
BBB = LOW;
}
else
{
digitalWrite (batval_2, HIGH);
BBB = HIGH;
}
digitalWrite (batval_3, LOW);
digitalWrite (batval_4, LOW);
}
if (val <= Vbat_status_37 && val >= Vbat_status_36)
{
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, HIGH);
//digitalWrite (batval_3, HIGH);
if ( BBB == HIGH)
{
digitalWrite (batval_3, LOW);
BBB = LOW;
}
else
{
digitalWrite (batval_3, HIGH);
BBB = HIGH;
}
digitalWrite (batval_4, LOW);
}
if (val <= Vbat_status_35) //<3.5V //有插電LED就會亮
{
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, HIGH);
digitalWrite (batval_3, HIGH);
if ( BBB == HIGH)
{
digitalWrite (batval_4, LOW);
BBB = LOW;
}
else
{
digitalWrite (batval_4, HIGH);
BBB = HIGH;
}
}
}
void BTN_push ()
{
//=========================WHITE LED ====================================
if (brightness_SEL == 0)
{
digitalWrite (batval_1, HIGH);
digitalWrite (batval_2, HIGH);
digitalWrite (batval_3, HIGH);
digitalWrite (batval_4, HIGH);
analogWrite (LEDdimming, brightness_0);
digitalWrite (whiteLED_ON_OFF, LOW);
digitalWrite (yellowLED_ON_OFF, LOW);
}
//======================================================
if (brightness_SEL == 1 && color_SEL == 1)
{
analogWrite(LEDdimming, brightness_25);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, LOW);
}
if (brightness_SEL == 2 && color_SEL == 1)
{
analogWrite(LEDdimming, brightness_50);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, LOW);
}
if (brightness_SEL == 3 && color_SEL == 1)
{
analogWrite(LEDdimming, brightness_75);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, LOW);
}
if (brightness_SEL == 4 && color_SEL == 1)
{
analogWrite(LEDdimming, brightness_100);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, LOW);
}
//==========================YELLOW LED ==============================
if (brightness_SEL == 1 && color_SEL == 2)
{
analogWrite(LEDdimming, brightness_25);
digitalWrite (whiteLED_ON_OFF, LOW);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
if (brightness_SEL == 2 && color_SEL == 2)
{
analogWrite(LEDdimming, brightness_50);
digitalWrite (whiteLED_ON_OFF, LOW);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
if (brightness_SEL == 3 && color_SEL == 2)
{
analogWrite(LEDdimming, brightness_75);
digitalWrite (whiteLED_ON_OFF, LOW);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
if (brightness_SEL == 4 && color_SEL == 2)
{
analogWrite(LEDdimming, brightness_100);
digitalWrite (whiteLED_ON_OFF, LOW);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
//========================BOTH White and Yellow=================================================
if (brightness_SEL == 1 && color_SEL == 3)
{
analogWrite(LEDdimming, brightness_25);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
if (brightness_SEL == 2 && color_SEL == 3)
{
analogWrite(LEDdimming, brightness_50);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
if (brightness_SEL == 3 && color_SEL == 3)
{
analogWrite(LEDdimming, brightness_75);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
if (brightness_SEL == 4 && color_SEL == 3)
{
analogWrite(LEDdimming, brightness_100);
digitalWrite (whiteLED_ON_OFF, HIGH);
digitalWrite (yellowLED_ON_OFF, HIGH);
}
}
void wakeISR()
{
Serial.println ( "Wake up");
}