aquarium light controller wannabe

Dependencies:   DS3231 FastPWM Menu QEI TextLCD _24LCXXX mbed

Committer:
rakware
Date:
Mon Nov 09 17:53:25 2015 +0000
Revision:
2:c50dfa998b4c
Parent:
1:b0e2b4fdeb12
shubi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rakware 0:0b9548db2291 1 #include "mbed.h"
rakware 0:0b9548db2291 2 #include "TextLCD.h"
rakware 0:0b9548db2291 3 #include "QEI.h"
rakware 0:0b9548db2291 4 #include "Menu.h"
rakware 0:0b9548db2291 5 #include "FastPWM.h"
rakware 0:0b9548db2291 6 #include "DS3231.h"
rakware 0:0b9548db2291 7 #include "_24LCXXX.h"
rakware 0:0b9548db2291 8
rakware 0:0b9548db2291 9
rakware 0:0b9548db2291 10 Serial pc(USBTX, USBRX); //DEBUG
rakware 0:0b9548db2291 11 DigitalOut myled(LED1); //DEBUG
rakware 0:0b9548db2291 12
rakware 0:0b9548db2291 13 // I2C Bus
rakware 0:0b9548db2291 14 I2C i2c(PB_4, PA_8); // SDA, SCL
rakware 0:0b9548db2291 15
rakware 0:0b9548db2291 16 TextLCD_I2C lcd(&i2c, PCF8574_SA7);
rakware 0:0b9548db2291 17 _24LCXXX eeprom(&i2c, 0x57);
rakware 0:0b9548db2291 18 DS3231 rtc(PB_4, PA_8);
rakware 0:0b9548db2291 19 //End I2C BUS
rakware 0:0b9548db2291 20
rakware 0:0b9548db2291 21 QEI qei(PH_0, PH_1, NC, 80, QEI::X4_ENCODING); //Index is NC(see QEI class), we use PC_13 as digital input
rakware 0:0b9548db2291 22 DigitalIn qei_idx(PC_13);
rakware 0:0b9548db2291 23
rakware 0:0b9548db2291 24 bool qei_pb() //check and debounces qei_idx
rakware 0:0b9548db2291 25 {
rakware 0:0b9548db2291 26 int check = qei_idx;
rakware 0:0b9548db2291 27 wait_us(5);
rakware 0:0b9548db2291 28 if((!check) && !qei_idx) {
rakware 0:0b9548db2291 29 return true;
rakware 0:0b9548db2291 30 } else return false;
rakware 0:0b9548db2291 31 }
rakware 0:0b9548db2291 32
rakware 0:0b9548db2291 33 //PA_11 = ESP SERIAL!!!
rakware 0:0b9548db2291 34 FastPWM Pwm_Array[] = {PA_7,PA_5,PA_6,PB_6,PA_9,PB_3,PB_5,PB_7,PA_10,PB_10,PC_8,PB_8,PA_11,PC_9,PB_9};
rakware 0:0b9548db2291 35
rakware 0:0b9548db2291 36 //Ticker Pwm_Ticker[sizeof(Pwm_Array)/sizeof(FastPWM)];
rakware 0:0b9548db2291 37 Ticker Sunrise_Ticker;
rakware 0:0b9548db2291 38 Ticker Sunset_Ticker;
rakware 0:0b9548db2291 39
rakware 0:0b9548db2291 40 //uint8_t Pwm_Min_Max_Array[sizeof(Pwm_Array)/sizeof(FastPWM)][1][2] = {
rakware 0:0b9548db2291 41 // { {0, 100} },
rakware 0:0b9548db2291 42 // { {20, 80} },
rakware 0:0b9548db2291 43 // { {0, 100} },
rakware 0:0b9548db2291 44 // { {0, 100} },
rakware 0:0b9548db2291 45 // { {0, 100} },
rakware 0:0b9548db2291 46 // { {0, 100} },
rakware 0:0b9548db2291 47 // { {0, 100} },
rakware 0:0b9548db2291 48 // { {0, 100} },
rakware 0:0b9548db2291 49 // { {0, 100} },
rakware 0:0b9548db2291 50 // { {0, 100} },
rakware 0:0b9548db2291 51 // { {0, 100} },
rakware 0:0b9548db2291 52 // { {0, 100} },
rakware 0:0b9548db2291 53 // { {0, 100} },
rakware 0:0b9548db2291 54 // { {0, 100} },
rakware 0:0b9548db2291 55 // { {0, 100} }
rakware 0:0b9548db2291 56 //};
rakware 0:0b9548db2291 57
rakware 1:b0e2b4fdeb12 58
rakware 0:0b9548db2291 59 uint8_t Pwm_Min_Max_Array[sizeof(Pwm_Array)/sizeof(FastPWM)][2] = {
rakware 2:c50dfa998b4c 60 {0, 1}, //violet
rakware 2:c50dfa998b4c 61 {1, 35}, //royal blue
rakware 2:c50dfa998b4c 62 {0, 40}, //20000k
rakware 1:b0e2b4fdeb12 63 {0, 35},
rakware 1:b0e2b4fdeb12 64 {0, 35},
rakware 1:b0e2b4fdeb12 65 {0, 35},
rakware 1:b0e2b4fdeb12 66 {0, 35},
rakware 1:b0e2b4fdeb12 67 {0, 35},
rakware 1:b0e2b4fdeb12 68 {0, 35},
rakware 1:b0e2b4fdeb12 69 {0, 35},
rakware 1:b0e2b4fdeb12 70 {0, 35},
rakware 1:b0e2b4fdeb12 71 {0, 35},
rakware 1:b0e2b4fdeb12 72 {0, 35},
rakware 1:b0e2b4fdeb12 73 {0, 35},
rakware 1:b0e2b4fdeb12 74 {0, 35}
rakware 0:0b9548db2291 75 };
rakware 0:0b9548db2291 76
rakware 0:0b9548db2291 77 int pwm_idx = 0;
rakware 0:0b9548db2291 78
rakware 2:c50dfa998b4c 79 uint8_t SunRiseSet[2][2] = {{8,0},{20,30}};
rakware 0:0b9548db2291 80
rakware 2:c50dfa998b4c 81 uint8_t ramptime = 30; //in minutes
rakware 0:0b9548db2291 82
rakware 0:0b9548db2291 83 bool refresh_display = true;
rakware 0:0b9548db2291 84
rakware 0:0b9548db2291 85 enum { IDLE,
rakware 0:0b9548db2291 86 MAIN,
rakware 0:0b9548db2291 87 SETTINGS,
rakware 0:0b9548db2291 88 PWM_MIN,
rakware 0:0b9548db2291 89 PWM_MAX,
rakware 0:0b9548db2291 90 SUNRISE,
rakware 0:0b9548db2291 91 SUNSET,
rakware 0:0b9548db2291 92 RAMPTIME,
rakware 0:0b9548db2291 93 SUNRISE_HOUR,
rakware 0:0b9548db2291 94 SUNRISE_MINUTE,
rakware 0:0b9548db2291 95 SUNSET_HOUR,
rakware 0:0b9548db2291 96 SUNSET_MINUTE,
rakware 0:0b9548db2291 97 SET_DATE_TIME,
rakware 0:0b9548db2291 98 SET_DATE_DAY,
rakware 0:0b9548db2291 99 SET_DATE_MONTH,
rakware 0:0b9548db2291 100 SET_DATE_YEAR,
rakware 0:0b9548db2291 101 SET_TIME_HOUR,
rakware 0:0b9548db2291 102 SET_TIME_MINUTE,
rakware 0:0b9548db2291 103 SET_TIME_SECOND
rakware 0:0b9548db2291 104 } menu_state = MAIN ; // Initial state = MAIN ;
rakware 0:0b9548db2291 105
rakware 0:0b9548db2291 106 int cursorPos = 0;
rakware 0:0b9548db2291 107 Menu *activeMenu;
rakware 0:0b9548db2291 108
rakware 0:0b9548db2291 109 //struct tm *t; //read time
rakware 0:0b9548db2291 110 struct tm t; //mktime
rakware 0:0b9548db2291 111
rakware 0:0b9548db2291 112 Ticker qei_t; //ticker for qei_cb()
rakware 0:0b9548db2291 113
rakware 0:0b9548db2291 114 void qei_cb()
rakware 0:0b9548db2291 115 {
rakware 0:0b9548db2291 116 if(qei.getCurrentState() == 3 && qei.getPulses() < 0) { //one tab left
rakware 0:0b9548db2291 117 refresh_display = true;
rakware 0:0b9548db2291 118 switch (menu_state) {
rakware 0:0b9548db2291 119 case SETTINGS:
rakware 0:0b9548db2291 120 cursorPos--;
rakware 0:0b9548db2291 121 if (cursorPos < 0)
rakware 0:0b9548db2291 122 cursorPos = activeMenu->selections.size()-1;
rakware 0:0b9548db2291 123 break;
rakware 0:0b9548db2291 124 case PWM_MIN:
rakware 0:0b9548db2291 125 if (Pwm_Min_Max_Array[cursorPos][0] > 0)
rakware 0:0b9548db2291 126 Pwm_Min_Max_Array[cursorPos][0]--;
rakware 0:0b9548db2291 127 break;
rakware 0:0b9548db2291 128 case PWM_MAX:
rakware 0:0b9548db2291 129 if (Pwm_Min_Max_Array[cursorPos][1] > 0)
rakware 0:0b9548db2291 130 Pwm_Min_Max_Array[cursorPos][1]--;
rakware 0:0b9548db2291 131 break;
rakware 0:0b9548db2291 132 case RAMPTIME:
rakware 0:0b9548db2291 133 ramptime--;
rakware 0:0b9548db2291 134 break;
rakware 0:0b9548db2291 135 case SUNRISE_HOUR:
rakware 0:0b9548db2291 136 SunRiseSet[0][0]--;
rakware 0:0b9548db2291 137 break;
rakware 0:0b9548db2291 138 case SUNRISE_MINUTE:
rakware 0:0b9548db2291 139 SunRiseSet[0][1]--;
rakware 0:0b9548db2291 140 break;
rakware 0:0b9548db2291 141 case SUNSET_HOUR:
rakware 0:0b9548db2291 142 SunRiseSet[1][0]--;
rakware 0:0b9548db2291 143 break;
rakware 0:0b9548db2291 144 case SUNSET_MINUTE:
rakware 0:0b9548db2291 145 SunRiseSet[1][1]--;
rakware 0:0b9548db2291 146 break;
rakware 0:0b9548db2291 147 }
rakware 0:0b9548db2291 148 qei.reset();
rakware 0:0b9548db2291 149 } else if(qei.getCurrentState() == 3 && qei.getPulses() > 0) { //one tab right
rakware 0:0b9548db2291 150 refresh_display = true;
rakware 0:0b9548db2291 151 switch (menu_state) {
rakware 0:0b9548db2291 152 case SETTINGS:
rakware 0:0b9548db2291 153 cursorPos++;
rakware 0:0b9548db2291 154 if (cursorPos >= activeMenu->selections.size())
rakware 0:0b9548db2291 155 cursorPos = 0;
rakware 0:0b9548db2291 156 break;
rakware 0:0b9548db2291 157 case PWM_MIN:
rakware 0:0b9548db2291 158 if (Pwm_Min_Max_Array[cursorPos][0] < 100)
rakware 0:0b9548db2291 159 Pwm_Min_Max_Array[cursorPos][0]++;
rakware 0:0b9548db2291 160 break;
rakware 0:0b9548db2291 161 case PWM_MAX:
rakware 0:0b9548db2291 162 if (Pwm_Min_Max_Array[cursorPos][1] < 100)
rakware 0:0b9548db2291 163 Pwm_Min_Max_Array[cursorPos][1]++;
rakware 0:0b9548db2291 164 break;
rakware 0:0b9548db2291 165 case RAMPTIME:
rakware 0:0b9548db2291 166 ramptime++;
rakware 0:0b9548db2291 167 break;
rakware 0:0b9548db2291 168 case SUNRISE_HOUR:
rakware 0:0b9548db2291 169 SunRiseSet[0][0]++;
rakware 0:0b9548db2291 170 break;
rakware 0:0b9548db2291 171 case SUNRISE_MINUTE:
rakware 0:0b9548db2291 172 SunRiseSet[0][1]++;
rakware 0:0b9548db2291 173 break;
rakware 0:0b9548db2291 174 case SUNSET_HOUR:
rakware 0:0b9548db2291 175 SunRiseSet[1][0]++;
rakware 0:0b9548db2291 176 break;
rakware 0:0b9548db2291 177 case SUNSET_MINUTE:
rakware 0:0b9548db2291 178 SunRiseSet[1][1]++;
rakware 0:0b9548db2291 179 break;
rakware 0:0b9548db2291 180 }
rakware 0:0b9548db2291 181 qei.reset();
rakware 0:0b9548db2291 182 }
rakware 0:0b9548db2291 183
rakware 0:0b9548db2291 184 if(qei_pb()) { //button press
rakware 0:0b9548db2291 185 Timer qei_pb_t;
rakware 0:0b9548db2291 186 if (qei_pb_t.read() == 0) {
rakware 0:0b9548db2291 187 qei_pb_t.start();
rakware 0:0b9548db2291 188 }
rakware 0:0b9548db2291 189 while(qei_pb()) { //check long press
rakware 0:0b9548db2291 190 if(qei_pb_t.read() > 1) {
rakware 0:0b9548db2291 191 qei_pb_t.stop();
rakware 0:0b9548db2291 192 pc.printf("long press");//do stuff on long press
rakware 0:0b9548db2291 193 refresh_display = true;
rakware 0:0b9548db2291 194 lcd.cls();
rakware 0:0b9548db2291 195 lcd.locate(0,0);
rakware 0:0b9548db2291 196 lcd.printf("%s", activeMenu->menuID);
rakware 0:0b9548db2291 197 lcd.locate(0,1);
rakware 0:0b9548db2291 198 lcd.printf("%s", activeMenu->selections[cursorPos].selText);
rakware 0:0b9548db2291 199
rakware 0:0b9548db2291 200 menu_state = SETTINGS;
rakware 0:0b9548db2291 201 wait(0.5);
rakware 0:0b9548db2291 202 }
rakware 0:0b9548db2291 203 }
rakware 0:0b9548db2291 204 if(qei_pb_t.read() < 1) {
rakware 0:0b9548db2291 205 qei_pb_t.stop();
rakware 0:0b9548db2291 206 //do stuff on short press
rakware 0:0b9548db2291 207 pc.printf("short press");
rakware 0:0b9548db2291 208 refresh_display = true;
rakware 0:0b9548db2291 209 switch (menu_state) {
rakware 0:0b9548db2291 210 case MAIN:
rakware 0:0b9548db2291 211 break;
rakware 0:0b9548db2291 212 case SETTINGS:
rakware 0:0b9548db2291 213 pc.printf("apasat SETTINGS\n");
rakware 0:0b9548db2291 214 if(activeMenu->selections[cursorPos].fun != NULL) {
rakware 0:0b9548db2291 215 (activeMenu->selections[cursorPos].fun)();
rakware 0:0b9548db2291 216 }
rakware 0:0b9548db2291 217 if(activeMenu->selections[cursorPos].childMenu != NULL) {
rakware 0:0b9548db2291 218 activeMenu = activeMenu->selections[cursorPos].childMenu;
rakware 0:0b9548db2291 219 cursorPos = 0;
rakware 0:0b9548db2291 220 }
rakware 0:0b9548db2291 221 // print_menu();
rakware 0:0b9548db2291 222 wait(0.2);
rakware 0:0b9548db2291 223 break;
rakware 0:0b9548db2291 224 case PWM_MIN:
rakware 0:0b9548db2291 225 menu_state = SETTINGS;
rakware 0:0b9548db2291 226 wait(0.2);
rakware 0:0b9548db2291 227 break;
rakware 0:0b9548db2291 228 case PWM_MAX:
rakware 0:0b9548db2291 229 menu_state = SETTINGS;
rakware 0:0b9548db2291 230 wait(0.2);
rakware 0:0b9548db2291 231 break;
rakware 0:0b9548db2291 232 case SUNRISE:
rakware 0:0b9548db2291 233 wait(0.2);
rakware 0:0b9548db2291 234 menu_state = SUNRISE_HOUR;
rakware 0:0b9548db2291 235 break;
rakware 0:0b9548db2291 236 case SUNRISE_HOUR:
rakware 0:0b9548db2291 237 wait(0.2);
rakware 0:0b9548db2291 238 menu_state = SUNRISE_MINUTE;
rakware 0:0b9548db2291 239 break;
rakware 0:0b9548db2291 240 case SUNSET:
rakware 0:0b9548db2291 241 wait(0.2);
rakware 0:0b9548db2291 242 menu_state = SUNSET_HOUR;
rakware 0:0b9548db2291 243 break;
rakware 0:0b9548db2291 244 case SUNSET_HOUR:
rakware 0:0b9548db2291 245 wait(0.2);
rakware 0:0b9548db2291 246 menu_state = SUNSET_MINUTE;
rakware 0:0b9548db2291 247 break;
rakware 0:0b9548db2291 248 default:
rakware 0:0b9548db2291 249 menu_state = SETTINGS;
rakware 0:0b9548db2291 250 wait(0.2);
rakware 0:0b9548db2291 251 break;
rakware 0:0b9548db2291 252 }
rakware 0:0b9548db2291 253 wait(0.2);
rakware 0:0b9548db2291 254 }
rakware 0:0b9548db2291 255 }
rakware 0:0b9548db2291 256 }
rakware 0:0b9548db2291 257
rakware 0:0b9548db2291 258 void exit_settings()
rakware 0:0b9548db2291 259 {
rakware 0:0b9548db2291 260 // menu_state = SAVE_SETTINGS;
rakware 0:0b9548db2291 261 // lcd.locate(0,1);
rakware 0:0b9548db2291 262 // lcd.printf("<N SAVE Y>");
rakware 0:0b9548db2291 263 menu_state = MAIN;
rakware 0:0b9548db2291 264 }
rakware 0:0b9548db2291 265
rakware 0:0b9548db2291 266 void pwm_min()
rakware 0:0b9548db2291 267 {
rakware 0:0b9548db2291 268 menu_state = PWM_MIN;
rakware 0:0b9548db2291 269 }
rakware 0:0b9548db2291 270
rakware 0:0b9548db2291 271 void pwm_max()
rakware 0:0b9548db2291 272 {
rakware 0:0b9548db2291 273 menu_state = PWM_MAX;
rakware 0:0b9548db2291 274 }
rakware 0:0b9548db2291 275
rakware 0:0b9548db2291 276 void sun_rise()
rakware 0:0b9548db2291 277 {
rakware 0:0b9548db2291 278 menu_state = SUNRISE;
rakware 0:0b9548db2291 279 }
rakware 0:0b9548db2291 280
rakware 0:0b9548db2291 281 void sun_set()
rakware 0:0b9548db2291 282 {
rakware 0:0b9548db2291 283 menu_state = SUNSET;
rakware 0:0b9548db2291 284 }
rakware 0:0b9548db2291 285
rakware 0:0b9548db2291 286 void ramp_time()
rakware 0:0b9548db2291 287 {
rakware 0:0b9548db2291 288 menu_state = RAMPTIME;
rakware 0:0b9548db2291 289 }
rakware 0:0b9548db2291 290
rakware 0:0b9548db2291 291 void set_date_time()
rakware 0:0b9548db2291 292 {
rakware 0:0b9548db2291 293 menu_state = SET_DATE_TIME;
rakware 0:0b9548db2291 294 }
rakware 0:0b9548db2291 295
rakware 0:0b9548db2291 296 // void inc() {
rakware 0:0b9548db2291 297 // _pin = _pin + 0.01/8.0; // 0.01 = 1% => 0.125% increments, if you modify this you need to modify 'ramp/8' too
rakware 0:0b9548db2291 298 // }
rakware 0:0b9548db2291 299 // void dec() {
rakware 0:0b9548db2291 300 // _pin = _pin - 0.01/8.0;
rakware 0:0b9548db2291 301 // }
rakware 0:0b9548db2291 302
rakware 0:0b9548db2291 303 //void bl(uint8_t pwmnameArray[10][3], PwmOut &pwmname, Ticker &pwmname_t, Ramp &pwmname_r) //pwmnameArray, pwmname, pwmname_t, pwmname_r
rakware 0:0b9548db2291 304 //void bl()
rakware 0:0b9548db2291 305 //{
rakware 0:0b9548db2291 306 // struct tm *t;
rakware 0:0b9548db2291 307 // time_t seconds = time(NULL);
rakware 0:0b9548db2291 308 // t = localtime(&seconds);
rakware 0:0b9548db2291 309 //
rakware 0:0b9548db2291 310 // int timerica = (t->tm_hour*3600) + (t->tm_min*60) + t->tm_sec;
rakware 0:0b9548db2291 311 //
rakware 0:0b9548db2291 312 // for (uint8_t index = 0; index < 10; index++) { //cycle array (sizeof(pwmArray)/sizeof(pwmArray[0])) = 0?
rakware 0:0b9548db2291 313 //
rakware 0:0b9548db2291 314 //// if (pwmnameArray[index][2] != 255 && pwmnameArray[index+1][2] != 255) {
rakware 0:0b9548db2291 315 ////
rakware 0:0b9548db2291 316 //// if ( timerica == (pwmnameArray[index][0]*3600) + (pwmnameArray[index][1]*60) ) {
rakware 0:0b9548db2291 317 ////
rakware 0:0b9548db2291 318 //// pwmname_t.detach();
rakware 0:0b9548db2291 319 ////
rakware 0:0b9548db2291 320 //// pwmname = pwmnameArray[index][2]/100.0;
rakware 0:0b9548db2291 321 ////
rakware 0:0b9548db2291 322 //// float ramp = float( (((pwmnameArray[index+1][0]*3600) + (pwmnameArray[index+1][1]*60))-((pwmnameArray[index][0]*3600) + (pwmnameArray[index][1]*60))) ) / float( (pwmnameArray[index+1][2]-pwmnameArray[index][2]) ) ;
rakware 0:0b9548db2291 323 ////
rakware 0:0b9548db2291 324 //// pc.printf("ramp ?%f\n", ramp);
rakware 0:0b9548db2291 325 ////
rakware 0:0b9548db2291 326 //// if (ramp > 0) {
rakware 0:0b9548db2291 327 //// pwmname_t.attach(&pwmname_r, &Ramp::inc, ramp/8);
rakware 0:0b9548db2291 328 //// }
rakware 0:0b9548db2291 329 //// if (ramp < 0) {
rakware 0:0b9548db2291 330 //// pwmname_t.attach(&pwmname_r, &Ramp::dec, ramp/8);
rakware 0:0b9548db2291 331 //// }
rakware 0:0b9548db2291 332 ////
rakware 0:0b9548db2291 333 //// pc.printf("PWMSTART\n");
rakware 0:0b9548db2291 334 //// pc.printf("index %d\n",index);
rakware 0:0b9548db2291 335 //// }
rakware 0:0b9548db2291 336 //// }
rakware 0:0b9548db2291 337 //
rakware 0:0b9548db2291 338 //// if (pwmnameArray[index][2] != 255 && pwmnameArray[index+1][2] == 255) { //pwm_end = 255
rakware 0:0b9548db2291 339 //// if ( timerica == (pwmnameArray[index][0]*3600) + (pwmnameArray[index][1]*60) ) {
rakware 0:0b9548db2291 340 ////
rakware 0:0b9548db2291 341 //// pwmname_t.detach();
rakware 0:0b9548db2291 342 ////
rakware 0:0b9548db2291 343 //// pwmname = pwmnameArray[index][2]/100.0;
rakware 0:0b9548db2291 344 ////
rakware 0:0b9548db2291 345 //// pc.printf("PWMZERO\n");
rakware 0:0b9548db2291 346 //// pc.printf("index %d\n",index);
rakware 0:0b9548db2291 347 //// }
rakware 0:0b9548db2291 348 //// }
rakware 0:0b9548db2291 349 // }
rakware 0:0b9548db2291 350 //}
rakware 0:0b9548db2291 351
rakware 0:0b9548db2291 352 void incs()
rakware 0:0b9548db2291 353 {
rakware 0:0b9548db2291 354 for(uint8_t index = 0; index < sizeof(Pwm_Array)/sizeof(FastPWM); index++) { //index < sizeof(Pwm_Array)/sizeof(FastPWM)
rakware 0:0b9548db2291 355
rakware 0:0b9548db2291 356 double ramp = double( (Pwm_Min_Max_Array[index][1]-Pwm_Min_Max_Array[index][0]) ) / double( (( ((SunRiseSet[0][0]*3600) + (SunRiseSet[0][1]*60))+(ramptime*60) )-( (SunRiseSet[0][0]*3600) + (SunRiseSet[0][1]*60) )) ) ;
rakware 0:0b9548db2291 357
rakware 0:0b9548db2291 358 if (Pwm_Array[index].read() < Pwm_Min_Max_Array[index][1]/100.0) {
rakware 0:0b9548db2291 359 Pwm_Array[index] = Pwm_Array[index].read() + double(ramp/100.0);
rakware 0:0b9548db2291 360 pc.printf("sunrise:[%i]%f ", index, Pwm_Array[index].read());
rakware 0:0b9548db2291 361 }
rakware 0:0b9548db2291 362 if (Pwm_Array[index].read() > Pwm_Min_Max_Array[index][1]/100.0) {
rakware 0:0b9548db2291 363 Pwm_Array[index] = Pwm_Min_Max_Array[index][1]/100.0;
rakware 0:0b9548db2291 364 Sunrise_Ticker.detach();
rakware 0:0b9548db2291 365 pc.printf("\n sunrise end:[%i]%f \n", index, Pwm_Array[index].read());
rakware 0:0b9548db2291 366 }
rakware 0:0b9548db2291 367 }
rakware 0:0b9548db2291 368 }
rakware 0:0b9548db2291 369
rakware 0:0b9548db2291 370 void decs()
rakware 0:0b9548db2291 371 {
rakware 0:0b9548db2291 372 for(uint8_t index = 0; index < sizeof(Pwm_Array)/sizeof(FastPWM); index++) { //index < sizeof(Pwm_Array)/sizeof(FastPWM)
rakware 0:0b9548db2291 373
rakware 1:b0e2b4fdeb12 374 double ramp = double( (Pwm_Min_Max_Array[index][1]-Pwm_Min_Max_Array[index][0]) ) / double( (( ((SunRiseSet[1][0]*3600) + (SunRiseSet[1][1]*60))+(ramptime*60) )-( (SunRiseSet[1][0]*3600) + (SunRiseSet[1][1]*60) )) ) ;
rakware 0:0b9548db2291 375
rakware 1:b0e2b4fdeb12 376 if (Pwm_Array[index].read() > Pwm_Min_Max_Array[index][0]/100.0) {
rakware 1:b0e2b4fdeb12 377 Pwm_Array[index] = Pwm_Array[index].read() - double(ramp/100.0);
rakware 0:0b9548db2291 378 pc.printf("sunset:[%i]%f ", index, Pwm_Array[index].read());
rakware 0:0b9548db2291 379 }
rakware 1:b0e2b4fdeb12 380 if (Pwm_Array[index].read() < Pwm_Min_Max_Array[index][0]/100.0) {
rakware 1:b0e2b4fdeb12 381 Pwm_Array[index] = Pwm_Min_Max_Array[index][0]/100.0;
rakware 0:0b9548db2291 382 Sunset_Ticker.detach();
rakware 0:0b9548db2291 383 pc.printf("\n sunset end:[%i]%f \n", index, Pwm_Array[index].read());
rakware 0:0b9548db2291 384 }
rakware 0:0b9548db2291 385 }
rakware 0:0b9548db2291 386 }
rakware 0:0b9548db2291 387
rakware 0:0b9548db2291 388 //TODO
rakware 0:0b9548db2291 389 //init RTC
rakware 0:0b9548db2291 390
rakware 0:0b9548db2291 391 void set_time_from_rtc()
rakware 0:0b9548db2291 392 {
rakware 0:0b9548db2291 393 int rtc_hour;
rakware 0:0b9548db2291 394 int rtc_min;
rakware 0:0b9548db2291 395 int rtc_sec;
rakware 0:0b9548db2291 396 int rtc_dow; //day of week
rakware 0:0b9548db2291 397 int rtc_mday;
rakware 0:0b9548db2291 398 int rtc_mon;
rakware 0:0b9548db2291 399 int rtc_year;
rakware 0:0b9548db2291 400
rakware 0:0b9548db2291 401 rtc.readDateTime(&rtc_dow,&rtc_mday,&rtc_mon,&rtc_year,&rtc_hour,&rtc_min,&rtc_sec);
rakware 0:0b9548db2291 402 //TODO
rakware 0:0b9548db2291 403 //asuming that day of week is allways != 0, return an error if dow == 0.
rakware 0:0b9548db2291 404 lcd.cls();
rakware 0:0b9548db2291 405 lcd.printf("rtc: %i / %02i-%02i-%02i %02i:%02i:%02i",rtc_dow,rtc_mday,rtc_mon,rtc_year,rtc_hour,rtc_min,rtc_sec);
rakware 0:0b9548db2291 406
rakware 1:b0e2b4fdeb12 407
rakware 0:0b9548db2291 408 t.tm_sec = rtc_sec; // 0-59
rakware 0:0b9548db2291 409 t.tm_min = rtc_min; // 0-59
rakware 0:0b9548db2291 410 t.tm_hour = rtc_hour; // 0-23
rakware 0:0b9548db2291 411 t.tm_mday = rtc_mday; // 1-31
rakware 0:0b9548db2291 412 t.tm_mon = rtc_mon; // 0-11
rakware 0:0b9548db2291 413 t.tm_year = rtc_year-1900; // year since 1900
rakware 0:0b9548db2291 414
rakware 0:0b9548db2291 415 // convert to timestamp and set (1256729737)
rakware 0:0b9548db2291 416 time_t epoch = mktime(&t);
rakware 0:0b9548db2291 417 set_time(epoch);
rakware 0:0b9548db2291 418 wait(1); //not necessary
rakware 0:0b9548db2291 419 lcd.cls();
rakware 0:0b9548db2291 420 epoch = time(NULL);
rakware 0:0b9548db2291 421 lcd.printf("stm: %i / %02i-%02i-%02i %02i:%02i:%02i",rtc_dow,localtime(&epoch)->tm_mday,localtime(&epoch)->tm_mon,localtime(&epoch)->tm_year+1900,localtime(&epoch)->tm_hour,localtime(&epoch)->tm_min,localtime(&epoch)->tm_sec);
rakware 0:0b9548db2291 422 wait(1); //not necessary
rakware 0:0b9548db2291 423 }
rakware 0:0b9548db2291 424
rakware 0:0b9548db2291 425 void read_eeprom() //int nbyte_read( int mem_addr, void *data, int size ); //TODO
rakware 0:0b9548db2291 426 {
rakware 0:0b9548db2291 427 char data2[4096]; //32Kbit eeprom
rakware 0:0b9548db2291 428 // pc.printf("memory int data read!\n");
rakware 0:0b9548db2291 429 eeprom.nbyte_read( 0, &data2, 4096 ); //MAXADR_24LCXXX <=4096
rakware 0:0b9548db2291 430 //lcd.printf("int:%d sizeofint:%d",data2, sizeof(uint8_t));
rakware 0:0b9548db2291 431 // pc.printf("\nend\n");
rakware 0:0b9548db2291 432 lcd.printf("sizeof: %d", sizeof(data2));
rakware 0:0b9548db2291 433 }
rakware 0:0b9548db2291 434
rakware 0:0b9548db2291 435 int main()
rakware 0:0b9548db2291 436 {
rakware 0:0b9548db2291 437 //lcd init
rakware 0:0b9548db2291 438 lcd.setBacklight(TextLCD::LightOn);
rakware 0:0b9548db2291 439 lcd.setMode(TextLCD::DispOn);
rakware 0:0b9548db2291 440
rakware 0:0b9548db2291 441 //TODO
rakware 0:0b9548db2291 442 //rtc init (set 32KHz output to enable, erase OSF, etc?
rakware 1:b0e2b4fdeb12 443
rakware 1:b0e2b4fdeb12 444
rakware 1:b0e2b4fdeb12 445 char buffer[32];
rakware 1:b0e2b4fdeb12 446 struct tm *twhile;
rakware 1:b0e2b4fdeb12 447
rakware 0:0b9548db2291 448 set_time_from_rtc(); //read time from DS3231, set time to STM32
rakware 0:0b9548db2291 449 //read external EEPROM and restore saved values (what values?)
rakware 0:0b9548db2291 450 //lcd.cls();
rakware 0:0b9548db2291 451 //read_eeprom();
rakware 0:0b9548db2291 452 //wait(4);
rakware 0:0b9548db2291 453
rakware 0:0b9548db2291 454 //TODO set initial pwm_channel state (ie: if it's betweeen sunrise_end and sunset_start set it to sunrise_max, if it's ramping calculate the initial value
rakware 0:0b9548db2291 455
rakware 1:b0e2b4fdeb12 456 //initial state = pwm_min
rakware 1:b0e2b4fdeb12 457 for(uint8_t index = 0; index < sizeof(Pwm_Array)/sizeof(FastPWM); index++) {
rakware 2:c50dfa998b4c 458 Pwm_Array[index].period_ms(2); //500Hz
rakware 1:b0e2b4fdeb12 459 Pwm_Array[index] = Pwm_Min_Max_Array[index][0]/100.0;
rakware 1:b0e2b4fdeb12 460 }
rakware 1:b0e2b4fdeb12 461
rakware 1:b0e2b4fdeb12 462 //see if we are between sunrise and sunset
rakware 1:b0e2b4fdeb12 463 time_t seconds = time(NULL);
rakware 1:b0e2b4fdeb12 464 twhile = localtime(&seconds);
rakware 1:b0e2b4fdeb12 465
rakware 1:b0e2b4fdeb12 466 int timerica = (twhile->tm_hour*3600) + (twhile->tm_min*60) + twhile->tm_sec;
rakware 1:b0e2b4fdeb12 467
rakware 1:b0e2b4fdeb12 468 if ((timerica > (SunRiseSet[0][0]*3600) + (SunRiseSet[0][1]*60)) && (timerica < (SunRiseSet[1][0]*3600) + (SunRiseSet[1][1]*60))) {
rakware 1:b0e2b4fdeb12 469 for(uint8_t index = 0; index < sizeof(Pwm_Array)/sizeof(FastPWM); index++) {
rakware 1:b0e2b4fdeb12 470 Pwm_Array[index] = Pwm_Min_Max_Array[index][1]/100.0; //add smoothing
rakware 1:b0e2b4fdeb12 471 pc.printf("pwm:[%i]%f ", index, Pwm_Array[index].read());
rakware 1:b0e2b4fdeb12 472 }
rakware 1:b0e2b4fdeb12 473 }
rakware 1:b0e2b4fdeb12 474
rakware 1:b0e2b4fdeb12 475
rakware 1:b0e2b4fdeb12 476
rakware 0:0b9548db2291 477 qei_idx.mode(PullUp);
rakware 0:0b9548db2291 478 qei_t.attach(&qei_cb, 0.05); //calls qei_cb every 50ms
rakware 0:0b9548db2291 479
rakware 0:0b9548db2291 480 Menu settingsMenu("SettingsID");
rakware 0:0b9548db2291 481
rakware 0:0b9548db2291 482 Menu pwm_minMenu("PWM MinID");
rakware 0:0b9548db2291 483 pwm_minMenu.add(Selection(&pwm_min, 0, NULL, "< CH00 >"));
rakware 0:0b9548db2291 484 pwm_minMenu.add(Selection(&pwm_min, 1, NULL, "< CH01 >"));
rakware 0:0b9548db2291 485 pwm_minMenu.add(Selection(&pwm_min, 2, NULL, "< CH02 >"));
rakware 0:0b9548db2291 486 pwm_minMenu.add(Selection(&pwm_min, 3, NULL, "< CH03 >"));
rakware 0:0b9548db2291 487 pwm_minMenu.add(Selection(&pwm_min, 4, NULL, "< CH04 >"));
rakware 0:0b9548db2291 488 pwm_minMenu.add(Selection(&pwm_min, 5, NULL, "< CH05 >"));
rakware 0:0b9548db2291 489 pwm_minMenu.add(Selection(&pwm_min, 6, NULL, "< CH06 >"));
rakware 0:0b9548db2291 490 pwm_minMenu.add(Selection(&pwm_min, 7, NULL, "< CH07 >"));
rakware 0:0b9548db2291 491 pwm_minMenu.add(Selection(&pwm_min, 8, NULL, "< CH08 >"));
rakware 0:0b9548db2291 492 pwm_minMenu.add(Selection(&pwm_min, 9, NULL, "< CH09 >"));
rakware 0:0b9548db2291 493 pwm_minMenu.add(Selection(NULL, 10, &settingsMenu, "< Return >"));
rakware 0:0b9548db2291 494
rakware 0:0b9548db2291 495 Menu pwm_maxMenu("PWM MaxID");
rakware 0:0b9548db2291 496 pwm_maxMenu.add(Selection(&pwm_max, 0, NULL, "< CH00 >"));
rakware 0:0b9548db2291 497 pwm_maxMenu.add(Selection(&pwm_max, 1, NULL, "< CH01 >"));
rakware 0:0b9548db2291 498 pwm_maxMenu.add(Selection(&pwm_max, 2, NULL, "< CH02 >"));
rakware 0:0b9548db2291 499 pwm_maxMenu.add(Selection(&pwm_max, 3, NULL, "< CH03 >"));
rakware 0:0b9548db2291 500 pwm_maxMenu.add(Selection(&pwm_max, 4, NULL, "< CH04 >"));
rakware 0:0b9548db2291 501 pwm_maxMenu.add(Selection(&pwm_max, 5, NULL, "< CH05 >"));
rakware 0:0b9548db2291 502 pwm_maxMenu.add(Selection(&pwm_max, 6, NULL, "< CH06 >"));
rakware 0:0b9548db2291 503 pwm_maxMenu.add(Selection(&pwm_max, 7, NULL, "< CH07 >"));
rakware 0:0b9548db2291 504 pwm_maxMenu.add(Selection(&pwm_max, 8, NULL, "< CH08 >"));
rakware 0:0b9548db2291 505 pwm_maxMenu.add(Selection(&pwm_max, 9, NULL, "< CH09 >"));
rakware 0:0b9548db2291 506 pwm_maxMenu.add(Selection(NULL, 10, &settingsMenu, "< Return >"));
rakware 0:0b9548db2291 507
rakware 0:0b9548db2291 508 // Menu sunriseMenu("PWM MaxID");
rakware 0:0b9548db2291 509 //
rakware 0:0b9548db2291 510 // Menu sunsetMenu("PWM MaxID");
rakware 0:0b9548db2291 511
rakware 0:0b9548db2291 512 // Menu ramptimeMenu("RampTimeID");
rakware 0:0b9548db2291 513
rakware 0:0b9548db2291 514 settingsMenu.add(Selection(NULL, 0, &pwm_maxMenu, "<PWM Day>"));
rakware 0:0b9548db2291 515 settingsMenu.add(Selection(NULL, 1, &pwm_minMenu, "<PWM Night>"));
rakware 0:0b9548db2291 516 settingsMenu.add(Selection(&sun_rise, 2, NULL, "<Sunrise>"));
rakware 0:0b9548db2291 517 settingsMenu.add(Selection(&sun_set, 3, NULL, "<Sunset>"));
rakware 0:0b9548db2291 518 settingsMenu.add(Selection(&ramp_time, 4, NULL, "<Ramp Time>"));
rakware 0:0b9548db2291 519 settingsMenu.add(Selection(&set_date_time, 5, NULL, "<Set Date/Time>"));
rakware 0:0b9548db2291 520
rakware 0:0b9548db2291 521 settingsMenu.add(Selection(&exit_settings, 6, NULL, "<Exit Setup>"));
rakware 0:0b9548db2291 522
rakware 0:0b9548db2291 523 activeMenu = &settingsMenu;
rakware 0:0b9548db2291 524
rakware 0:0b9548db2291 525 while(1) {
rakware 0:0b9548db2291 526
rakware 0:0b9548db2291 527 time_t seconds = time(NULL);
rakware 0:0b9548db2291 528 strftime(buffer, 32, "%H:%M:%S", localtime(&seconds));
rakware 0:0b9548db2291 529
rakware 0:0b9548db2291 530
rakware 0:0b9548db2291 531 twhile = localtime(&seconds);
rakware 0:0b9548db2291 532
rakware 0:0b9548db2291 533 int timerica = (twhile->tm_hour*3600) + (twhile->tm_min*60) + twhile->tm_sec;
rakware 0:0b9548db2291 534
rakware 0:0b9548db2291 535
rakware 1:b0e2b4fdeb12 536 pc.printf("time: %s in seconds: %d sunrise: %d sunset: %d\n", buffer, timerica, (SunRiseSet[0][0]*3600) + (SunRiseSet[0][1]*60), (SunRiseSet[1][0]*3600) + (SunRiseSet[1][1]*60) );
rakware 0:0b9548db2291 537
rakware 0:0b9548db2291 538 if (timerica == (SunRiseSet[0][0]*3600) + (SunRiseSet[0][1]*60)) { //TODO attach once at start out of while()
rakware 0:0b9548db2291 539 Sunrise_Ticker.attach(&incs,1); //TODO check if allready attached
rakware 0:0b9548db2291 540 }
rakware 1:b0e2b4fdeb12 541
rakware 0:0b9548db2291 542 if (timerica == (SunRiseSet[1][0]*3600) + (SunRiseSet[1][1]*60)) {
rakware 0:0b9548db2291 543 Sunset_Ticker.attach(&decs,1); //TODO check if allready attached
rakware 1:b0e2b4fdeb12 544 pc.printf("sunset timer attached to decs\n");
rakware 0:0b9548db2291 545 }
rakware 0:0b9548db2291 546
rakware 0:0b9548db2291 547 // for(uint8_t index = 0; index < 3; index++) { //index < sizeof(Pwm_Array)/sizeof(FastPWM)
rakware 0:0b9548db2291 548 // pc.printf("pwm:[%i]%f ", index, Pwm_Array[index].read());
rakware 0:0b9548db2291 549 // }
rakware 0:0b9548db2291 550
rakware 0:0b9548db2291 551
rakware 0:0b9548db2291 552 if (refresh_display == true) {
rakware 0:0b9548db2291 553 switch(menu_state) {
rakware 0:0b9548db2291 554 case MAIN:
rakware 0:0b9548db2291 555 lcd.cls();
rakware 1:b0e2b4fdeb12 556 lcd.printf(" BAT-LED ");
rakware 1:b0e2b4fdeb12 557 lcd.printf(" v.1.0 ");
rakware 0:0b9548db2291 558 refresh_display = false;
rakware 0:0b9548db2291 559 break;
rakware 0:0b9548db2291 560 case SETTINGS:
rakware 0:0b9548db2291 561 lcd.cls();
rakware 0:0b9548db2291 562 lcd.locate(0,0);
rakware 0:0b9548db2291 563 lcd.printf("%s", activeMenu->menuID);
rakware 0:0b9548db2291 564 lcd.locate(0,1);
rakware 0:0b9548db2291 565 lcd.printf("%s", activeMenu->selections[cursorPos].selText);
rakware 0:0b9548db2291 566 refresh_display = false;
rakware 0:0b9548db2291 567 break;
rakware 0:0b9548db2291 568 case PWM_MIN:
rakware 0:0b9548db2291 569 lcd.cls();
rakware 0:0b9548db2291 570 lcd.printf("%s %2i", activeMenu->menuID, cursorPos);
rakware 0:0b9548db2291 571 lcd.locate(0,1);
rakware 0:0b9548db2291 572 lcd.printf("<- %3i%% +>", Pwm_Min_Max_Array[cursorPos][0]);
rakware 0:0b9548db2291 573 refresh_display = false;
rakware 0:0b9548db2291 574 break;
rakware 0:0b9548db2291 575 case PWM_MAX:
rakware 0:0b9548db2291 576 lcd.cls();
rakware 0:0b9548db2291 577 lcd.printf("%s %2i", activeMenu->menuID, cursorPos);
rakware 0:0b9548db2291 578 lcd.locate(0,1);
rakware 0:0b9548db2291 579 lcd.printf("<- %3i%% +>", Pwm_Min_Max_Array[cursorPos][1]);
rakware 0:0b9548db2291 580 refresh_display = false;
rakware 0:0b9548db2291 581 break;
rakware 0:0b9548db2291 582 case SUNRISE:
rakware 0:0b9548db2291 583 lcd.cls();
rakware 0:0b9548db2291 584 lcd.printf("%s %2i", activeMenu->menuID, cursorPos);
rakware 0:0b9548db2291 585 lcd.locate(0,1);
rakware 0:0b9548db2291 586 lcd.printf("%02d:%02d", SunRiseSet[0][0],SunRiseSet[0][1]);
rakware 0:0b9548db2291 587 refresh_display = false;
rakware 0:0b9548db2291 588 break;
rakware 0:0b9548db2291 589 case SUNRISE_HOUR:
rakware 0:0b9548db2291 590 while(menu_state == SUNRISE_HOUR) {
rakware 0:0b9548db2291 591 lcd.locate(0,1);
rakware 0:0b9548db2291 592 lcd.printf(" ");
rakware 0:0b9548db2291 593 wait(0.1);
rakware 0:0b9548db2291 594 lcd.locate(0,1);
rakware 0:0b9548db2291 595 lcd.printf("%02d",SunRiseSet[0][0]);
rakware 0:0b9548db2291 596 wait(0.2);
rakware 0:0b9548db2291 597 }
rakware 0:0b9548db2291 598 break;
rakware 0:0b9548db2291 599 case SUNRISE_MINUTE:
rakware 0:0b9548db2291 600 while(menu_state == SUNRISE_MINUTE) {
rakware 0:0b9548db2291 601 lcd.locate(3,1);
rakware 0:0b9548db2291 602 lcd.printf(" ");
rakware 0:0b9548db2291 603 wait(0.1);
rakware 0:0b9548db2291 604 lcd.locate(3,1);
rakware 0:0b9548db2291 605 lcd.printf("%02d",SunRiseSet[0][1]);
rakware 0:0b9548db2291 606 wait(0.2);
rakware 0:0b9548db2291 607 }
rakware 0:0b9548db2291 608 break;
rakware 0:0b9548db2291 609 case SUNSET:
rakware 0:0b9548db2291 610 lcd.cls();
rakware 0:0b9548db2291 611 lcd.printf("%s %2i", activeMenu->menuID, cursorPos);
rakware 0:0b9548db2291 612 lcd.locate(0,1);
rakware 0:0b9548db2291 613 lcd.printf("%02d:%02d", SunRiseSet[1][0],SunRiseSet[1][1]);
rakware 0:0b9548db2291 614 refresh_display = false;
rakware 0:0b9548db2291 615 break;
rakware 0:0b9548db2291 616 case SUNSET_HOUR:
rakware 0:0b9548db2291 617 while(menu_state == SUNSET_HOUR) {
rakware 0:0b9548db2291 618 lcd.locate(0,1);
rakware 0:0b9548db2291 619 lcd.printf(" ");
rakware 0:0b9548db2291 620 wait(0.1);
rakware 0:0b9548db2291 621 lcd.locate(0,1);
rakware 0:0b9548db2291 622 lcd.printf("%02d",SunRiseSet[1][0]);
rakware 0:0b9548db2291 623 wait(0.2);
rakware 0:0b9548db2291 624 }
rakware 0:0b9548db2291 625 break;
rakware 0:0b9548db2291 626 case SUNSET_MINUTE:
rakware 0:0b9548db2291 627 while(menu_state == SUNSET_MINUTE) {
rakware 0:0b9548db2291 628 lcd.locate(3,1);
rakware 0:0b9548db2291 629 lcd.printf(" ");
rakware 0:0b9548db2291 630 wait(0.1);
rakware 0:0b9548db2291 631 lcd.locate(3,1);
rakware 0:0b9548db2291 632 lcd.printf("%02d",SunRiseSet[1][1]);
rakware 0:0b9548db2291 633 wait(0.2);
rakware 0:0b9548db2291 634 }
rakware 0:0b9548db2291 635 break;
rakware 0:0b9548db2291 636 case RAMPTIME:
rakware 0:0b9548db2291 637 lcd.cls();
rakware 0:0b9548db2291 638 lcd.printf("%s %2i", activeMenu->menuID, cursorPos);
rakware 0:0b9548db2291 639 lcd.locate(0,1);
rakware 0:0b9548db2291 640 lcd.printf("<- %3i +>", ramptime);
rakware 0:0b9548db2291 641 refresh_display = false;
rakware 0:0b9548db2291 642 break;
rakware 0:0b9548db2291 643 case SET_DATE_TIME:
rakware 0:0b9548db2291 644 lcd.cls();
rakware 0:0b9548db2291 645 lcd.printf("%02d/%02d/%04d",twhile->tm_mday, twhile->tm_mon, twhile->tm_year + 1900);
rakware 0:0b9548db2291 646 lcd.locate(0,1);
rakware 0:0b9548db2291 647 lcd.printf("%02d:%02d:%02d",twhile->tm_hour, twhile->tm_min, twhile->tm_sec);
rakware 0:0b9548db2291 648 refresh_display = false;
rakware 0:0b9548db2291 649 break;
rakware 0:0b9548db2291 650 }
rakware 0:0b9548db2291 651 }
rakware 0:0b9548db2291 652 wait(0.5);
rakware 0:0b9548db2291 653 }
rakware 0:0b9548db2291 654 }