aquarium light controller wannabe

Dependencies:   DS3231 FastPWM Menu QEI TextLCD _24LCXXX mbed

Committer:
rakware
Date:
Thu Mar 05 17:40:21 2015 +0000
Revision:
0:0b9548db2291
Child:
1:b0e2b4fdeb12
initial commit

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