project_power-bank/UPGRADE/Code/v2/v2.ino
2019-12-19 16:18:25 +00:00

530 lines
21 KiB
C++

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "LowPower.h"
#include <avr/wdt.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define PWRBTN 3
#define CHGBTN 4
#define PWRLED 5
#define CHGLED 6
#define VBAT A0
#define FETCTRL 2
#define CSTAT1 A1
#define CSTAT2 A2
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int batteryPct = 0;
double battVoltage = 0.0;
bool powerState = false;
bool screenOn = false;
bool charging_1 = false;
bool charging_2 = false;
int screenState = 0;
static const unsigned char PROGMEM battery_logo[] = {
B00000011, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11000000, B00000000,
B00001111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000, B00000000,
B00011111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000, B00000000,
B00111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111100, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01100000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01110000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01110000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01100000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B00111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111100, B00000000,
B00011111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000, B00000000,
B00001111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000, B00000000,
B00000011, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11000000, B00000000
};
static const unsigned char PROGMEM charge_logo[] = {
B00011111, B11000000,
B00010000, B01000000,
B00100000, B01000000,
B00100000, B10000000,
B01000001, B00000000,
B01000011, B11000000,
B10000000, B01000000,
B11110000, B10000000,
B00010001, B00000000,
B00100010, B00000000,
B00100100, B00000000,
B01001000, B00000000,
B01010000, B00000000,
B01100000, B00000000,
};
void setup() {
delay(100);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
Serial.begin(9600);
pinMode(VBAT, INPUT);
pinMode(CSTAT1, INPUT);
pinMode(CSTAT2, INPUT);
pinMode(FETCTRL, OUTPUT);
pinMode(PWRLED, OUTPUT);
pinMode(CHGLED, OUTPUT);
pinMode(PWRBTN, INPUT_PULLUP);
pinMode(CHGBTN, INPUT_PULLUP);
digitalWrite(FETCTRL, LOW);
battVoltage = GetVoltage();
initScreen();
delay(200);
}
void loop() {
delay(100);
checkPresses();
checkCharging();
if (screenState != 0) {updateScreen();}
}
void getBatteryCharge(){
double voltage = GetVoltage();
if (voltage > 4.13){batteryPct = 100;}
else if (voltage > 4.06){batteryPct = 90;}
else if (voltage > 3.99){batteryPct = 80;}
else if (voltage > 3.92){batteryPct = 70;}
else if (voltage > 3.85){batteryPct = 60;}
else if (voltage > 3.78){batteryPct = 50;}
else if (voltage > 3.71){batteryPct = 40;}
else if (voltage > 3.64){batteryPct = 30;}
else if (voltage > 3.57){batteryPct = 20;}
else if (voltage > 3.50){batteryPct = 10;}
else if (voltage > 3.40){
Serial.println("We are fucked");
batteryPct = 0;
}
else if (voltage < 2){batteryPct = -1;}
}
void checkPresses(){
if (digitalRead(PWRBTN) == 0) {
delay(100);
if (digitalRead(PWRBTN) == 0) {
blinkLed(PWRLED);
if(powerState == true){
turnOff();
}
else {
turnOn();
}
}
}
if (digitalRead(CHGBTN) == 0) {
delay(100);
if (digitalRead(CHGBTN) == 0) {
blinkLed(CHGLED);
if (screenState == 1 || screenState == 0) {
screenState++;
}
else {
initScreen();
screenState = 0;
}
}
}
}
void checkCharging(){
if (digitalRead(CSTAT1) == 1){
delay(100);
if (digitalRead(CSTAT1) == 1){
charging_1 = true;
}
}
else { charging_1 = false;
}
if (digitalRead(CSTAT2) == 1){
delay(100);
if (digitalRead(CSTAT2) == 1){
charging_2 = true;
}
}
else { charging_2 = false;
}
}
void turnOn() {
digitalWrite(FETCTRL, HIGH);
powerState = true;
}
void turnOff() {
digitalWrite(FETCTRL, LOW);
powerState = false;
}
void initScreen() {
display.clearDisplay();
display.display();
screenOn = false;
}
void updateScreen() {
getBatteryCharge();
if (screenState == 1) {
updateDisplayPct();
}
else if (screenState == 2) {
updateDisplayVoltage();
}
}
void updateDisplayPct(){
display.clearDisplay();
display.drawBitmap(0, 0, battery_logo, 120, 32, 1);
if (charging_1 == true) {display.drawBitmap(118, 0, charge_logo, 16, 14, 1);}
if (charging_2 == true) {display.drawBitmap(118, 16, charge_logo, 16, 14, 1);}
display.setTextSize(2);
display.setCursor(35, 10);
display.setTextColor(0);
display.print(batteryPct);
display.println("%");
display.display();
screenOn = true;
}
void updateDisplayVoltage(){
display.clearDisplay();
display.drawBitmap(0, 0, battery_logo, 120, 32, 1);
if (charging_1 == true) {display.drawBitmap(118, 0, charge_logo, 16, 14, 1);}
if (charging_2 == true) {display.drawBitmap(118, 16, charge_logo, 16, 14, 1);}
display.setTextSize(2);
display.setCursor(30, 10);
display.setTextColor(0);
display.print(GetVoltage());
display.println(" V");
display.display();
screenOn = true;
}
double GetVoltage(){
int totalSamples = 0;
double voltage = 0;
for (int q = 0; q < 10; q++) {
totalSamples = totalSamples + analogRead(VBAT);
delay(5);
}
voltage = (totalSamples / 10) * (5.00 / 1023.0);
if (voltage > (battVoltage-0.03) && voltage < (battVoltage+0.03)) {
return battVoltage;
}
else {
battVoltage = voltage;
return voltage;
}
}
void blinkLed(int ctrlLed) {
analogWrite(ctrlLed, 0.00); delay(12);
analogWrite(ctrlLed, 0.00); delay(12);
analogWrite(ctrlLed, 0.02); delay(12);
analogWrite(ctrlLed, 0.05); delay(12);
analogWrite(ctrlLed, 0.09); delay(12);
analogWrite(ctrlLed, 0.15); delay(12);
analogWrite(ctrlLed, 0.23); delay(12);
analogWrite(ctrlLed, 0.32); delay(12);
analogWrite(ctrlLed, 0.43); delay(12);
analogWrite(ctrlLed, 0.55); delay(12);
analogWrite(ctrlLed, 0.70); delay(12);
analogWrite(ctrlLed, 0.85); delay(12);
analogWrite(ctrlLed, 1.01); delay(12);
analogWrite(ctrlLed, 1.20); delay(12);
analogWrite(ctrlLed, 1.42); delay(12);
analogWrite(ctrlLed, 1.63); delay(12);
analogWrite(ctrlLed, 1.85); delay(12);
analogWrite(ctrlLed, 2.12); delay(12);
analogWrite(ctrlLed, 2.40); delay(12);
analogWrite(ctrlLed, 2.67); delay(12);
analogWrite(ctrlLed, 2.99); delay(12);
analogWrite(ctrlLed, 3.30); delay(12);
analogWrite(ctrlLed, 3.65); delay(12);
analogWrite(ctrlLed, 4.00); delay(12);
analogWrite(ctrlLed, 4.39); delay(12);
analogWrite(ctrlLed, 4.77); delay(12);
analogWrite(ctrlLed, 5.16); delay(12);
analogWrite(ctrlLed, 5.65); delay(12);
analogWrite(ctrlLed, 6.08); delay(12);
analogWrite(ctrlLed, 6.54); delay(12);
analogWrite(ctrlLed, 7.01); delay(12);
analogWrite(ctrlLed, 7.54); delay(12);
analogWrite(ctrlLed, 8.10); delay(12);
analogWrite(ctrlLed, 8.63); delay(12);
analogWrite(ctrlLed, 9.23); delay(12);
analogWrite(ctrlLed, 9.80); delay(12);
analogWrite(ctrlLed, 10.45); delay(12);
analogWrite(ctrlLed, 11.23); delay(12);
analogWrite(ctrlLed, 11.98); delay(12);
analogWrite(ctrlLed, 12.76); delay(12);
analogWrite(ctrlLed, 13.70); delay(12);
analogWrite(ctrlLed, 14.55); delay(12);
analogWrite(ctrlLed, 15.43); delay(12);
analogWrite(ctrlLed, 16.41); delay(12);
analogWrite(ctrlLed, 17.43); delay(12);
analogWrite(ctrlLed, 18.42); delay(12);
analogWrite(ctrlLed, 19.52); delay(12);
analogWrite(ctrlLed, 20.58); delay(12);
analogWrite(ctrlLed, 21.75); delay(12);
analogWrite(ctrlLed, 22.97); delay(12);
analogWrite(ctrlLed, 24.15); delay(12);
analogWrite(ctrlLed, 25.36); delay(12);
analogWrite(ctrlLed, 26.80); delay(12);
analogWrite(ctrlLed, 28.10); delay(12);
analogWrite(ctrlLed, 29.44); delay(12);
analogWrite(ctrlLed, 30.92); delay(12);
analogWrite(ctrlLed, 32.45); delay(12);
analogWrite(ctrlLed, 33.93); delay(12);
analogWrite(ctrlLed, 35.56); delay(12);
analogWrite(ctrlLed, 37.12); delay(12);
analogWrite(ctrlLed, 38.85); delay(12);
analogWrite(ctrlLed, 40.63); delay(12);
analogWrite(ctrlLed, 42.35); delay(12);
analogWrite(ctrlLed, 44.11); delay(12);
analogWrite(ctrlLed, 46.18); delay(12);
analogWrite(ctrlLed, 48.04); delay(12);
analogWrite(ctrlLed, 49.95); delay(12);
analogWrite(ctrlLed, 52.06); delay(12);
analogWrite(ctrlLed, 54.22); delay(12);
analogWrite(ctrlLed, 56.44); delay(12);
analogWrite(ctrlLed, 58.57); delay(12);
analogWrite(ctrlLed, 60.75); delay(12);
analogWrite(ctrlLed, 63.30); delay(12);
analogWrite(ctrlLed, 65.59); delay(12);
analogWrite(ctrlLed, 67.93); delay(12);
analogWrite(ctrlLed, 70.50); delay(12);
analogWrite(ctrlLed, 73.12); delay(12);
analogWrite(ctrlLed, 75.63); delay(12);
analogWrite(ctrlLed, 78.37); delay(12);
analogWrite(ctrlLed, 80.98); delay(12);
analogWrite(ctrlLed, 83.84); delay(12);
analogWrite(ctrlLed, 86.75); delay(12);
analogWrite(ctrlLed, 89.52); delay(12);
analogWrite(ctrlLed, 92.35); delay(12);
analogWrite(ctrlLed, 95.63); delay(12);
analogWrite(ctrlLed, 98.55); delay(12);
analogWrite(ctrlLed, 101.52); delay(12);
analogWrite(ctrlLed, 105.41); delay(12);
analogWrite(ctrlLed, 108.92); delay(12);
analogWrite(ctrlLed, 112.71); delay(12);
analogWrite(ctrlLed, 116.33); delay(12);
analogWrite(ctrlLed, 120.23); delay(12);
analogWrite(ctrlLed, 124.19); delay(12);
analogWrite(ctrlLed, 127.95); delay(12);
analogWrite(ctrlLed, 131.99); delay(12);
analogWrite(ctrlLed, 136.08); delay(12);
analogWrite(ctrlLed, 139.95); delay(12);
analogWrite(ctrlLed, 144.09); delay(12);
analogWrite(ctrlLed, 148.26); delay(12);
analogWrite(ctrlLed, 152.20); delay(12);
analogWrite(ctrlLed, 156.40); delay(12);
analogWrite(ctrlLed, 160.60); delay(12);
analogWrite(ctrlLed, 164.81); delay(12);
analogWrite(ctrlLed, 168.76); delay(12);
analogWrite(ctrlLed, 172.70); delay(12);
analogWrite(ctrlLed, 177.11); delay(12);
analogWrite(ctrlLed, 181.01); delay(12);
analogWrite(ctrlLed, 185.11); delay(12);
analogWrite(ctrlLed, 189.17); delay(12);
analogWrite(ctrlLed, 192.94); delay(12);
analogWrite(ctrlLed, 196.89); delay(12);
analogWrite(ctrlLed, 200.55); delay(12);
analogWrite(ctrlLed, 204.59); delay(12);
analogWrite(ctrlLed, 208.10); delay(12);
analogWrite(ctrlLed, 211.52); delay(12);
analogWrite(ctrlLed, 215.27); delay(12);
analogWrite(ctrlLed, 218.50); delay(12);
analogWrite(ctrlLed, 221.63); delay(12);
analogWrite(ctrlLed, 224.83); delay(12);
analogWrite(ctrlLed, 227.90); delay(12);
analogWrite(ctrlLed, 230.83); delay(12);
analogWrite(ctrlLed, 233.46); delay(12);
analogWrite(ctrlLed, 236.10); delay(12);
analogWrite(ctrlLed, 238.58); delay(12);
analogWrite(ctrlLed, 240.76); delay(12);
analogWrite(ctrlLed, 242.90); delay(12);
analogWrite(ctrlLed, 244.87); delay(12);
analogWrite(ctrlLed, 246.56); delay(12);
analogWrite(ctrlLed, 248.17); delay(12);
analogWrite(ctrlLed, 249.58); delay(12);
analogWrite(ctrlLed, 250.80); delay(12);
analogWrite(ctrlLed, 251.76); delay(12);
analogWrite(ctrlLed, 252.59); delay(12);
analogWrite(ctrlLed, 253.21); delay(12);
analogWrite(ctrlLed, 253.60); delay(12);
analogWrite(ctrlLed, 253.81); delay(12);
analogWrite(ctrlLed, 253.80); delay(12);
analogWrite(ctrlLed, 253.08); delay(12);
analogWrite(ctrlLed, 253.54); delay(12);
analogWrite(ctrlLed, 253.79); delay(12);
analogWrite(ctrlLed, 253.84); delay(12);
analogWrite(ctrlLed, 253.68); delay(12);
analogWrite(ctrlLed, 253.32); delay(12);
analogWrite(ctrlLed, 252.79); delay(12);
analogWrite(ctrlLed, 252.03); delay(12);
analogWrite(ctrlLed, 251.06); delay(12);
analogWrite(ctrlLed, 249.96); delay(12);
analogWrite(ctrlLed, 248.60); delay(12);
analogWrite(ctrlLed, 247.05); delay(12);
analogWrite(ctrlLed, 245.31); delay(12);
analogWrite(ctrlLed, 243.50); delay(12);
analogWrite(ctrlLed, 241.53); delay(12);
analogWrite(ctrlLed, 239.14); delay(12);
analogWrite(ctrlLed, 236.84); delay(12);
analogWrite(ctrlLed, 234.25); delay(12);
analogWrite(ctrlLed, 231.50); delay(12);
analogWrite(ctrlLed, 228.78); delay(12);
analogWrite(ctrlLed, 225.75); delay(12);
analogWrite(ctrlLed, 222.77); delay(12);
analogWrite(ctrlLed, 219.49); delay(12);
analogWrite(ctrlLed, 216.09); delay(12);
analogWrite(ctrlLed, 212.78); delay(12);
analogWrite(ctrlLed, 208.96); delay(12);
analogWrite(ctrlLed, 205.47); delay(12);
analogWrite(ctrlLed, 201.91); delay(12);
analogWrite(ctrlLed, 197.81); delay(12);
analogWrite(ctrlLed, 194.11); delay(12);
analogWrite(ctrlLed, 190.12); delay(12);
analogWrite(ctrlLed, 186.31); delay(12);
analogWrite(ctrlLed, 182.22); delay(12);
analogWrite(ctrlLed, 178.09); delay(12);
analogWrite(ctrlLed, 174.17); delay(12);
analogWrite(ctrlLed, 169.75); delay(12);
analogWrite(ctrlLed, 165.80); delay(12);
analogWrite(ctrlLed, 161.84); delay(12);
analogWrite(ctrlLed, 157.64); delay(12);
analogWrite(ctrlLed, 153.43); delay(12);
analogWrite(ctrlLed, 149.24); delay(12);
analogWrite(ctrlLed, 145.32); delay(12);
analogWrite(ctrlLed, 141.16); delay(12);
analogWrite(ctrlLed, 137.04); delay(12);
analogWrite(ctrlLed, 133.19); delay(12);
analogWrite(ctrlLed, 129.37); delay(12);
analogWrite(ctrlLed, 125.12); delay(12);
analogWrite(ctrlLed, 121.39); delay(12);
analogWrite(ctrlLed, 117.47); delay(12);
analogWrite(ctrlLed, 113.61); delay(12);
analogWrite(ctrlLed, 110.03); delay(12);
analogWrite(ctrlLed, 106.28); delay(12);
analogWrite(ctrlLed, 102.81); delay(12);
analogWrite(ctrlLed, 98.97); delay(12);
analogWrite(ctrlLed, 96.04); delay(12);
analogWrite(ctrlLed, 93.16); delay(12);
analogWrite(ctrlLed, 89.92); delay(12);
analogWrite(ctrlLed, 87.15); delay(12);
analogWrite(ctrlLed, 84.42); delay(12);
analogWrite(ctrlLed, 81.55); delay(12);
analogWrite(ctrlLed, 78.74); delay(12);
analogWrite(ctrlLed, 76.17); delay(12);
analogWrite(ctrlLed, 73.48); delay(12);
analogWrite(ctrlLed, 71.02); delay(12);
analogWrite(ctrlLed, 68.44); delay(12);
analogWrite(ctrlLed, 65.92); delay(12);
analogWrite(ctrlLed, 63.62); delay(12);
analogWrite(ctrlLed, 61.38); delay(12);
analogWrite(ctrlLed, 58.88); delay(12);
analogWrite(ctrlLed, 56.74); delay(12);
analogWrite(ctrlLed, 54.66); delay(12);
analogWrite(ctrlLed, 52.49); delay(12);
analogWrite(ctrlLed, 50.37); delay(12);
analogWrite(ctrlLed, 48.45); delay(12);
analogWrite(ctrlLed, 46.44); delay(12);
analogWrite(ctrlLed, 44.62); delay(12);
analogWrite(ctrlLed, 42.72); delay(12);
analogWrite(ctrlLed, 40.88); delay(12);
analogWrite(ctrlLed, 39.20); delay(12);
analogWrite(ctrlLed, 37.58); delay(12);
analogWrite(ctrlLed, 35.78); delay(12);
analogWrite(ctrlLed, 34.25); delay(12);
analogWrite(ctrlLed, 32.66); delay(12);
analogWrite(ctrlLed, 31.22); delay(12);
analogWrite(ctrlLed, 29.73); delay(12);
analogWrite(ctrlLed, 28.29); delay(12);
analogWrite(ctrlLed, 26.98); delay(12);
analogWrite(ctrlLed, 25.71); delay(12);
analogWrite(ctrlLed, 24.32); delay(12);
analogWrite(ctrlLed, 23.14); delay(12);
analogWrite(ctrlLed, 21.99); delay(12);
analogWrite(ctrlLed, 20.81); delay(12);
analogWrite(ctrlLed, 19.66); delay(12);
analogWrite(ctrlLed, 18.64); delay(12);
analogWrite(ctrlLed, 17.57); delay(12);
analogWrite(ctrlLed, 16.61); delay(12);
analogWrite(ctrlLed, 15.62); delay(12);
analogWrite(ctrlLed, 14.67); delay(12);
analogWrite(ctrlLed, 13.82); delay(12);
analogWrite(ctrlLed, 12.99); delay(12);
analogWrite(ctrlLed, 12.09); delay(12);
analogWrite(ctrlLed, 11.33); delay(12);
analogWrite(ctrlLed, 10.60); delay(12);
analogWrite(ctrlLed, 9.85); delay(12);
analogWrite(ctrlLed, 9.23); delay(12);
analogWrite(ctrlLed, 8.68); delay(12);
analogWrite(ctrlLed, 8.10); delay(12);
analogWrite(ctrlLed, 7.58); delay(12);
analogWrite(ctrlLed, 7.09); delay(12);
analogWrite(ctrlLed, 6.58); delay(12);
analogWrite(ctrlLed, 6.08); delay(12);
analogWrite(ctrlLed, 5.65); delay(12);
analogWrite(ctrlLed, 5.23); delay(12);
analogWrite(ctrlLed, 4.77); delay(12);
analogWrite(ctrlLed, 4.39); delay(12);
analogWrite(ctrlLed, 4.03); delay(12);
analogWrite(ctrlLed, 3.65); delay(12);
analogWrite(ctrlLed, 3.33); delay(12);
analogWrite(ctrlLed, 2.99); delay(12);
analogWrite(ctrlLed, 2.70); delay(12);
analogWrite(ctrlLed, 2.40); delay(12);
analogWrite(ctrlLed, 2.14); delay(12);
analogWrite(ctrlLed, 1.87); delay(12);
analogWrite(ctrlLed, 1.63); delay(12);
analogWrite(ctrlLed, 1.42); delay(12);
analogWrite(ctrlLed, 1.22); delay(12);
analogWrite(ctrlLed, 1.04); delay(12);
analogWrite(ctrlLed, 0.85); delay(12);
analogWrite(ctrlLed, 0.70); delay(12);
analogWrite(ctrlLed, 0.56); delay(12);
analogWrite(ctrlLed, 0.43); delay(12);
analogWrite(ctrlLed, 0.33); delay(12);
analogWrite(ctrlLed, 0.23); delay(12);
analogWrite(ctrlLed, 0.15); delay(12);
analogWrite(ctrlLed, 0.09); delay(12);
analogWrite(ctrlLed, 0.05); delay(12);
analogWrite(ctrlLed, 0.02); delay(12);
}