Components and supplies
Arduino Mega 2560
MyOctopus i2c Barometric Air Pressure Sensor BMP280
Real Time Clock (RTC)
LCD Nokia 5110
PIR Motion Sensor (generic)
Apps and platforms
Arduino IDE
Project description
Code
Code for Sleep Quality Monitor VLS
arduino
The complete code for Code for Sleep Quality Monitor VLS
1// Sleep Quality Monitor VSL - Monitor da qualidade do sono 2// Charles - August/2016 - Version 3 - Jumbo 3#include <Keypad.h> 4#include <Wire.h> 5#include <Adafruit_BMP085.h> // Sensor de pressão atmosférica e temperatura 6Adafruit_BMP085 bmp; //Vcc=3.3V, UNO: SCL=A5, SDA=A4 MEGA: SCL=21, SDA=20 7#include <EEPROM.h> 8#include <DS1307.h> // rtc 9DS1307 rtc(A2, A3); //RTC A2=CLK A3=SDA VCC=5V 10#include <Adafruit_GFX.h> // para LCD Nokia 11#include <Adafruit_PCD8544.h> // para LCD Nokia 12#include <Keypad.h> 13Adafruit_PCD8544 lcd = Adafruit_PCD8544(13, 12, 11, 10, 9); //CLK DIN DC CE RST 14 15const byte ROWS = 4; //four rows 16const byte COLS = 3; //three columns 17char keys[ROWS][COLS] = { 18 {'1', '2', '3'}, 19 {'4', '5', '6'}, 20 {'7', '8', '9'}, 21 {'*', '0', '#'}, 22}; 23 24byte rowPins[ROWS] = {A10, A11, A12, A13}; //connect to the row pinouts of the keypad 25byte colPins[COLS] = {26, 24, 28}; //connect to the column pinouts of the keypad 26char key; 27Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 28 29int i, led=3,bot_luz=7,est_bot_luz,lights,cc=1,cc8,cc2,cc3,cc5,cc4,mov_cont, lastEEP, buzz=14, hora, minuto, bot_monit=8, sbot_monit; 30int tempoluz,vatual,tempo_sem_mov,tempo_mov_ant, tempo_sem_mov_max, hora_tot, minuto_tot,temp_tot; 31int timeout,timeout_val=150, hora_maior_mov, minuto_maior_mov, tempo_mov_atual, tempo_mov_max_h, tempo_mov_max_m; 32int func=1,pres,dhora, dminuto, acerto_hora, acerto_desp, desp=0, minuto_ant, minuto_ant1, mov=A0, smov, c6, pres_max, pres_min; 33int hpres_cont, hpres[13], smonit=0, tempo_sono, tempo_sono_inic, tempo_sono_final, hora_pos, cc7=80, h[20], mov_cont_ant; 34int tempo_sono_parcial, hora_parcial, minuto_parcial, conf=1, desp_tipo, relat[7], relat_num, max_val,mov_cont_atual,luz=4,sluz; 35unsigned int cont, umid, cont2, cont3; 36float temp, temp_ant; 37String sono_tipo="Sleep Ql", sp; 38Time t; 39const unsigned char PROGMEM af[] = {B00001, B00011, B00101, B11001, B11001, B00101, B00011, B00001}; //auto falante 40const unsigned char PROGMEM gr[] = {B00100, B01010, B01010, B00100}; //grau 41 42void setup() { 43 //Serial.begin(9600); 44 //rtc.halt(false); 45 //rtc.setDOW(FRIDAY); //Remover as linhas após a primeira execução 46 //rtc.setTime(06, 30, 00); 47 //rtc.setDate(19, 8, 2016); //Define o dia, mes e ano 48 //rtc.setSQWRate(SQW_RATE_1); 49 rtc.enableSQW(true); 50 bmp.begin(); 51 // Serial.println("Could not find a valid BMP085 sensor, check wiring!"); 52 // while (1) {} 53 // } 54 digitalWrite(buzz, HIGH); delay(40); digitalWrite(buzz, LOW); 55 delay(100); 56 pinMode(led, OUTPUT); 57 pinMode(luz, OUTPUT); 58 pinMode(mov, INPUT); 59 pinMode(bot_luz, INPUT); 60 pinMode(bot_monit, INPUT); 61 pinMode(buzz, OUTPUT); 62 63 lastEEP = EEPROM.read(0); if (lastEEP == 255) lastEEP = 0; //lê a última qt de medição na posição 0 64 tempoluz = EEPROM.read(200); if (tempoluz == 255) tempoluz = 0; //lê o tempo de luz acesa 65 desp = EEPROM.read(201); if (desp == 255) desp = 0; //0=despertador desligado, 1=despertador ativo 66 desp_tipo = EEPROM.read(202); if (desp_tipo == 255) desp_tipo = 0; //0=despertador desligado, 1=despertador ativo 67 dhora = EEPROM.read(203); if (dhora == 255) dhora = 0; //lê a hora do despertador 68 dminuto = EEPROM.read(204); if (dminuto == 255) dminuto = 0; //lê o minuto do despertador 69 relat_num = lastEEP; ledados_relat(); 70 71 lcd.begin(); 72 lcd.setContrast(50); //Ajusta o contraste do display 73 74 logo(); // Chama a tela de logo 75 delay(200); digitalWrite(led,HIGH); delay(300);digitalWrite(led,LOW); 76 77 pres = bmp.readPressure() / 100; 78 temp = bmp.readTemperature(); 79 pres_max = pres; pres_min = pres; 80 desp = 1; //1=ativo, 0=false = mudar para eeprom 81} 82 83void loop() { 84 sbot_monit = digitalRead(bot_monit); 85 if (sbot_monit == HIGH) { 86 func = 20; 87 //disp_monit(); 88 } 89 90 if (acerto_hora <= 0) gettime(); //a hora não está sendo alterada. Atualiza a hora 91 if (desp == 1) checa_desp(); //despertador ativo. Está na hora ? 92 letemp(); 93 if (smonit == 1) monit(); 94 95 key = keypad.getKey(); 96 if (key) { 97 timeout = 0; timeout_val = 200; // houve atividade, zera o timeout 98 if (key == '1') {func = 1;} 99 if (key == '2') {func = 2;} 100 if (key == '3') {func = 3;} 101 if (key == '4') {func = 4;} 102 if (key == '5') {func = 5;} 103 if (key == '6') {func = 6;} 104 if (key == '7') {func = 7;} 105 if (key == '8') {func = 8;} 106 if (key == '9') {func = 9;} 107 if (key == '0') {func = 10;} 108 } 109 if (func == 1) {disp_hora();relat_num = lastEEP;max_val = 0;acerto_desp = 0;} 110 if (func == 2) {disp_desp();acerto_hora = 0;} 111 if (func == 3) {disp_prev1();acerto_desp = 0;acerto_hora = 0;} 112 if (func == 4) {disp_tempo_sono();acerto_desp = 0;acerto_hora = 0;} 113 if (func == 5) {disp_qt_mov();acerto_desp = 0;acerto_hora = 0;} 114 if (func == 6) {disp_temp_inerte();acerto_desp = 0;acerto_hora = 0;} 115 if (func == 7) {relat_sono();acerto_desp = 0;acerto_hora = 0;} 116 if (func == 8) {graf_sono();acerto_desp = 0;acerto_hora = 0;} 117 if (func == 9) {disp_config();acerto_desp = 0;acerto_hora = 0;} 118 if (func == 10) {logo();acerto_desp = 0;acerto_hora = 0;} 119 if (func == 20) {disp_monit();acerto_desp = 0;acerto_hora = 0;} 120 121 timeout = timeout + 1; 122 if (timeout >= timeout_val) { //tempo de inatividade, volta para tela principal 123 if (smonit == 0) func = 1; 124 if (smonit == 1) func = 20; 125 timeout = 0; 126 } 127 128 //Botão liga ou desliga o led, após cerca de 10 minutos começa o fade out do led 129 est_bot_luz = digitalRead(bot_luz); 130 if (est_bot_luz == HIGH) { 131 ligaluz(3); 132 } 133 else { 134 cont3 = 0; // Desativa contador do SQ 135 } 136 if (tempoluz > 0 && lights >= 1) { 137 esmaece(); //Se tempoluz=0 não apaga, caso contrário, começa a esmaecer 138 } 139 140 if (acerto_hora == 0 && key == '*' && func != 7 && func != 9) ligaluz(0); 141 142} 143 144void disp_config(){ 145 timeout_val=2000; //aumenta o timeout nessa tela 146 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 147 lcd.setTextSize(1);lcd.setCursor(3,1); lcd.print("Configuracoes");lcd.setTextColor(BLACK); 148 149 if (key == '*'){conf = conf + 1;cc2=0;cc3=0;} 150 lcd.drawRect(0,10*conf,84,10,BLACK); 151 152 lcd.setCursor(0,11);lcd.print("Tempo luz:");if (tempoluz == 0) {lcd.print("--");} else {lcd.print(tempoluz);} 153 lcd.setCursor(0,21);lcd.print("Qtd.beeps:");lcd.print(desp_tipo); 154 if (cc2 == 0){lcd.setCursor(0,31);lcd.print("DEL ult monit");} 155 if (cc2 == 1){lcd.setCursor(0,31);lcd.print(" # Confirma ");} 156 if (cc2 == 2){ 157 for (i=20;i<=179;i=i+20){EEPROM.write(i+lastEEP,0);} 158 lastEEP = lastEEP -1; EEPROM.write(0,lastEEP); 159 lcd.setCursor(0,31); lcd.print("Monit. APAGADA");lcd.display();delay(1500);cc2 = 0;} 160 if (cc3 == 0){lcd.setCursor(0,41);lcd.print("Apagar memoria");} 161 if (cc3 == 1){lcd.setCursor(0,41);lcd.print(" # Confirma ");} 162 if (cc3 == 2){ 163 lastEEP = 0; for (i=0;i<=255;i++){EEPROM.write(i,0);} 164 lcd.setCursor(0,41); lcd.print("Memor APAGADA");lcd.display();delay(1500);cc3 = 0;} 165 166 if (conf == 1 && key == '#'){tempoluz = tempoluz + 5; if (tempoluz >= 32) {tempoluz=0;} EEPROM.write(200,tempoluz);} 167 if (conf == 2 && key == '#'){desp_tipo = desp_tipo + 1; if (desp_tipo > 10) {desp_tipo = 0;} EEPROM.write(202,desp_tipo);} 168 if (conf == 3 && key == '#'){cc2 = cc2 + 1;} 169 if (conf == 4 && key == '#'){cc3 = cc3 + 1;} 170 if (conf >= 5) conf = 1; 171 172 lcd.display(); 173} 174 175void disp_desp(){ 176 lcd.clearDisplay();lcd.setTextColor(BLACK); 177 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 178 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 179 if (dhora <= 9) {lcd.print("0");lcd.print(dhora);} 180 if (dhora > 9) {lcd.print(dhora);} 181 lcd.setCursor(33,2);lcd.print(":"); 182 lcd.setCursor(44,2); // posição do minuto 183 if (dminuto <= 9) {lcd.print("0");lcd.print(dminuto);} 184 if (dminuto > 9) {lcd.print(dminuto);} 185 lcd.setTextSize(1); 186 187 //acerto da hora do despertador 188 if (key == '#') acerto_desp = acerto_desp + 1; 189 if (acerto_desp == 1) { 190 lcd.setCursor(0,30);lcd.print("* Muda HORA"); 191 lcd.setCursor(0,40);lcd.print("# Confirma"); 192 } 193 if (acerto_desp == 2) { 194 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 195 lcd.setCursor(0,40);lcd.print("# Confirma"); 196 } 197 if (acerto_desp == 3 & desp == 1) { 198 lcd.setCursor(0,30);lcd.print("* ALARME Ligad"); 199 lcd.setCursor(0,40);lcd.print("# Confirma"); 200 } 201 if (acerto_desp == 3 & desp == 0) { 202 lcd.setCursor(0,30);lcd.print("* ALARME Deslg"); 203 lcd.setCursor(0,40);lcd.print("# Confirma"); 204 } 205if (acerto_desp == 4) { 206 lcd.setCursor(0,30); 207 if (desp == 1) {lcd.print("Despert.LIGADO");} 208 if (desp == 0) {lcd.print("Despert. DELIG");} 209 EEPROM.write(203,dhora);EEPROM.write(204,dminuto);EEPROM.write(201,desp); //salva hora, minuto e situação do alarme 210 lcd.display(); delay(2000); acerto_desp = 0; 211 } 212 if (acerto_desp == 1 & key == '*'){dhora = dhora + 1;if (dhora >= 24){dhora = 0;}} 213 if (acerto_desp == 2 & key == '*'){dminuto = dminuto + 1;if (dminuto >= 60){dminuto = 0;}} 214 if (acerto_desp == 3 & key == '*'){if (desp == 0){desp = 1;} else {desp = 0;}} 215 216 if (acerto_desp == 0){disp_hora_peq(); disp_desp_peq();} //hora não está sendo alterada. Mostra demais informações 217 lcd.display(); 218} 219 220void disp_hora(){ 221 lcd.clearDisplay();lcd.setTextColor(BLACK); 222 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 223 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 224 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 225 if (hora > 9) {lcd.print(hora);} 226 lcd.setCursor(33,2); 227 cc5 = cc5 + 1; 228 if (cc5 < 10) lcd.print(" "); 229 if (cc5 > 10 && cc5 < 20){lcd.print(":");} 230 if (cc5 > 20) cc5 = 0; 231 lcd.setCursor(44,2); // posição do minuto 232 if (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 233 if (minuto > 9) {lcd.print(minuto);} 234 lcd.setTextSize(1); 235 236 //acerto da hora 237 if (key == '#') acerto_hora = acerto_hora + 1; 238 if (acerto_hora == 1) { 239 lcd.setCursor(0,30);lcd.print("* Muda HORA"); 240 lcd.setCursor(0,40);lcd.print("# Confirma"); 241 } 242 if (acerto_hora == 2) { 243 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 244 lcd.setCursor(0,40);lcd.print("# Confirma"); 245 } 246 if (acerto_hora == 3) { 247 lcd.setCursor(0,30);lcd.print("Hora alterada"); 248 rtc.setTime(hora, minuto, 00); 249 lcd.display(); delay(1500); acerto_hora = 0; 250 } 251 if (acerto_hora == 1 & key == '*'){hora = hora + 1;if (hora >= 24){hora = 0;}} 252 if (acerto_hora == 2 & key == '*'){minuto = minuto + 1;if (minuto >= 60){minuto = 0;}} 253 254 if (acerto_hora == 0){disp_prev(); disp_temp_peq();} //hora não está sendo alterada. Mostra demais informações 255 lcd.display(); 256} 257 258void disp_monit(){ 259 lcd.clearDisplay();lcd.setTextColor(BLACK); 260 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 261 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 262 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 263 if (hora > 9) {lcd.print(hora);} 264 lcd.setCursor(33,2); 265 cc5 = cc5 + 1; 266 if (cc5 < 20) lcd.print(" "); 267 if (cc5 > 20 && cc5 < 40){lcd.print(":");} 268 if (cc5 > 40) cc5 = 0; 269 lcd.setCursor(44,2); // posição do minuto 270 if (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 271 if (minuto > 9) {lcd.print(minuto);} 272 273 lcd.setTextSize(1); 274 if (sbot_monit == HIGH && smonit == 0 ){ // Monitoração iniciada ********* 275 cc7 = 80;ligaluz(1);gettime();smonit = 1;sbot_monit = LOW;mov_cont = 0; 276 tempo_sono_inic = hora * 60 + minuto;hora_pos = hora + 1;if (hora_pos == 24) hora_pos = 0;limpa_grafsono(); 277 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 278 lcd.setCursor(0,38);lcd.print(" Iniciada");lcd.display(); delay(1500);} 279 else if (sbot_monit == HIGH && smonit == 1 ){ // Monitaração terminada ********** 280 ligaluz(1);smonit = 0; tempo_sono_final = hora * 60 + minuto;salva_monit();relat_num = lastEEP;func = 7; 281 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 282 lcd.setCursor(0,38);lcd.print(" Concluida"); lcd.display();delay(1500);} 283 284 tempo_sono_parcial = hora * 60 + minuto; 285 if (tempo_sono_parcial < tempo_sono_inic) tempo_sono_parcial = tempo_sono_parcial + 1440; //passou da meia noite, add 1 dia 286 hora_parcial = (tempo_sono_parcial - tempo_sono_inic) / 60; 287 minuto_parcial = (tempo_sono_parcial - tempo_sono_inic) - (hora_parcial * 60); 288 289 lcd.fillRoundRect(0,25,36,23,1,BLACK); 290 lcd.setCursor(1,30);lcd.setTextColor(WHITE);lcd.setTextSize(2); 291 if (mov_cont <=9) {lcd.print(" ");} 292 lcd.print(mov_cont);lcd.setTextSize(1);lcd.setTextColor(BLACK); 293 lcd.drawRoundRect(35,25,49,23,1,BLACK); //box 294 lcd.setCursor(37,27);lcd.print("T.Sono");lcd.setCursor(37,37); 295 cc8 = cc8 + 1; if (cc8 <= 5){lcd.fillRoundRect(0,25,36,23,1,BLACK);} if (cc8 > 15 ) cc8 = 0; //pisca qt de movimentos 296 lcd.print(hora_parcial);lcd.print("h");if (minuto_parcial <=9 ){lcd.print("0");}lcd.print(minuto_parcial); 297 if (desp == 1) lcd.drawBitmap(70,37,af,8,8,BLACK); 298 lcd.display(); 299} 300 301void disp_prev1(){ 302 letemp(); 303 lcd.clearDisplay();lcd.setTextColor(BLACK); 304 lcd.drawRoundRect(0,0,64,26,1,BLACK); //moldura da hora 305 for (i=1;i<=84;i=i+2){lcd.drawPixel(i,13,BLACK);} 306 lcd.drawRoundRect(0,25,28,23,1,BLACK); 307 lcd.drawRoundRect(27,25,28,23,1,BLACK); 308 lcd.drawRoundRect(54,25,30,23,1,BLACK); 309 lcd.setTextSize(1); 310 lcd.setCursor(66,4);lcd.print("Sol"); 311 lcd.setCursor(66,15);lcd.print("Chu"); 312 lcd.setCursor(4,28);lcd.print("Max");lcd.setCursor(4,38);lcd.print(pres_max); 313 lcd.setCursor(32,28);lcd.print("Min");lcd.setCursor(32,38);lcd.print(pres_min); 314 lcd.setCursor(60,28);lcd.print("Atu"); lcd.setCursor(60,38);lcd.print(pres); 315 316 for (i=1;i<=hpres_cont;i++){lcd.fillRect(i*5-2,25,3,map(hpres[i],924,940,0,-25),BLACK);} //pressão varia de 890 a 940 em sp 317 lcd.display(); 318} 319 320void disp_qt_mov(){ 321 timeout_val = 2000; // Aumenta o timeout nesta tela 322 max_val = 0; 323 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 324 lcd.setCursor(1,1);lcd.print("Movimentos");lcd.setTextColor(BLACK); 325 int boxinit = -2; 326 for (i=1;i<=20;i++){ // captura o maior valor para referência no gráfico 327 vatual = EEPROM.read(i+20); if (vatual == 255) {vatual = 0;} 328 if (vatual > max_val) {max_val = vatual;} } 329 for (i=1;i<=20;i++){ 330 boxinit = boxinit + 4; 331 int boxsize = map(EEPROM.read(i+20),0,max_val,0,34); // 21 é a posição da memória dos movimentos 332 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 333 } 334 lcd.display(); 335} 336 337void disp_temp_inerte(){ 338 timeout_val = 2000; // Aumenta o timeout nesta tela 339 max_val = 0; 340 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 341 lcd.setCursor(1,1);lcd.print("Tempo Inerte");lcd.setTextColor(BLACK); 342 int boxinit = -2; 343 for (i=101;i<=120;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 344 for (i=1;i<=20;i++){ 345 boxinit = boxinit + 4; 346 int t = EEPROM.read(i+100)* 60 + EEPROM.read(i+120); // 101 é a posição da memória do tempo inerte 347 int boxsize = map(t,0,max_val,0,34); // 480 é o máximo de 8 horas sem movimentos durante o sono 348 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 349 } 350 lcd.display(); 351} 352 353void disp_tempo_sono(){ 354 timeout_val = 2000; // Aumenta o timeout nesta tela 355 max_val = 0; 356 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 357 lcd.setCursor(1,1);lcd.print("Tempo Sono");lcd.setTextColor(BLACK); 358 int boxinit = -2; 359 for (i=41;i<=60;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 360 for (i=1;i<=20;i++){ 361 boxinit = boxinit + 4; 362 int t = EEPROM.read(i+40)* 60 + EEPROM.read(i+60); // 41 é a posição da memória do tempo de sono 363 int boxsize = map(t,0,max_val,0,34); // 960 é o máximo de 16 horas de sono 364 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 365 } 366 lcd.display(); 367} 368 369void graf_sono(){ 370 timeout_val = 2000; // Aumenta o timeout nesta tela 371 max_val = 0; 372 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 373 lcd.setCursor(1,1);lcd.print("Grafico Sono");lcd.setTextColor(BLACK); 374 int boxinit = -2; 375 for (i=81;i<=100;i++){if (EEPROM.read(i) > max_val) max_val = EEPROM.read(i); } //checa maior valor 376 for (i=81;i<=100;i++){ 377 boxinit = boxinit + 4; 378 int boxsize = map(EEPROM.read(i),0,max_val,0,34); 379 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 380 } 381 lcd.display(); 382} 383 384void letemp(){ 385 cc4 = cc4 + 1; 386 temp_tot = temp_tot + bmp.readTemperature(); 387 if (cc4 >= 10) {cc4 = 0;temp = temp_tot / 10;temp_tot = 0;} // média da temperatura das última 10 medições 388 pres = bmp.readPressure()/100; 389 if (pres > pres_max) pres_max = pres; 390 if (pres < pres_min) pres_min = pres; 391 if ((minuto==0||minuto==10||minuto==20||minuto==30||minuto==40||minuto==50) && minuto != minuto_ant1) { 392 hpres_cont = hpres_cont + 1; 393 if (hpres_cont >= 12){for (i=1;i<=11;i++){hpres[i]=hpres[i+1];} hpres[12]=pres; hpres_cont = 11;} 394 hpres[hpres_cont] = pres; 395 minuto_ant1 = minuto; 396 } 397} 398 399void monit(){ 400 smov = digitalRead(mov); 401 if (smov == HIGH) { 402 c6 = c6 + 1; 403 if (c6 >= 30) { // Opa! mexeu. 30 é o ajuste de movimentos 404 mov_cont = mov_cont + 1; // soma 1 movimento 405 c6 = 0; 406 if (tempo_mov_ant > 0){ // a primeira vez não calcula 407 tempo_mov_atual = hora * 60 + minuto; // captura tempo atual 408 if (tempo_mov_atual < tempo_mov_ant) tempo_mov_atual = tempo_mov_atual + 1440; //passou da meia noite 409 tempo_sem_mov = tempo_mov_atual - tempo_mov_ant; 410 if (tempo_sem_mov > tempo_sem_mov_max) { 411 tempo_sem_mov_max = tempo_sem_mov; // 412 hora_maior_mov = hora; 413 minuto_maior_mov = minuto; 414 } 415 } 416 tempo_mov_ant = (hora * 60) + minuto; 417 } 418 } 419 420 //captura quantidade de movimentos realizados em cada hora 421 if (hora == hora_pos) { 422 cc7 = cc7 + (1 && cc7 <= 100); 423 mov_cont_atual = mov_cont - mov_cont_ant; 424 EEPROM.write(cc7,mov_cont_atual); 425 mov_cont_ant = mov_cont; 426 hora_pos = hora_pos + 1; if (hora_pos == 24) hora_pos = 0; 427 } 428} 429 430void relat_sono(){ 431 timeout_val=2000; //aumenta o timeout nessa tela 432 if (key == '7'){relat_num = lastEEP;} 433 if (key == '*'){relat_num = relat_num - 1;if (relat_num <= 0){relat_num = lastEEP;}} 434 if (key == '#'){relat_num = relat_num + 1;if (relat_num > lastEEP){relat_num = 1;}} 435 436 ledados_relat(); 437 438 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 439 lcd.setTextSize(1);lcd.setCursor(1,1); lcd.print("Rel:SONO");lcd.setCursor(72,1);lcd.print(relat_num - lastEEP); 440 lcd.setTextColor(BLACK); 441 lcd.setCursor(0,11);lcd.print("T.sono :");lcd.print(relat[1]); lcd.print("h"); if (relat[2] <= 9 ){lcd.print("0");} lcd.print(relat[2]); 442 lcd.setCursor(0,21);lcd.print("Qt.mov :");lcd.print(relat[3]); 443 lcd.setCursor(0,31);lcd.print("T.inert:");lcd.print(relat[4]);lcd.print("h");if (relat[5] <= 9 ){lcd.print("0");}lcd.print(relat[5]); 444 lcd.setCursor(0,41);lcd.print(" As:");lcd.print(relat[6]);lcd.print(":");if (relat[7] <= 9 ){lcd.print("0");}lcd.print(relat[7]); 445 lcd.display(); 446} 447 448void salva_monit(){ 449 lastEEP = lastEEP + 1; 450 if (lastEEP >= 20){ // número máximo atingido 451 for (i=21;i<40;i++) {EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 452 for (i=41;i<60;i++) {EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 453 for (i=61;i<80;i++) {EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 454 for (i=101;i<120;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 455 for (i=121;i<140;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 456 for (i=141;i<160;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 457 for (i=161;i<180;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 458 for (i=181;i<200;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 459 lastEEP = 20; // mantém última posição como 20 460 } 461 462 if (tempo_sono_final <= tempo_sono_inic) tempo_sono_final = tempo_sono_final + 1440; //passou da meia noite, add 1 dia 463 hora_tot = (tempo_sono_final - tempo_sono_inic) / 60; 464 minuto_tot = (tempo_sono_final - tempo_sono_inic) - (hora_tot * 60); 465 if (hora_tot >= 24) hora_tot = 0; 466 tempo_mov_max_h = tempo_sem_mov_max / 60; // Maior quantidade de tempo sem movimento (horas) 467 tempo_mov_max_m = tempo_sem_mov_max - (tempo_mov_max_h * 60); // Maior qt de tempo sem movimento (minutos) 468 //Salva posições atuais 469 EEPROM.write(0,lastEEP); 470 EEPROM.write(lastEEP+20,mov_cont); 471 EEPROM.write(lastEEP+40,hora_tot); 472 EEPROM.write(lastEEP+60,minuto_tot); 473 EEPROM.write(lastEEP+100,tempo_mov_max_h); 474 EEPROM.write(lastEEP+120,tempo_mov_max_m); 475 EEPROM.write(lastEEP+140,hora_maior_mov); 476 EEPROM.write(lastEEP+160,minuto_maior_mov); 477 478} 479 480void checa_desp(){ 481 if (hora == dhora & minuto == dminuto & minuto_ant != minuto) { 482 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 483 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 484 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 485 lights = 1;digitalWrite(led,HIGH); 486 if (desp_tipo > 0){for (i=1;i<=desp_tipo;i++){digitalWrite(buzz, HIGH);delay(40);digitalWrite(buzz, LOW);delay(400);}} 487 } 488 minuto_ant = minuto; 489} 490 491void disp_desp_peq(){ 492 lcd.setTextSize(1); 493 lcd.drawRoundRect(35,25,49,23,1,BLACK); //box 494 lcd.setCursor(37,27);lcd.print("Despert");lcd.setCursor(37,37);sdesp(); 495} 496 497void disp_hora_peq(){ 498 lcd.setTextSize(1); 499 lcd.drawRoundRect(0,25,36,23,1,BLACK); //boxes 500 lcd.setCursor(2,27);lcd.print("Hora");lcd.setCursor(2,37);shora(); 501} 502 503void disp_prev(){ 504 lcd.setTextSize(1); 505 lcd.drawRoundRect(0,25,36,23,1,BLACK); 506 lcd.fillRoundRect(1,36,35,9,1,BLACK); 507 lcd.setCursor(2,27);lcd.print("Prev");lcd.setTextColor(WHITE);lcd.setCursor(2,37); 508 if (pres < 930){ lcd.print("CHUVA");} else {lcd.print(" SOL");} // 930 é um intermediário para SP 509 lcd.setTextColor(BLACK); 510} 511 512void gettime(){ 513 lcd.setTextColor(BLACK); 514 t = rtc.getTime(); 515 hora = t.hour; minuto = t.min; 516} 517 518void sdesp(){ 519 if (desp == 1){ //se alarme está ativo 520 if (dhora <= 9) {lcd.print("0");} lcd.print(dhora);lcd.print(":"); 521 if (dminuto <= 9) {lcd.print("0");} lcd.print(dminuto); 522 lcd.drawBitmap(70,37,af,8,8,BLACK); 523 } 524 if (desp == 0){lcd.print("--:--");} 525} 526 527void shora(){ 528 if (hora <= 9) {lcd.print("0");} lcd.print(hora);lcd.print(":"); 529 if (minuto <= 9) {lcd.print("0");} lcd.print(minuto); 530} 531 532void disp_temp_peq(){ 533 lcd.setTextSize(1); 534 lcd.drawRoundRect(35,25,33,23,1,BLACK);lcd.drawRoundRect(67,25,17,23,1,BLACK); //boxes 535 lcd.setCursor(37,27);lcd.print("Temp");lcd.setCursor(37,37);lcd.print(temp,1);lcd.drawBitmap(58,37,gr,8,4,BLACK); 536 //lcd.setCursor(70,27);lcd.print("D."); 537 if (desp == 1)lcd.drawBitmap(70,37,af,8,8,BLACK); //se alarme está ativo 538} 539 540void ligaluz(int tipo_luz){ 541 if (tipo_luz == 0){ // acende ou apaga somente o led do lcd 542 cc = -cc;; 543 if (cc == -1){lights = 1;digitalWrite(led, HIGH);sluz = 1;} 544 else {lights = 0;digitalWrite(led, LOW);sluz = 0;} 545 cont = 0; 546 } 547 if (tipo_luz == 3){ // acende ou apaga o led do lcd e a luz 548 cc = -cc; 549 if (cc == -1){lights = 1;digitalWrite(luz, HIGH);digitalWrite(led, HIGH);sluz = 3;} 550 else {lights = 0;digitalWrite(luz, LOW);digitalWrite(led, LOW);sluz = 0;} 551 cont = 0; 552 } 553 if (tipo_luz == 1){lights = 1;digitalWrite(led, HIGH);} 554 if (tipo_luz == 2){lights = 0;digitalWrite(led, LOW);} 555 delay(100); 556} 557 558void esmaece(){ 559 if (lights == 1) {cont = cont + 1;} 560 if (cont >= 750 * tempoluz){ //tempo luz começa a esmaecer 561 for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) { 562 analogWrite(led, fadeValue); 563 if (sluz = 0) analogWrite(led, fadeValue); 564 if (sluz = 3) analogWrite(luz, fadeValue); 565 delay(80); 566 } 567 lights = 0; cont = 0; 568 } 569} 570 571void ledados_relat(){ 572 relat[1] = EEPROM.read(40+relat_num); // horas total 573 relat[2] = EEPROM.read(60+relat_num); // minutos total 574 relat[3] = EEPROM.read(20+relat_num); // qt de movimentos 575 relat[4] = EEPROM.read(100+relat_num); // horas tempo inerte 576 relat[5] = EEPROM.read(120+relat_num); // minutos tempo inerte 577 relat[6] = EEPROM.read(140+relat_num); // que horas foi 578 relat[7] = EEPROM.read(160+relat_num); // que minutos foi 579} 580 581void limpa_grafsono(){ 582 for (i=81;i<=100;i++){EEPROM.write(i,0);} 583} 584 585void logo(){ 586 lcd.clearDisplay(); 587 lcd.setCursor(2, 2); lcd.print("Sleep Quality"); 588 lcd.setTextSize(3); lcd.setTextColor(WHITE); 589 for (i=-10;i<=20;i++){ 590 lcd.fillRoundRect(16, 16, 58, 28, 2, BLACK); 591 lcd.drawRect(0, 0, 84, 48, BLACK); 592 lcd.setCursor(i, 20); lcd.print("VSL");lcd.display();delay(20); 593 } 594 delay(300);func = 1; // sai do logo 595 lcd.setTextSize(1); lcd.display(); 596} 597
Code for Sleep Quality Monitor VLS
arduino
The complete code for Code for Sleep Quality Monitor VLS
1// Sleep Quality Monitor VSL - Monitor da qualidade do sono 2// Charles - August/2016 - Version 3 - Jumbo 3#include <Keypad.h> 4#include <Wire.h> 5#include <Adafruit_BMP085.h> // Sensor de pressão atmosférica e temperatura 6Adafruit_BMP085 bmp; //Vcc=3.3V, UNO: SCL=A5, SDA=A4 MEGA: SCL=21, SDA=20 7#include <EEPROM.h> 8#include <DS1307.h> // rtc 9DS1307 rtc(A2, A3); //RTC A2=CLK A3=SDA VCC=5V 10#include <Adafruit_GFX.h> // para LCD Nokia 11#include <Adafruit_PCD8544.h> // para LCD Nokia 12#include <Keypad.h> 13Adafruit_PCD8544 lcd = Adafruit_PCD8544(13, 12, 11, 10, 9); //CLK DIN DC CE RST 14 15const byte ROWS = 4; //four rows 16const byte COLS = 3; //three columns 17char keys[ROWS][COLS] = { 18 {'1', '2', '3'}, 19 {'4', '5', '6'}, 20 {'7', '8', '9'}, 21 {'*', '0', '#'}, 22}; 23 24byte rowPins[ROWS] = {A10, A11, A12, A13}; //connect to the row pinouts of the keypad 25byte colPins[COLS] = {26, 24, 28}; //connect to the column pinouts of the keypad 26char key; 27Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 28 29int i, led=3,bot_luz=7,est_bot_luz,lights,cc=1,cc8,cc2,cc3,cc5,cc4,mov_cont, lastEEP, buzz=14, hora, minuto, bot_monit=8, sbot_monit; 30int tempoluz,vatual,tempo_sem_mov,tempo_mov_ant, tempo_sem_mov_max, hora_tot, minuto_tot,temp_tot; 31int timeout,timeout_val=150, hora_maior_mov, minuto_maior_mov, tempo_mov_atual, tempo_mov_max_h, tempo_mov_max_m; 32int func=1,pres,dhora, dminuto, acerto_hora, acerto_desp, desp=0, minuto_ant, minuto_ant1, mov=A0, smov, c6, pres_max, pres_min; 33int hpres_cont, hpres[13], smonit=0, tempo_sono, tempo_sono_inic, tempo_sono_final, hora_pos, cc7=80, h[20], mov_cont_ant; 34int tempo_sono_parcial, hora_parcial, minuto_parcial, conf=1, desp_tipo, relat[7], relat_num, max_val,mov_cont_atual,luz=4,sluz; 35unsigned int cont, umid, cont2, cont3; 36float temp, temp_ant; 37String sono_tipo="Sleep Ql", sp; 38Time t; 39const unsigned char PROGMEM af[] = {B00001, B00011, B00101, B11001, B11001, B00101, B00011, B00001}; //auto falante 40const unsigned char PROGMEM gr[] = {B00100, B01010, B01010, B00100}; //grau 41 42void setup() { 43 //Serial.begin(9600); 44 //rtc.halt(false); 45 //rtc.setDOW(FRIDAY); //Remover as linhas após a primeira execução 46 //rtc.setTime(06, 30, 00); 47 //rtc.setDate(19, 8, 2016); //Define o dia, mes e ano 48 //rtc.setSQWRate(SQW_RATE_1); 49 rtc.enableSQW(true); 50 bmp.begin(); 51 // Serial.println("Could not find a valid BMP085 sensor, check wiring!"); 52 // while (1) {} 53 // } 54 digitalWrite(buzz, HIGH); delay(40); digitalWrite(buzz, LOW); 55 delay(100); 56 pinMode(led, OUTPUT); 57 pinMode(luz, OUTPUT); 58 pinMode(mov, INPUT); 59 pinMode(bot_luz, INPUT); 60 pinMode(bot_monit, INPUT); 61 pinMode(buzz, OUTPUT); 62 63 lastEEP = EEPROM.read(0); if (lastEEP == 255) lastEEP = 0; //lê a última qt de medição na posição 0 64 tempoluz = EEPROM.read(200); if (tempoluz == 255) tempoluz = 0; //lê o tempo de luz acesa 65 desp = EEPROM.read(201); if (desp == 255) desp = 0; //0=despertador desligado, 1=despertador ativo 66 desp_tipo = EEPROM.read(202); if (desp_tipo == 255) desp_tipo = 0; //0=despertador desligado, 1=despertador ativo 67 dhora = EEPROM.read(203); if (dhora == 255) dhora = 0; //lê a hora do despertador 68 dminuto = EEPROM.read(204); if (dminuto == 255) dminuto = 0; //lê o minuto do despertador 69 relat_num = lastEEP; ledados_relat(); 70 71 lcd.begin(); 72 lcd.setContrast(50); //Ajusta o contraste do display 73 74 logo(); // Chama a tela de logo 75 delay(200); digitalWrite(led,HIGH); delay(300);digitalWrite(led,LOW); 76 77 pres = bmp.readPressure() / 100; 78 temp = bmp.readTemperature(); 79 pres_max = pres; pres_min = pres; 80 desp = 1; //1=ativo, 0=false = mudar para eeprom 81} 82 83void loop() { 84 sbot_monit = digitalRead(bot_monit); 85 if (sbot_monit == HIGH) { 86 func = 20; 87 //disp_monit(); 88 } 89 90 if (acerto_hora <= 0) gettime(); //a hora não está sendo alterada. Atualiza a hora 91 if (desp == 1) checa_desp(); //despertador ativo. Está na hora ? 92 letemp(); 93 if (smonit == 1) monit(); 94 95 key = keypad.getKey(); 96 if (key) { 97 timeout = 0; timeout_val = 200; // houve atividade, zera o timeout 98 if (key == '1') {func = 1;} 99 if (key == '2') {func = 2;} 100 if (key == '3') {func = 3;} 101 if (key == '4') {func = 4;} 102 if (key == '5') {func = 5;} 103 if (key == '6') {func = 6;} 104 if (key == '7') {func = 7;} 105 if (key == '8') {func = 8;} 106 if (key == '9') {func = 9;} 107 if (key == '0') {func = 10;} 108 } 109 if (func == 1) {disp_hora();relat_num = lastEEP;max_val = 0;acerto_desp = 0;} 110 if (func == 2) {disp_desp();acerto_hora = 0;} 111 if (func == 3) {disp_prev1();acerto_desp = 0;acerto_hora = 0;} 112 if (func == 4) {disp_tempo_sono();acerto_desp = 0;acerto_hora = 0;} 113 if (func == 5) {disp_qt_mov();acerto_desp = 0;acerto_hora = 0;} 114 if (func == 6) {disp_temp_inerte();acerto_desp = 0;acerto_hora = 0;} 115 if (func == 7) {relat_sono();acerto_desp = 0;acerto_hora = 0;} 116 if (func == 8) {graf_sono();acerto_desp = 0;acerto_hora = 0;} 117 if (func == 9) {disp_config();acerto_desp = 0;acerto_hora = 0;} 118 if (func == 10) {logo();acerto_desp = 0;acerto_hora = 0;} 119 if (func == 20) {disp_monit();acerto_desp = 0;acerto_hora = 0;} 120 121 timeout = timeout + 1; 122 if (timeout >= timeout_val) { //tempo de inatividade, volta para tela principal 123 if (smonit == 0) func = 1; 124 if (smonit == 1) func = 20; 125 timeout = 0; 126 } 127 128 //Botão liga ou desliga o led, após cerca de 10 minutos começa o fade out do led 129 est_bot_luz = digitalRead(bot_luz); 130 if (est_bot_luz == HIGH) { 131 ligaluz(3); 132 } 133 else { 134 cont3 = 0; // Desativa contador do SQ 135 } 136 if (tempoluz > 0 && lights >= 1) { 137 esmaece(); //Se tempoluz=0 não apaga, caso contrário, começa a esmaecer 138 } 139 140 if (acerto_hora == 0 && key == '*' && func != 7 && func != 9) ligaluz(0); 141 142} 143 144void disp_config(){ 145 timeout_val=2000; //aumenta o timeout nessa tela 146 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 147 lcd.setTextSize(1);lcd.setCursor(3,1); lcd.print("Configuracoes");lcd.setTextColor(BLACK); 148 149 if (key == '*'){conf = conf + 1;cc2=0;cc3=0;} 150 lcd.drawRect(0,10*conf,84,10,BLACK); 151 152 lcd.setCursor(0,11);lcd.print("Tempo luz:");if (tempoluz == 0) {lcd.print("--");} else {lcd.print(tempoluz);} 153 lcd.setCursor(0,21);lcd.print("Qtd.beeps:");lcd.print(desp_tipo); 154 if (cc2 == 0){lcd.setCursor(0,31);lcd.print("DEL ult monit");} 155 if (cc2 == 1){lcd.setCursor(0,31);lcd.print(" # Confirma ");} 156 if (cc2 == 2){ 157 for (i=20;i<=179;i=i+20){EEPROM.write(i+lastEEP,0);} 158 lastEEP = lastEEP -1; EEPROM.write(0,lastEEP); 159 lcd.setCursor(0,31); lcd.print("Monit. APAGADA");lcd.display();delay(1500);cc2 = 0;} 160 if (cc3 == 0){lcd.setCursor(0,41);lcd.print("Apagar memoria");} 161 if (cc3 == 1){lcd.setCursor(0,41);lcd.print(" # Confirma ");} 162 if (cc3 == 2){ 163 lastEEP = 0; for (i=0;i<=255;i++){EEPROM.write(i,0);} 164 lcd.setCursor(0,41); lcd.print("Memor APAGADA");lcd.display();delay(1500);cc3 = 0;} 165 166 if (conf == 1 && key == '#'){tempoluz = tempoluz + 5; if (tempoluz >= 32) {tempoluz=0;} EEPROM.write(200,tempoluz);} 167 if (conf == 2 && key == '#'){desp_tipo = desp_tipo + 1; if (desp_tipo > 10) {desp_tipo = 0;} EEPROM.write(202,desp_tipo);} 168 if (conf == 3 && key == '#'){cc2 = cc2 + 1;} 169 if (conf == 4 && key == '#'){cc3 = cc3 + 1;} 170 if (conf >= 5) conf = 1; 171 172 lcd.display(); 173} 174 175void disp_desp(){ 176 lcd.clearDisplay();lcd.setTextColor(BLACK); 177 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 178 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 179 if (dhora <= 9) {lcd.print("0");lcd.print(dhora);} 180 if (dhora > 9) {lcd.print(dhora);} 181 lcd.setCursor(33,2);lcd.print(":"); 182 lcd.setCursor(44,2); // posição do minuto 183 if (dminuto <= 9) {lcd.print("0");lcd.print(dminuto);} 184 if (dminuto > 9) {lcd.print(dminuto);} 185 lcd.setTextSize(1); 186 187 //acerto da hora do despertador 188 if (key == '#') acerto_desp = acerto_desp + 1; 189 if (acerto_desp == 1) { 190 lcd.setCursor(0,30);lcd.print("* Muda HORA"); 191 lcd.setCursor(0,40);lcd.print("# Confirma"); 192 } 193 if (acerto_desp == 2) { 194 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 195 lcd.setCursor(0,40);lcd.print("# Confirma"); 196 } 197 if (acerto_desp == 3 & desp == 1) { 198 lcd.setCursor(0,30);lcd.print("* ALARME Ligad"); 199 lcd.setCursor(0,40);lcd.print("# Confirma"); 200 } 201 if (acerto_desp == 3 & desp == 0) { 202 lcd.setCursor(0,30);lcd.print("* ALARME Deslg"); 203 lcd.setCursor(0,40);lcd.print("# Confirma"); 204 } 205if (acerto_desp == 4) { 206 lcd.setCursor(0,30); 207 if (desp == 1) {lcd.print("Despert.LIGADO");} 208 if (desp == 0) {lcd.print("Despert. DELIG");} 209 EEPROM.write(203,dhora);EEPROM.write(204,dminuto);EEPROM.write(201,desp); //salva hora, minuto e situação do alarme 210 lcd.display(); delay(2000); acerto_desp = 0; 211 } 212 if (acerto_desp == 1 & key == '*'){dhora = dhora + 1;if (dhora >= 24){dhora = 0;}} 213 if (acerto_desp == 2 & key == '*'){dminuto = dminuto + 1;if (dminuto >= 60){dminuto = 0;}} 214 if (acerto_desp == 3 & key == '*'){if (desp == 0){desp = 1;} else {desp = 0;}} 215 216 if (acerto_desp == 0){disp_hora_peq(); disp_desp_peq();} //hora não está sendo alterada. Mostra demais informações 217 lcd.display(); 218} 219 220void disp_hora(){ 221 lcd.clearDisplay();lcd.setTextColor(BLACK); 222 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 223 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 224 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 225 if (hora > 9) {lcd.print(hora);} 226 lcd.setCursor(33,2); 227 cc5 = cc5 + 1; 228 if (cc5 < 10) lcd.print(" "); 229 if (cc5 > 10 && cc5 < 20){lcd.print(":");} 230 if (cc5 > 20) cc5 = 0; 231 lcd.setCursor(44,2); // posição do minuto 232 if (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 233 if (minuto > 9) {lcd.print(minuto);} 234 lcd.setTextSize(1); 235 236 //acerto da hora 237 if (key == '#') acerto_hora = acerto_hora + 1; 238 if (acerto_hora == 1) { 239 lcd.setCursor(0,30);lcd.print("* Muda HORA"); 240 lcd.setCursor(0,40);lcd.print("# Confirma"); 241 } 242 if (acerto_hora == 2) { 243 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 244 lcd.setCursor(0,40);lcd.print("# Confirma"); 245 } 246 if (acerto_hora == 3) { 247 lcd.setCursor(0,30);lcd.print("Hora alterada"); 248 rtc.setTime(hora, minuto, 00); 249 lcd.display(); delay(1500); acerto_hora = 0; 250 } 251 if (acerto_hora == 1 & key == '*'){hora = hora + 1;if (hora >= 24){hora = 0;}} 252 if (acerto_hora == 2 & key == '*'){minuto = minuto + 1;if (minuto >= 60){minuto = 0;}} 253 254 if (acerto_hora == 0){disp_prev(); disp_temp_peq();} //hora não está sendo alterada. Mostra demais informações 255 lcd.display(); 256} 257 258void disp_monit(){ 259 lcd.clearDisplay();lcd.setTextColor(BLACK); 260 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 261 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 262 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 263 if (hora > 9) {lcd.print(hora);} 264 lcd.setCursor(33,2); 265 cc5 = cc5 + 1; 266 if (cc5 < 20) lcd.print(" "); 267 if (cc5 > 20 && cc5 < 40){lcd.print(":");} 268 if (cc5 > 40) cc5 = 0; 269 lcd.setCursor(44,2); // posição do minuto 270 if (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 271 if (minuto > 9) {lcd.print(minuto);} 272 273 lcd.setTextSize(1); 274 if (sbot_monit == HIGH && smonit == 0 ){ // Monitoração iniciada ********* 275 cc7 = 80;ligaluz(1);gettime();smonit = 1;sbot_monit = LOW;mov_cont = 0; 276 tempo_sono_inic = hora * 60 + minuto;hora_pos = hora + 1;if (hora_pos == 24) hora_pos = 0;limpa_grafsono(); 277 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 278 lcd.setCursor(0,38);lcd.print(" Iniciada");lcd.display(); delay(1500);} 279 else if (sbot_monit == HIGH && smonit == 1 ){ // Monitaração terminada ********** 280 ligaluz(1);smonit = 0; tempo_sono_final = hora * 60 + minuto;salva_monit();relat_num = lastEEP;func = 7; 281 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 282 lcd.setCursor(0,38);lcd.print(" Concluida"); lcd.display();delay(1500);} 283 284 tempo_sono_parcial = hora * 60 + minuto; 285 if (tempo_sono_parcial < tempo_sono_inic) tempo_sono_parcial = tempo_sono_parcial + 1440; //passou da meia noite, add 1 dia 286 hora_parcial = (tempo_sono_parcial - tempo_sono_inic) / 60; 287 minuto_parcial = (tempo_sono_parcial - tempo_sono_inic) - (hora_parcial * 60); 288 289 lcd.fillRoundRect(0,25,36,23,1,BLACK); 290 lcd.setCursor(1,30);lcd.setTextColor(WHITE);lcd.setTextSize(2); 291 if (mov_cont <=9) {lcd.print(" ");} 292 lcd.print(mov_cont);lcd.setTextSize(1);lcd.setTextColor(BLACK); 293 lcd.drawRoundRect(35,25,49,23,1,BLACK); //box 294 lcd.setCursor(37,27);lcd.print("T.Sono");lcd.setCursor(37,37); 295 cc8 = cc8 + 1; if (cc8 <= 5){lcd.fillRoundRect(0,25,36,23,1,BLACK);} if (cc8 > 15 ) cc8 = 0; //pisca qt de movimentos 296 lcd.print(hora_parcial);lcd.print("h");if (minuto_parcial <=9 ){lcd.print("0");}lcd.print(minuto_parcial); 297 if (desp == 1) lcd.drawBitmap(70,37,af,8,8,BLACK); 298 lcd.display(); 299} 300 301void disp_prev1(){ 302 letemp(); 303 lcd.clearDisplay();lcd.setTextColor(BLACK); 304 lcd.drawRoundRect(0,0,64,26,1,BLACK); //moldura da hora 305 for (i=1;i<=84;i=i+2){lcd.drawPixel(i,13,BLACK);} 306 lcd.drawRoundRect(0,25,28,23,1,BLACK); 307 lcd.drawRoundRect(27,25,28,23,1,BLACK); 308 lcd.drawRoundRect(54,25,30,23,1,BLACK); 309 lcd.setTextSize(1); 310 lcd.setCursor(66,4);lcd.print("Sol"); 311 lcd.setCursor(66,15);lcd.print("Chu"); 312 lcd.setCursor(4,28);lcd.print("Max");lcd.setCursor(4,38);lcd.print(pres_max); 313 lcd.setCursor(32,28);lcd.print("Min");lcd.setCursor(32,38);lcd.print(pres_min); 314 lcd.setCursor(60,28);lcd.print("Atu"); lcd.setCursor(60,38);lcd.print(pres); 315 316 for (i=1;i<=hpres_cont;i++){lcd.fillRect(i*5-2,25,3,map(hpres[i],924,940,0,-25),BLACK);} //pressão varia de 890 a 940 em sp 317 lcd.display(); 318} 319 320void disp_qt_mov(){ 321 timeout_val = 2000; // Aumenta o timeout nesta tela 322 max_val = 0; 323 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 324 lcd.setCursor(1,1);lcd.print("Movimentos");lcd.setTextColor(BLACK); 325 int boxinit = -2; 326 for (i=1;i<=20;i++){ // captura o maior valor para referência no gráfico 327 vatual = EEPROM.read(i+20); if (vatual == 255) {vatual = 0;} 328 if (vatual > max_val) {max_val = vatual;} } 329 for (i=1;i<=20;i++){ 330 boxinit = boxinit + 4; 331 int boxsize = map(EEPROM.read(i+20),0,max_val,0,34); // 21 é a posição da memória dos movimentos 332 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 333 } 334 lcd.display(); 335} 336 337void disp_temp_inerte(){ 338 timeout_val = 2000; // Aumenta o timeout nesta tela 339 max_val = 0; 340 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 341 lcd.setCursor(1,1);lcd.print("Tempo Inerte");lcd.setTextColor(BLACK); 342 int boxinit = -2; 343 for (i=101;i<=120;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 344 for (i=1;i<=20;i++){ 345 boxinit = boxinit + 4; 346 int t = EEPROM.read(i+100)* 60 + EEPROM.read(i+120); // 101 é a posição da memória do tempo inerte 347 int boxsize = map(t,0,max_val,0,34); // 480 é o máximo de 8 horas sem movimentos durante o sono 348 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 349 } 350 lcd.display(); 351} 352 353void disp_tempo_sono(){ 354 timeout_val = 2000; // Aumenta o timeout nesta tela 355 max_val = 0; 356 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 357 lcd.setCursor(1,1);lcd.print("Tempo Sono");lcd.setTextColor(BLACK); 358 int boxinit = -2; 359 for (i=41;i<=60;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 360 for (i=1;i<=20;i++){ 361 boxinit = boxinit + 4; 362 int t = EEPROM.read(i+40)* 60 + EEPROM.read(i+60); // 41 é a posição da memória do tempo de sono 363 int boxsize = map(t,0,max_val,0,34); // 960 é o máximo de 16 horas de sono 364 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 365 } 366 lcd.display(); 367} 368 369void graf_sono(){ 370 timeout_val = 2000; // Aumenta o timeout nesta tela 371 max_val = 0; 372 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 373 lcd.setCursor(1,1);lcd.print("Grafico Sono");lcd.setTextColor(BLACK); 374 int boxinit = -2; 375 for (i=81;i<=100;i++){if (EEPROM.read(i) > max_val) max_val = EEPROM.read(i); } //checa maior valor 376 for (i=81;i<=100;i++){ 377 boxinit = boxinit + 4; 378 int boxsize = map(EEPROM.read(i),0,max_val,0,34); 379 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 380 } 381 lcd.display(); 382} 383 384void letemp(){ 385 cc4 = cc4 + 1; 386 temp_tot = temp_tot + bmp.readTemperature(); 387 if (cc4 >= 10) {cc4 = 0;temp = temp_tot / 10;temp_tot = 0;} // média da temperatura das última 10 medições 388 pres = bmp.readPressure()/100; 389 if (pres > pres_max) pres_max = pres; 390 if (pres < pres_min) pres_min = pres; 391 if ((minuto==0||minuto==10||minuto==20||minuto==30||minuto==40||minuto==50) && minuto != minuto_ant1) { 392 hpres_cont = hpres_cont + 1; 393 if (hpres_cont >= 12){for (i=1;i<=11;i++){hpres[i]=hpres[i+1];} hpres[12]=pres; hpres_cont = 11;} 394 hpres[hpres_cont] = pres; 395 minuto_ant1 = minuto; 396 } 397} 398 399void monit(){ 400 smov = digitalRead(mov); 401 if (smov == HIGH) { 402 c6 = c6 + 1; 403 if (c6 >= 30) { // Opa! mexeu. 30 é o ajuste de movimentos 404 mov_cont = mov_cont + 1; // soma 1 movimento 405 c6 = 0; 406 if (tempo_mov_ant > 0){ // a primeira vez não calcula 407 tempo_mov_atual = hora * 60 + minuto; // captura tempo atual 408 if (tempo_mov_atual < tempo_mov_ant) tempo_mov_atual = tempo_mov_atual + 1440; //passou da meia noite 409 tempo_sem_mov = tempo_mov_atual - tempo_mov_ant; 410 if (tempo_sem_mov > tempo_sem_mov_max) { 411 tempo_sem_mov_max = tempo_sem_mov; // 412 hora_maior_mov = hora; 413 minuto_maior_mov = minuto; 414 } 415 } 416 tempo_mov_ant = (hora * 60) + minuto; 417 } 418 } 419 420 //captura quantidade de movimentos realizados em cada hora 421 if (hora == hora_pos) { 422 cc7 = cc7 + (1 && cc7 <= 100); 423 mov_cont_atual = mov_cont - mov_cont_ant; 424 EEPROM.write(cc7,mov_cont_atual); 425 mov_cont_ant = mov_cont; 426 hora_pos = hora_pos + 1; if (hora_pos == 24) hora_pos = 0; 427 } 428} 429 430void relat_sono(){ 431 timeout_val=2000; //aumenta o timeout nessa tela 432 if (key == '7'){relat_num = lastEEP;} 433 if (key == '*'){relat_num = relat_num - 1;if (relat_num <= 0){relat_num = lastEEP;}} 434 if (key == '#'){relat_num = relat_num + 1;if (relat_num > lastEEP){relat_num = 1;}} 435 436 ledados_relat(); 437 438 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 439 lcd.setTextSize(1);lcd.setCursor(1,1); lcd.print("Rel:SONO");lcd.setCursor(72,1);lcd.print(relat_num - lastEEP); 440 lcd.setTextColor(BLACK); 441 lcd.setCursor(0,11);lcd.print("T.sono :");lcd.print(relat[1]); lcd.print("h"); if (relat[2] <= 9 ){lcd.print("0");} lcd.print(relat[2]); 442 lcd.setCursor(0,21);lcd.print("Qt.mov :");lcd.print(relat[3]); 443 lcd.setCursor(0,31);lcd.print("T.inert:");lcd.print(relat[4]);lcd.print("h");if (relat[5] <= 9 ){lcd.print("0");}lcd.print(relat[5]); 444 lcd.setCursor(0,41);lcd.print(" As:");lcd.print(relat[6]);lcd.print(":");if (relat[7] <= 9 ){lcd.print("0");}lcd.print(relat[7]); 445 lcd.display(); 446} 447 448void salva_monit(){ 449 lastEEP = lastEEP + 1; 450 if (lastEEP >= 20){ // número máximo atingido 451 for (i=21;i<40;i++) {EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 452 for (i=41;i<60;i++) {EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 453 for (i=61;i<80;i++) {EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 454 for (i=101;i<120;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 455 for (i=121;i<140;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 456 for (i=141;i<160;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 457 for (i=161;i<180;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 458 for (i=181;i<200;i++){EEPROM.write(i,EEPROM.read(i+1));} //move cada atividade para posição anterior 459 lastEEP = 20; // mantém última posição como 20 460 } 461 462 if (tempo_sono_final <= tempo_sono_inic) tempo_sono_final = tempo_sono_final + 1440; //passou da meia noite, add 1 dia 463 hora_tot = (tempo_sono_final - tempo_sono_inic) / 60; 464 minuto_tot = (tempo_sono_final - tempo_sono_inic) - (hora_tot * 60); 465 if (hora_tot >= 24) hora_tot = 0; 466 tempo_mov_max_h = tempo_sem_mov_max / 60; // Maior quantidade de tempo sem movimento (horas) 467 tempo_mov_max_m = tempo_sem_mov_max - (tempo_mov_max_h * 60); // Maior qt de tempo sem movimento (minutos) 468 //Salva posições atuais 469 EEPROM.write(0,lastEEP); 470 EEPROM.write(lastEEP+20,mov_cont); 471 EEPROM.write(lastEEP+40,hora_tot); 472 EEPROM.write(lastEEP+60,minuto_tot); 473 EEPROM.write(lastEEP+100,tempo_mov_max_h); 474 EEPROM.write(lastEEP+120,tempo_mov_max_m); 475 EEPROM.write(lastEEP+140,hora_maior_mov); 476 EEPROM.write(lastEEP+160,minuto_maior_mov); 477 478} 479 480void checa_desp(){ 481 if (hora == dhora & minuto == dminuto & minuto_ant != minuto) { 482 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 483 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 484 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 485 lights = 1;digitalWrite(led,HIGH); 486 if (desp_tipo > 0){for (i=1;i<=desp_tipo;i++){digitalWrite(buzz, HIGH);delay(40);digitalWrite(buzz, LOW);delay(400);}} 487 } 488 minuto_ant = minuto; 489} 490 491void disp_desp_peq(){ 492 lcd.setTextSize(1); 493 lcd.drawRoundRect(35,25,49,23,1,BLACK); //box 494 lcd.setCursor(37,27);lcd.print("Despert");lcd.setCursor(37,37);sdesp(); 495} 496 497void disp_hora_peq(){ 498 lcd.setTextSize(1); 499 lcd.drawRoundRect(0,25,36,23,1,BLACK); //boxes 500 lcd.setCursor(2,27);lcd.print("Hora");lcd.setCursor(2,37);shora(); 501} 502 503void disp_prev(){ 504 lcd.setTextSize(1); 505 lcd.drawRoundRect(0,25,36,23,1,BLACK); 506 lcd.fillRoundRect(1,36,35,9,1,BLACK); 507 lcd.setCursor(2,27);lcd.print("Prev");lcd.setTextColor(WHITE);lcd.setCursor(2,37); 508 if (pres < 930){ lcd.print("CHUVA");} else {lcd.print(" SOL");} // 930 é um intermediário para SP 509 lcd.setTextColor(BLACK); 510} 511 512void gettime(){ 513 lcd.setTextColor(BLACK); 514 t = rtc.getTime(); 515 hora = t.hour; minuto = t.min; 516} 517 518void sdesp(){ 519 if (desp == 1){ //se alarme está ativo 520 if (dhora <= 9) {lcd.print("0");} lcd.print(dhora);lcd.print(":"); 521 if (dminuto <= 9) {lcd.print("0");} lcd.print(dminuto); 522 lcd.drawBitmap(70,37,af,8,8,BLACK); 523 } 524 if (desp == 0){lcd.print("--:--");} 525} 526 527void shora(){ 528 if (hora <= 9) {lcd.print("0");} lcd.print(hora);lcd.print(":"); 529 if (minuto <= 9) {lcd.print("0");} lcd.print(minuto); 530} 531 532void disp_temp_peq(){ 533 lcd.setTextSize(1); 534 lcd.drawRoundRect(35,25,33,23,1,BLACK);lcd.drawRoundRect(67,25,17,23,1,BLACK); //boxes 535 lcd.setCursor(37,27);lcd.print("Temp");lcd.setCursor(37,37);lcd.print(temp,1);lcd.drawBitmap(58,37,gr,8,4,BLACK); 536 //lcd.setCursor(70,27);lcd.print("D."); 537 if (desp == 1)lcd.drawBitmap(70,37,af,8,8,BLACK); //se alarme está ativo 538} 539 540void ligaluz(int tipo_luz){ 541 if (tipo_luz == 0){ // acende ou apaga somente o led do lcd 542 cc = -cc;; 543 if (cc == -1){lights = 1;digitalWrite(led, HIGH);sluz = 1;} 544 else {lights = 0;digitalWrite(led, LOW);sluz = 0;} 545 cont = 0; 546 } 547 if (tipo_luz == 3){ // acende ou apaga o led do lcd e a luz 548 cc = -cc; 549 if (cc == -1){lights = 1;digitalWrite(luz, HIGH);digitalWrite(led, HIGH);sluz = 3;} 550 else {lights = 0;digitalWrite(luz, LOW);digitalWrite(led, LOW);sluz = 0;} 551 cont = 0; 552 } 553 if (tipo_luz == 1){lights = 1;digitalWrite(led, HIGH);} 554 if (tipo_luz == 2){lights = 0;digitalWrite(led, LOW);} 555 delay(100); 556} 557 558void esmaece(){ 559 if (lights == 1) {cont = cont + 1;} 560 if (cont >= 750 * tempoluz){ //tempo luz começa a esmaecer 561 for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) { 562 analogWrite(led, fadeValue); 563 if (sluz = 0) analogWrite(led, fadeValue); 564 if (sluz = 3) analogWrite(luz, fadeValue); 565 delay(80); 566 } 567 lights = 0; cont = 0; 568 } 569} 570 571void ledados_relat(){ 572 relat[1] = EEPROM.read(40+relat_num); // horas total 573 relat[2] = EEPROM.read(60+relat_num); // minutos total 574 relat[3] = EEPROM.read(20+relat_num); // qt de movimentos 575 relat[4] = EEPROM.read(100+relat_num); // horas tempo inerte 576 relat[5] = EEPROM.read(120+relat_num); // minutos tempo inerte 577 relat[6] = EEPROM.read(140+relat_num); // que horas foi 578 relat[7] = EEPROM.read(160+relat_num); // que minutos foi 579} 580 581void limpa_grafsono(){ 582 for (i=81;i<=100;i++){EEPROM.write(i,0);} 583} 584 585void logo(){ 586 lcd.clearDisplay(); 587 lcd.setCursor(2, 2); lcd.print("Sleep Quality"); 588 lcd.setTextSize(3); lcd.setTextColor(WHITE); 589 for (i=-10;i<=20;i++){ 590 lcd.fillRoundRect(16, 16, 58, 28, 2, BLACK); 591 lcd.drawRect(0, 0, 84, 48, BLACK); 592 lcd.setCursor(i, 20); lcd.print("VSL");lcd.display();delay(20); 593 } 594 delay(300);func = 1; // sai do logo 595 lcd.setTextSize(1); lcd.display(); 596} 597
Code for Sleep Quality Monitor VLS
arduino
Complete code for Sleep Quality Monitor VLS
1// Sleep Quality Monitor VSL - Monitor da qualidade do sono 2// Charles 3 - August/2016 - Version 3 - Jumbo 4#include <Keypad.h> 5#include <Wire.h> 6#include 7 <Adafruit_BMP085.h> // Sensor de pressão atmosférica e temperatura 8Adafruit_BMP085 9 bmp; //Vcc=3.3V, UNO: SCL=A5, SDA=A4 MEGA: SCL=21, SDA=20 10#include <EEPROM.h> 11#include 12 <DS1307.h> // rtc 13DS1307 rtc(A2, A3); //RTC A2=CLK A3=SDA VCC=5V 14#include 15 <Adafruit_GFX.h> // para LCD Nokia 16#include <Adafruit_PCD8544.h> // 17 para LCD Nokia 18#include <Keypad.h> 19Adafruit_PCD8544 lcd = Adafruit_PCD8544(13, 20 12, 11, 10, 9); //CLK DIN DC CE RST 21 22const byte ROWS = 4; //four rows 23const 24 byte COLS = 3; //three columns 25char keys[ROWS][COLS] = { 26 {'1', '2', '3'}, 27 28 {'4', '5', '6'}, 29 {'7', '8', '9'}, 30 {'*', '0', '#'}, 31}; 32 33byte 34 rowPins[ROWS] = {A10, A11, A12, A13}; //connect to the row pinouts of the keypad 35byte 36 colPins[COLS] = {26, 24, 28}; //connect to the column pinouts of the keypad 37char 38 key; 39Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 40 41int 42 i, led=3,bot_luz=7,est_bot_luz,lights,cc=1,cc8,cc2,cc3,cc5,cc4,mov_cont, lastEEP, 43 buzz=14, hora, minuto, bot_monit=8, sbot_monit; 44int tempoluz,vatual,tempo_sem_mov,tempo_mov_ant, 45 tempo_sem_mov_max, hora_tot, minuto_tot,temp_tot; 46int timeout,timeout_val=150, 47 hora_maior_mov, minuto_maior_mov, tempo_mov_atual, tempo_mov_max_h, tempo_mov_max_m; 48int 49 func=1,pres,dhora, dminuto, acerto_hora, acerto_desp, desp=0, minuto_ant, minuto_ant1, 50 mov=A0, smov, c6, pres_max, pres_min; 51int hpres_cont, hpres[13], smonit=0, tempo_sono, 52 tempo_sono_inic, tempo_sono_final, hora_pos, cc7=80, h[20], mov_cont_ant; 53int 54 tempo_sono_parcial, hora_parcial, minuto_parcial, conf=1, desp_tipo, relat[7], relat_num, 55 max_val,mov_cont_atual,luz=4,sluz; 56unsigned int cont, umid, cont2, cont3; 57float 58 temp, temp_ant; 59String sono_tipo="Sleep Ql", sp; 60Time t; 61const unsigned 62 char PROGMEM af[] = {B00001, B00011, B00101, B11001, B11001, B00101, B00011, B00001}; 63 //auto falante 64const unsigned char PROGMEM gr[] = {B00100, B01010, B01010, B00100}; 65 //grau 66 67void setup() { 68 //Serial.begin(9600); 69 //rtc.halt(false); 70 71 //rtc.setDOW(FRIDAY); //Remover as linhas após a primeira execução 72 //rtc.setTime(06, 73 30, 00); 74 //rtc.setDate(19, 8, 2016); //Define o dia, mes e ano 75 //rtc.setSQWRate(SQW_RATE_1); 76 77 rtc.enableSQW(true); 78 bmp.begin(); 79 // Serial.println("Could not find 80 a valid BMP085 sensor, check wiring!"); 81 // while (1) {} 82 // } 83 digitalWrite(buzz, 84 HIGH); delay(40); digitalWrite(buzz, LOW); 85 delay(100); 86 pinMode(led, OUTPUT); 87 88 pinMode(luz, OUTPUT); 89 pinMode(mov, INPUT); 90 pinMode(bot_luz, INPUT); 91 92 pinMode(bot_monit, INPUT); 93 pinMode(buzz, OUTPUT); 94 95 lastEEP = EEPROM.read(0); 96 if (lastEEP == 255) lastEEP = 0; //lê a última qt de medição na posição 0 97 98 tempoluz = EEPROM.read(200); if (tempoluz == 255) tempoluz = 0; //lê o tempo de 99 luz acesa 100 desp = EEPROM.read(201); if (desp == 255) desp = 0; //0=despertador 101 desligado, 1=despertador ativo 102 desp_tipo = EEPROM.read(202); if (desp_tipo 103 == 255) desp_tipo = 0; //0=despertador desligado, 1=despertador ativo 104 dhora 105 = EEPROM.read(203); if (dhora == 255) dhora = 0; //lê a hora do despertador 106 107 dminuto = EEPROM.read(204); if (dminuto == 255) dminuto = 0; //lê o minuto 108 do despertador 109 relat_num = lastEEP; ledados_relat(); 110 111 lcd.begin(); 112 113 lcd.setContrast(50); //Ajusta o contraste do display 114 115 logo(); // Chama 116 a tela de logo 117 delay(200); digitalWrite(led,HIGH); delay(300);digitalWrite(led,LOW); 118 119 120 pres = bmp.readPressure() / 100; 121 temp = bmp.readTemperature(); 122 123 pres_max = pres; pres_min = pres; 124 desp = 1; //1=ativo, 0=false = mudar 125 para eeprom 126} 127 128void loop() { 129 sbot_monit = digitalRead(bot_monit); 130 131 if (sbot_monit == HIGH) { 132 func = 20; 133 //disp_monit(); 134 } 135 136 137 if (acerto_hora <= 0) gettime(); //a hora não está sendo alterada. Atualiza 138 a hora 139 if (desp == 1) checa_desp(); //despertador ativo. Está na hora 140 ? 141 letemp(); 142 if (smonit == 1) monit(); 143 144 key = keypad.getKey(); 145 146 if (key) { 147 timeout = 0; timeout_val = 200; // houve atividade, zera 148 o timeout 149 if (key == '1') {func = 1;} 150 if (key == '2') {func = 2;} 151 152 if (key == '3') {func = 3;} 153 if (key == '4') {func = 4;} 154 if (key 155 == '5') {func = 5;} 156 if (key == '6') {func = 6;} 157 if (key == '7') {func 158 = 7;} 159 if (key == '8') {func = 8;} 160 if (key == '9') {func = 9;} 161 162 if (key == '0') {func = 10;} 163 } 164 if (func == 1) {disp_hora();relat_num 165 = lastEEP;max_val = 0;acerto_desp = 0;} 166 if (func == 2) {disp_desp();acerto_hora 167 = 0;} 168 if (func == 3) {disp_prev1();acerto_desp = 0;acerto_hora = 0;} 169 if 170 (func == 4) {disp_tempo_sono();acerto_desp = 0;acerto_hora = 0;} 171 if (func == 172 5) {disp_qt_mov();acerto_desp = 0;acerto_hora = 0;} 173 if (func == 6) {disp_temp_inerte();acerto_desp 174 = 0;acerto_hora = 0;} 175 if (func == 7) {relat_sono();acerto_desp = 0;acerto_hora 176 = 0;} 177 if (func == 8) {graf_sono();acerto_desp = 0;acerto_hora = 0;} 178 if 179 (func == 9) {disp_config();acerto_desp = 0;acerto_hora = 0;} 180 if (func == 10) 181 {logo();acerto_desp = 0;acerto_hora = 0;} 182 if (func == 20) {disp_monit();acerto_desp 183 = 0;acerto_hora = 0;} 184 185 timeout = timeout + 1; 186 if (timeout >= timeout_val) 187 { //tempo de inatividade, volta para tela principal 188 if (smonit == 0) 189 func = 1; 190 if (smonit == 1) func = 20; 191 timeout = 0; 192 } 193 194 195 //Botão liga ou desliga o led, após cerca de 10 minutos começa o fade out do led 196 197 est_bot_luz = digitalRead(bot_luz); 198 if (est_bot_luz == HIGH) { 199 ligaluz(3); 200 201 } 202 else { 203 cont3 = 0; // Desativa contador do SQ 204 } 205 if (tempoluz 206 > 0 && lights >= 1) { 207 esmaece(); //Se tempoluz=0 não apaga, caso contrário, 208 começa a esmaecer 209 } 210 211 if (acerto_hora == 0 && key == '*' && func != 212 7 && func != 9) ligaluz(0); 213 214} 215 216void disp_config(){ 217 timeout_val=2000; 218 //aumenta o timeout nessa tela 219 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 220 221 lcd.setTextSize(1);lcd.setCursor(3,1); lcd.print("Configuracoes");lcd.setTextColor(BLACK); 222 223 224 if (key == '*'){conf = conf + 1;cc2=0;cc3=0;} 225 lcd.drawRect(0,10*conf,84,10,BLACK); 226 227 228 lcd.setCursor(0,11);lcd.print("Tempo luz:");if (tempoluz == 0) {lcd.print("--");} 229 else {lcd.print(tempoluz);} 230 lcd.setCursor(0,21);lcd.print("Qtd.beeps:");lcd.print(desp_tipo); 231 232 if (cc2 == 0){lcd.setCursor(0,31);lcd.print("DEL ult monit");} 233 if (cc2 234 == 1){lcd.setCursor(0,31);lcd.print(" # Confirma ");} 235 if (cc2 == 2){ 236 237 for (i=20;i<=179;i=i+20){EEPROM.write(i+lastEEP,0);} 238 lastEEP = lastEEP 239 -1; EEPROM.write(0,lastEEP); 240 lcd.setCursor(0,31); lcd.print("Monit. APAGADA");lcd.display();delay(1500);cc2 241 = 0;} 242 if (cc3 == 0){lcd.setCursor(0,41);lcd.print("Apagar memoria");} 243 244 if (cc3 == 1){lcd.setCursor(0,41);lcd.print(" # Confirma ");} 245 if (cc3 246 == 2){ 247 lastEEP = 0; for (i=0;i<=255;i++){EEPROM.write(i,0);} 248 lcd.setCursor(0,41); 249 lcd.print("Memor APAGADA");lcd.display();delay(1500);cc3 = 0;} 250 251 if (conf 252 == 1 && key == '#'){tempoluz = tempoluz + 5; if (tempoluz >= 32) {tempoluz=0;} EEPROM.write(200,tempoluz);} 253 254 if (conf == 2 && key == '#'){desp_tipo = desp_tipo + 1; if (desp_tipo > 10) {desp_tipo 255 = 0;} EEPROM.write(202,desp_tipo);} 256 if (conf == 3 && key == '#'){cc2 = cc2 257 + 1;} 258 if (conf == 4 && key == '#'){cc3 = cc3 + 1;} 259 if (conf >= 5) conf 260 = 1; 261 262 lcd.display(); 263} 264 265void disp_desp(){ 266 lcd.clearDisplay();lcd.setTextColor(BLACK); 267 268 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 269 lcd.setTextSize(3);lcd.setCursor(4,2); 270 // posição da hora 271 if (dhora <= 9) {lcd.print("0");lcd.print(dhora);} 272 273 if (dhora > 9) {lcd.print(dhora);} 274 lcd.setCursor(33,2);lcd.print(":"); 275 276 lcd.setCursor(44,2); // posição do minuto 277 if (dminuto <= 9) {lcd.print("0");lcd.print(dminuto);} 278 279 if (dminuto > 9) {lcd.print(dminuto);} 280 lcd.setTextSize(1); 281 282 //acerto 283 da hora do despertador 284 if (key == '#') acerto_desp = acerto_desp + 1; 285 if 286 (acerto_desp == 1) { 287 lcd.setCursor(0,30);lcd.print("* Muda HORA"); 288 289 lcd.setCursor(0,40);lcd.print("# Confirma"); 290 } 291 if (acerto_desp == 292 2) { 293 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 294 lcd.setCursor(0,40);lcd.print("# 295 Confirma"); 296 } 297 if (acerto_desp == 3 & desp == 1) { 298 lcd.setCursor(0,30);lcd.print("* 299 ALARME Ligad"); 300 lcd.setCursor(0,40);lcd.print("# Confirma"); 301 } 302 303 if (acerto_desp == 3 & desp == 0) { 304 lcd.setCursor(0,30);lcd.print("* ALARME 305 Deslg"); 306 lcd.setCursor(0,40);lcd.print("# Confirma"); 307 } 308if (acerto_desp 309 == 4) { 310 lcd.setCursor(0,30); 311 if (desp == 1) {lcd.print("Despert.LIGADO");} 312 313 if (desp == 0) {lcd.print("Despert. DELIG");} 314 EEPROM.write(203,dhora);EEPROM.write(204,dminuto);EEPROM.write(201,desp); 315 //salva hora, minuto e situação do alarme 316 lcd.display(); delay(2000); acerto_desp 317 = 0; 318 } 319 if (acerto_desp == 1 & key == '*'){dhora = dhora + 1;if (dhora 320 >= 24){dhora = 0;}} 321 if (acerto_desp == 2 & key == '*'){dminuto = dminuto + 322 1;if (dminuto >= 60){dminuto = 0;}} 323 if (acerto_desp == 3 & key == '*'){if (desp 324 == 0){desp = 1;} else {desp = 0;}} 325 326 if (acerto_desp == 0){disp_hora_peq(); 327 disp_desp_peq();} //hora não está sendo alterada. Mostra demais informações 328 329 lcd.display(); 330} 331 332void disp_hora(){ 333 lcd.clearDisplay();lcd.setTextColor(BLACK); 334 335 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 336 lcd.setTextSize(3);lcd.setCursor(4,2); 337 // posição da hora 338 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 339 340 if (hora > 9) {lcd.print(hora);} 341 lcd.setCursor(33,2); 342 cc5 = cc5 + 1; 343 344 if (cc5 < 10) lcd.print(" "); 345 if (cc5 > 10 && cc5 < 20){lcd.print(":");} 346 347 if (cc5 > 20) cc5 = 0; 348 lcd.setCursor(44,2); // posição do minuto 349 if 350 (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 351 if (minuto > 9) {lcd.print(minuto);} 352 353 lcd.setTextSize(1); 354 355 //acerto da hora 356 if (key == '#') acerto_hora 357 = acerto_hora + 1; 358 if (acerto_hora == 1) { 359 lcd.setCursor(0,30);lcd.print("* 360 Muda HORA"); 361 lcd.setCursor(0,40);lcd.print("# Confirma"); 362 } 363 if 364 (acerto_hora == 2) { 365 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 366 367 lcd.setCursor(0,40);lcd.print("# Confirma"); 368 } 369 if (acerto_hora == 370 3) { 371 lcd.setCursor(0,30);lcd.print("Hora alterada"); 372 rtc.setTime(hora, 373 minuto, 00); 374 lcd.display(); delay(1500); acerto_hora = 0; 375 } 376 if 377 (acerto_hora == 1 & key == '*'){hora = hora + 1;if (hora >= 24){hora = 0;}} 378 379 if (acerto_hora == 2 & key == '*'){minuto = minuto + 1;if (minuto >= 60){minuto 380 = 0;}} 381 382 if (acerto_hora == 0){disp_prev(); disp_temp_peq();} //hora 383 não está sendo alterada. Mostra demais informações 384 lcd.display(); 385} 386 387void 388 disp_monit(){ 389 lcd.clearDisplay();lcd.setTextColor(BLACK); 390 lcd.drawRoundRect(0,0,84,26,2,BLACK); 391 //moldura da hora 392 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 393 394 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 395 if (hora > 9) {lcd.print(hora);} 396 397 lcd.setCursor(33,2); 398 cc5 = cc5 + 1; 399 if (cc5 < 20) lcd.print(" "); 400 401 if (cc5 > 20 && cc5 < 40){lcd.print(":");} 402 if (cc5 > 40) cc5 = 0; 403 lcd.setCursor(44,2); 404 // posição do minuto 405 if (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 406 407 if (minuto > 9) {lcd.print(minuto);} 408 409 lcd.setTextSize(1); 410 411 if (sbot_monit == HIGH && smonit == 0 ){ // Monitoração iniciada ********* 412 413 cc7 = 80;ligaluz(1);gettime();smonit = 1;sbot_monit = LOW;mov_cont = 0; 414 415 tempo_sono_inic = hora * 60 + minuto;hora_pos = hora + 1;if (hora_pos == 24) 416 hora_pos = 0;limpa_grafsono(); 417 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 418 419 lcd.setCursor(0,38);lcd.print(" Iniciada");lcd.display(); delay(1500);} 420 421 else if (sbot_monit == HIGH && smonit == 1 ){ // Monitaração terminada ********** 422 423 ligaluz(1);smonit = 0; tempo_sono_final = hora * 60 + minuto;salva_monit();relat_num 424 = lastEEP;func = 7; 425 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 426 427 lcd.setCursor(0,38);lcd.print(" Concluida"); lcd.display();delay(1500);} 428 429 430 tempo_sono_parcial = hora * 60 + minuto; 431 if (tempo_sono_parcial < tempo_sono_inic) 432 tempo_sono_parcial = tempo_sono_parcial + 1440; //passou da meia noite, add 1 dia 433 434 hora_parcial = (tempo_sono_parcial - tempo_sono_inic) / 60; 435 minuto_parcial 436 = (tempo_sono_parcial - tempo_sono_inic) - (hora_parcial * 60); 437 438 lcd.fillRoundRect(0,25,36,23,1,BLACK); 439 440 lcd.setCursor(1,30);lcd.setTextColor(WHITE);lcd.setTextSize(2); 441 if (mov_cont 442 <=9) {lcd.print(" ");} 443 lcd.print(mov_cont);lcd.setTextSize(1);lcd.setTextColor(BLACK); 444 445 lcd.drawRoundRect(35,25,49,23,1,BLACK); //box 446 lcd.setCursor(37,27);lcd.print("T.Sono");lcd.setCursor(37,37); 447 448 cc8 = cc8 + 1; if (cc8 <= 5){lcd.fillRoundRect(0,25,36,23,1,BLACK);} if (cc8 449 > 15 ) cc8 = 0; //pisca qt de movimentos 450 lcd.print(hora_parcial);lcd.print("h");if 451 (minuto_parcial <=9 ){lcd.print("0");}lcd.print(minuto_parcial); 452 if (desp 453 == 1) lcd.drawBitmap(70,37,af,8,8,BLACK); 454 lcd.display(); 455} 456 457void disp_prev1(){ 458 459 letemp(); 460 lcd.clearDisplay();lcd.setTextColor(BLACK); 461 lcd.drawRoundRect(0,0,64,26,1,BLACK); 462 //moldura da hora 463 for (i=1;i<=84;i=i+2){lcd.drawPixel(i,13,BLACK);} 464 lcd.drawRoundRect(0,25,28,23,1,BLACK); 465 466 lcd.drawRoundRect(27,25,28,23,1,BLACK); 467 lcd.drawRoundRect(54,25,30,23,1,BLACK); 468 469 lcd.setTextSize(1); 470 lcd.setCursor(66,4);lcd.print("Sol"); 471 lcd.setCursor(66,15);lcd.print("Chu"); 472 473 lcd.setCursor(4,28);lcd.print("Max");lcd.setCursor(4,38);lcd.print(pres_max); 474 475 lcd.setCursor(32,28);lcd.print("Min");lcd.setCursor(32,38);lcd.print(pres_min); 476 477 lcd.setCursor(60,28);lcd.print("Atu"); lcd.setCursor(60,38);lcd.print(pres); 478 479 480 for (i=1;i<=hpres_cont;i++){lcd.fillRect(i*5-2,25,3,map(hpres[i],924,940,0,-25),BLACK);} 481 //pressão varia de 890 a 940 em sp 482 lcd.display(); 483} 484 485void disp_qt_mov(){ 486 487 timeout_val = 2000; // Aumenta o timeout nesta tela 488 max_val = 0; 489 490 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 491 492 lcd.setCursor(1,1);lcd.print("Movimentos");lcd.setTextColor(BLACK); 493 int 494 boxinit = -2; 495 for (i=1;i<=20;i++){ // captura o maior valor 496 para referência no gráfico 497 vatual = EEPROM.read(i+20); if (vatual == 255) 498 {vatual = 0;} 499 if (vatual > max_val) {max_val = vatual;} } 500 for (i=1;i<=20;i++){ 501 502 boxinit = boxinit + 4; 503 int boxsize = map(EEPROM.read(i+20),0,max_val,0,34); 504 // 21 é a posição da memória dos movimentos 505 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 506 507 } 508 lcd.display(); 509} 510 511void disp_temp_inerte(){ 512 timeout_val = 513 2000; // Aumenta o timeout nesta tela 514 max_val = 0; 515 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 516 517 lcd.setCursor(1,1);lcd.print("Tempo Inerte");lcd.setTextColor(BLACK); 518 int 519 boxinit = -2; 520 for (i=101;i<=120;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) 521 > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 522 for (i=1;i<=20;i++){ 523 524 boxinit = boxinit + 4; 525 int t = EEPROM.read(i+100)* 60 + EEPROM.read(i+120); 526 // 101 é a posição da memória do tempo inerte 527 int boxsize = map(t,0,max_val,0,34); 528 // 480 é o máximo de 8 horas sem movimentos durante o sono 529 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 530 531 } 532 lcd.display(); 533} 534 535void disp_tempo_sono(){ 536 timeout_val = 537 2000; // Aumenta o timeout nesta tela 538 max_val = 0; 539 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 540 541 lcd.setCursor(1,1);lcd.print("Tempo Sono");lcd.setTextColor(BLACK); 542 int 543 boxinit = -2; 544 for (i=41;i<=60;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) 545 > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 546 for (i=1;i<=20;i++){ 547 548 boxinit = boxinit + 4; 549 int t = EEPROM.read(i+40)* 60 + EEPROM.read(i+60); 550 // 41 é a posição da memória do tempo de sono 551 int boxsize = map(t,0,max_val,0,34); 552 // 960 é o máximo de 16 horas de sono 553 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 554 555 } 556 lcd.display(); 557} 558 559void graf_sono(){ 560 timeout_val = 2000; // 561 Aumenta o timeout nesta tela 562 max_val = 0; 563 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 564 565 lcd.setCursor(1,1);lcd.print("Grafico Sono");lcd.setTextColor(BLACK); 566 int 567 boxinit = -2; 568 for (i=81;i<=100;i++){if (EEPROM.read(i) > max_val) max_val = 569 EEPROM.read(i); } //checa maior valor 570 for (i=81;i<=100;i++){ 571 boxinit 572 = boxinit + 4; 573 int boxsize = map(EEPROM.read(i),0,max_val,0,34); 574 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 575 576 } 577 lcd.display(); 578} 579 580void letemp(){ 581 cc4 = cc4 + 1; 582 temp_tot 583 = temp_tot + bmp.readTemperature(); 584 if (cc4 >= 10) {cc4 = 0;temp = temp_tot 585 / 10;temp_tot = 0;} // média da temperatura das última 10 medições 586 pres 587 = bmp.readPressure()/100; 588 if (pres > pres_max) pres_max = pres; 589 if (pres 590 < pres_min) pres_min = pres; 591 if ((minuto==0||minuto==10||minuto==20||minuto==30||minuto==40||minuto==50) 592 && minuto != minuto_ant1) { 593 hpres_cont = hpres_cont + 1; 594 if (hpres_cont 595 >= 12){for (i=1;i<=11;i++){hpres[i]=hpres[i+1];} hpres[12]=pres; hpres_cont = 11;} 596 597 hpres[hpres_cont] = pres; 598 minuto_ant1 = minuto; 599 } 600} 601 602void 603 monit(){ 604 smov = digitalRead(mov); 605 if (smov == HIGH) { 606 c6 = c6 607 + 1; 608 if (c6 >= 30) { // Opa! mexeu. 30 é o ajuste de movimentos 609 610 mov_cont = mov_cont + 1; // soma 1 movimento 611 c6 = 0; 612 613 if (tempo_mov_ant > 0){ // a primeira vez não calcula 614 tempo_mov_atual 615 = hora * 60 + minuto; // captura tempo atual 616 if (tempo_mov_atual 617 < tempo_mov_ant) tempo_mov_atual = tempo_mov_atual + 1440; //passou da meia 618 noite 619 tempo_sem_mov = tempo_mov_atual - tempo_mov_ant; 620 if 621 (tempo_sem_mov > tempo_sem_mov_max) { 622 tempo_sem_mov_max = tempo_sem_mov; 623 // 624 hora_maior_mov = hora; 625 minuto_maior_mov = minuto; 626 627 } 628 } 629 tempo_mov_ant = (hora * 60) + minuto; 630 } 631 632 } 633 634 //captura quantidade de movimentos realizados em cada hora 635 636 if (hora == hora_pos) { 637 cc7 = cc7 + (1 && cc7 <= 100); 638 mov_cont_atual 639 = mov_cont - mov_cont_ant; 640 EEPROM.write(cc7,mov_cont_atual); 641 mov_cont_ant 642 = mov_cont; 643 hora_pos = hora_pos + 1; if (hora_pos == 24) hora_pos = 0; 644 645 } 646} 647 648void relat_sono(){ 649 timeout_val=2000; //aumenta 650 o timeout nessa tela 651 if (key == '7'){relat_num = lastEEP;} 652 if (key == 653 '*'){relat_num = relat_num - 1;if (relat_num <= 0){relat_num = lastEEP;}} 654 if 655 (key == '#'){relat_num = relat_num + 1;if (relat_num > lastEEP){relat_num = 1;}} 656 657 658 ledados_relat(); 659 660 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 661 662 lcd.setTextSize(1);lcd.setCursor(1,1); lcd.print("Rel:SONO");lcd.setCursor(72,1);lcd.print(relat_num 663 - lastEEP); 664 lcd.setTextColor(BLACK); 665 lcd.setCursor(0,11);lcd.print("T.sono 666 :");lcd.print(relat[1]); lcd.print("h"); if (relat[2] <= 9 ){lcd.print("0");} 667 lcd.print(relat[2]); 668 lcd.setCursor(0,21);lcd.print("Qt.mov :");lcd.print(relat[3]); 669 670 lcd.setCursor(0,31);lcd.print("T.inert:");lcd.print(relat[4]);lcd.print("h");if 671 (relat[5] <= 9 ){lcd.print("0");}lcd.print(relat[5]); 672 lcd.setCursor(0,41);lcd.print(" 673 As:");lcd.print(relat[6]);lcd.print(":");if (relat[7] <= 9 ){lcd.print("0");}lcd.print(relat[7]); 674 675 lcd.display(); 676} 677 678void salva_monit(){ 679 lastEEP = lastEEP + 1; 680 681 if (lastEEP >= 20){ // número máximo atingido 682 for (i=21;i<40;i++) {EEPROM.write(i,EEPROM.read(i+1));} 683 //move cada atividade para posição anterior 684 for (i=41;i<60;i++) {EEPROM.write(i,EEPROM.read(i+1));} 685 //move cada atividade para posição anterior 686 for (i=61;i<80;i++) {EEPROM.write(i,EEPROM.read(i+1));} 687 //move cada atividade para posição anterior 688 for (i=101;i<120;i++){EEPROM.write(i,EEPROM.read(i+1));} 689 //move cada atividade para posição anterior 690 for (i=121;i<140;i++){EEPROM.write(i,EEPROM.read(i+1));} 691 //move cada atividade para posição anterior 692 for (i=141;i<160;i++){EEPROM.write(i,EEPROM.read(i+1));} 693 //move cada atividade para posição anterior 694 for (i=161;i<180;i++){EEPROM.write(i,EEPROM.read(i+1));} 695 //move cada atividade para posição anterior 696 for (i=181;i<200;i++){EEPROM.write(i,EEPROM.read(i+1));} 697 //move cada atividade para posição anterior 698 lastEEP = 20; // mantém 699 última posição como 20 700 } 701 702 if (tempo_sono_final <= tempo_sono_inic) 703 tempo_sono_final = tempo_sono_final + 1440; //passou da meia noite, add 1 dia 704 705 hora_tot = (tempo_sono_final - tempo_sono_inic) / 60; 706 minuto_tot = (tempo_sono_final 707 - tempo_sono_inic) - (hora_tot * 60); 708 if (hora_tot >= 24) hora_tot = 0; 709 710 tempo_mov_max_h = tempo_sem_mov_max / 60; // Maior quantidade 711 de tempo sem movimento (horas) 712 tempo_mov_max_m = tempo_sem_mov_max - (tempo_mov_max_h 713 * 60); // Maior qt de tempo sem movimento (minutos) 714 //Salva posições atuais 715 716 EEPROM.write(0,lastEEP); 717 EEPROM.write(lastEEP+20,mov_cont); 718 719 EEPROM.write(lastEEP+40,hora_tot); 720 EEPROM.write(lastEEP+60,minuto_tot); 721 722 EEPROM.write(lastEEP+100,tempo_mov_max_h); 723 EEPROM.write(lastEEP+120,tempo_mov_max_m); 724 725 EEPROM.write(lastEEP+140,hora_maior_mov); 726 EEPROM.write(lastEEP+160,minuto_maior_mov); 727 728} 729 730void 731 checa_desp(){ 732 if (hora == dhora & minuto == dminuto & minuto_ant != minuto) 733 { 734 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 735 736 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 737 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 738 739 lights = 1;digitalWrite(led,HIGH); 740 if (desp_tipo > 0){for (i=1;i<=desp_tipo;i++){digitalWrite(buzz, 741 HIGH);delay(40);digitalWrite(buzz, LOW);delay(400);}} 742 } 743 minuto_ant = minuto; 744} 745 746void 747 disp_desp_peq(){ 748 lcd.setTextSize(1); 749 lcd.drawRoundRect(35,25,49,23,1,BLACK); 750 //box 751 lcd.setCursor(37,27);lcd.print("Despert");lcd.setCursor(37,37);sdesp(); 752} 753 754void 755 disp_hora_peq(){ 756 lcd.setTextSize(1); 757 lcd.drawRoundRect(0,25,36,23,1,BLACK); 758 //boxes 759 lcd.setCursor(2,27);lcd.print("Hora");lcd.setCursor(2,37);shora(); 760} 761 762void 763 disp_prev(){ 764 lcd.setTextSize(1); 765 lcd.drawRoundRect(0,25,36,23,1,BLACK); 766 767 lcd.fillRoundRect(1,36,35,9,1,BLACK); 768 lcd.setCursor(2,27);lcd.print("Prev");lcd.setTextColor(WHITE);lcd.setCursor(2,37); 769 770 if (pres < 930){ lcd.print("CHUVA");} else {lcd.print(" SOL");} // 930 771 é um intermediário para SP 772 lcd.setTextColor(BLACK); 773} 774 775void gettime(){ 776 777 lcd.setTextColor(BLACK); 778 t = rtc.getTime(); 779 hora = t.hour; minuto = 780 t.min; 781} 782 783void sdesp(){ 784 if (desp == 1){ //se alarme está ativo 785 786 if (dhora <= 9) {lcd.print("0");} lcd.print(dhora);lcd.print(":"); 787 if 788 (dminuto <= 9) {lcd.print("0");} lcd.print(dminuto); 789 lcd.drawBitmap(70,37,af,8,8,BLACK); 790 791 } 792 if (desp == 0){lcd.print("--:--");} 793} 794 795void shora(){ 796 if 797 (hora <= 9) {lcd.print("0");} lcd.print(hora);lcd.print(":"); 798 if (minuto 799 <= 9) {lcd.print("0");} lcd.print(minuto); 800} 801 802void disp_temp_peq(){ 803 804 lcd.setTextSize(1); 805 lcd.drawRoundRect(35,25,33,23,1,BLACK);lcd.drawRoundRect(67,25,17,23,1,BLACK); 806 //boxes 807 lcd.setCursor(37,27);lcd.print("Temp");lcd.setCursor(37,37);lcd.print(temp,1);lcd.drawBitmap(58,37,gr,8,4,BLACK); 808 809 //lcd.setCursor(70,27);lcd.print("D."); 810 if (desp == 1)lcd.drawBitmap(70,37,af,8,8,BLACK); 811 //se alarme está ativo 812} 813 814void ligaluz(int tipo_luz){ 815 if (tipo_luz 816 == 0){ // acende ou apaga somente o led do lcd 817 cc = -cc;; 818 if 819 (cc == -1){lights = 1;digitalWrite(led, HIGH);sluz = 1;} 820 else {lights = 0;digitalWrite(led, 821 LOW);sluz = 0;} 822 cont = 0; 823 } 824 if (tipo_luz == 3){ // acende 825 ou apaga o led do lcd e a luz 826 cc = -cc; 827 if (cc == -1){lights = 1;digitalWrite(luz, 828 HIGH);digitalWrite(led, HIGH);sluz = 3;} 829 else {lights = 0;digitalWrite(luz, 830 LOW);digitalWrite(led, LOW);sluz = 0;} 831 cont = 0; 832 } 833 if (tipo_luz 834 == 1){lights = 1;digitalWrite(led, HIGH);} 835 if (tipo_luz == 2){lights = 0;digitalWrite(led, 836 LOW);} 837 delay(100); 838} 839 840void esmaece(){ 841 if (lights == 1) {cont 842 = cont + 1;} 843 if (cont >= 750 * tempoluz){ //tempo luz começa a 844 esmaecer 845 for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) { 846 analogWrite(led, 847 fadeValue); 848 if (sluz = 0) analogWrite(led, fadeValue); 849 if (sluz 850 = 3) analogWrite(luz, fadeValue); 851 delay(80); 852 } 853 lights = 0; 854 cont = 0; 855 } 856} 857 858void ledados_relat(){ 859 relat[1] = EEPROM.read(40+relat_num); 860 // horas total 861 relat[2] = EEPROM.read(60+relat_num); // minutos 862 total 863 relat[3] = EEPROM.read(20+relat_num); // qt de movimentos 864 relat[4] 865 = EEPROM.read(100+relat_num); // horas tempo inerte 866 relat[5] = EEPROM.read(120+relat_num); 867 // minutos tempo inerte 868 relat[6] = EEPROM.read(140+relat_num); // 869 que horas foi 870 relat[7] = EEPROM.read(160+relat_num); // que minutos foi 871} 872 873void 874 limpa_grafsono(){ 875 for (i=81;i<=100;i++){EEPROM.write(i,0);} 876} 877 878void 879 logo(){ 880 lcd.clearDisplay(); 881 lcd.setCursor(2, 2); lcd.print("Sleep Quality"); 882 883 lcd.setTextSize(3); lcd.setTextColor(WHITE); 884 for (i=-10;i<=20;i++){ 885 lcd.fillRoundRect(16, 886 16, 58, 28, 2, BLACK); 887 lcd.drawRect(0, 0, 84, 48, BLACK); 888 lcd.setCursor(i, 889 20); lcd.print("VSL");lcd.display();delay(20); 890 } 891 delay(300);func = 1; 892 // sai do logo 893 lcd.setTextSize(1); lcd.display(); 894} 895
Code for Sleep Quality Monitor VLS
arduino
The complete code for Code for Sleep Quality Monitor VLS
1// Sleep Quality Monitor VSL - Monitor da qualidade do sono 2// Charles 3 - August/2016 - Version 3 - Jumbo 4#include <Keypad.h> 5#include <Wire.h> 6#include 7 <Adafruit_BMP085.h> // Sensor de pressão atmosférica e temperatura 8Adafruit_BMP085 9 bmp; //Vcc=3.3V, UNO: SCL=A5, SDA=A4 MEGA: SCL=21, SDA=20 10#include <EEPROM.h> 11#include 12 <DS1307.h> // rtc 13DS1307 rtc(A2, A3); //RTC A2=CLK A3=SDA VCC=5V 14#include 15 <Adafruit_GFX.h> // para LCD Nokia 16#include <Adafruit_PCD8544.h> // 17 para LCD Nokia 18#include <Keypad.h> 19Adafruit_PCD8544 lcd = Adafruit_PCD8544(13, 20 12, 11, 10, 9); //CLK DIN DC CE RST 21 22const byte ROWS = 4; //four rows 23const 24 byte COLS = 3; //three columns 25char keys[ROWS][COLS] = { 26 {'1', '2', '3'}, 27 28 {'4', '5', '6'}, 29 {'7', '8', '9'}, 30 {'*', '0', '#'}, 31}; 32 33byte 34 rowPins[ROWS] = {A10, A11, A12, A13}; //connect to the row pinouts of the keypad 35byte 36 colPins[COLS] = {26, 24, 28}; //connect to the column pinouts of the keypad 37char 38 key; 39Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 40 41int 42 i, led=3,bot_luz=7,est_bot_luz,lights,cc=1,cc8,cc2,cc3,cc5,cc4,mov_cont, lastEEP, 43 buzz=14, hora, minuto, bot_monit=8, sbot_monit; 44int tempoluz,vatual,tempo_sem_mov,tempo_mov_ant, 45 tempo_sem_mov_max, hora_tot, minuto_tot,temp_tot; 46int timeout,timeout_val=150, 47 hora_maior_mov, minuto_maior_mov, tempo_mov_atual, tempo_mov_max_h, tempo_mov_max_m; 48int 49 func=1,pres,dhora, dminuto, acerto_hora, acerto_desp, desp=0, minuto_ant, minuto_ant1, 50 mov=A0, smov, c6, pres_max, pres_min; 51int hpres_cont, hpres[13], smonit=0, tempo_sono, 52 tempo_sono_inic, tempo_sono_final, hora_pos, cc7=80, h[20], mov_cont_ant; 53int 54 tempo_sono_parcial, hora_parcial, minuto_parcial, conf=1, desp_tipo, relat[7], relat_num, 55 max_val,mov_cont_atual,luz=4,sluz; 56unsigned int cont, umid, cont2, cont3; 57float 58 temp, temp_ant; 59String sono_tipo="Sleep Ql", sp; 60Time t; 61const unsigned 62 char PROGMEM af[] = {B00001, B00011, B00101, B11001, B11001, B00101, B00011, B00001}; 63 //auto falante 64const unsigned char PROGMEM gr[] = {B00100, B01010, B01010, B00100}; 65 //grau 66 67void setup() { 68 //Serial.begin(9600); 69 //rtc.halt(false); 70 71 //rtc.setDOW(FRIDAY); //Remover as linhas após a primeira execução 72 //rtc.setTime(06, 73 30, 00); 74 //rtc.setDate(19, 8, 2016); //Define o dia, mes e ano 75 //rtc.setSQWRate(SQW_RATE_1); 76 77 rtc.enableSQW(true); 78 bmp.begin(); 79 // Serial.println("Could not find 80 a valid BMP085 sensor, check wiring!"); 81 // while (1) {} 82 // } 83 digitalWrite(buzz, 84 HIGH); delay(40); digitalWrite(buzz, LOW); 85 delay(100); 86 pinMode(led, OUTPUT); 87 88 pinMode(luz, OUTPUT); 89 pinMode(mov, INPUT); 90 pinMode(bot_luz, INPUT); 91 92 pinMode(bot_monit, INPUT); 93 pinMode(buzz, OUTPUT); 94 95 lastEEP = EEPROM.read(0); 96 if (lastEEP == 255) lastEEP = 0; //lê a última qt de medição na posição 0 97 98 tempoluz = EEPROM.read(200); if (tempoluz == 255) tempoluz = 0; //lê o tempo de 99 luz acesa 100 desp = EEPROM.read(201); if (desp == 255) desp = 0; //0=despertador 101 desligado, 1=despertador ativo 102 desp_tipo = EEPROM.read(202); if (desp_tipo 103 == 255) desp_tipo = 0; //0=despertador desligado, 1=despertador ativo 104 dhora 105 = EEPROM.read(203); if (dhora == 255) dhora = 0; //lê a hora do despertador 106 107 dminuto = EEPROM.read(204); if (dminuto == 255) dminuto = 0; //lê o minuto 108 do despertador 109 relat_num = lastEEP; ledados_relat(); 110 111 lcd.begin(); 112 113 lcd.setContrast(50); //Ajusta o contraste do display 114 115 logo(); // Chama 116 a tela de logo 117 delay(200); digitalWrite(led,HIGH); delay(300);digitalWrite(led,LOW); 118 119 120 pres = bmp.readPressure() / 100; 121 temp = bmp.readTemperature(); 122 123 pres_max = pres; pres_min = pres; 124 desp = 1; //1=ativo, 0=false = mudar 125 para eeprom 126} 127 128void loop() { 129 sbot_monit = digitalRead(bot_monit); 130 131 if (sbot_monit == HIGH) { 132 func = 20; 133 //disp_monit(); 134 } 135 136 137 if (acerto_hora <= 0) gettime(); //a hora não está sendo alterada. Atualiza 138 a hora 139 if (desp == 1) checa_desp(); //despertador ativo. Está na hora 140 ? 141 letemp(); 142 if (smonit == 1) monit(); 143 144 key = keypad.getKey(); 145 146 if (key) { 147 timeout = 0; timeout_val = 200; // houve atividade, zera 148 o timeout 149 if (key == '1') {func = 1;} 150 if (key == '2') {func = 2;} 151 152 if (key == '3') {func = 3;} 153 if (key == '4') {func = 4;} 154 if (key 155 == '5') {func = 5;} 156 if (key == '6') {func = 6;} 157 if (key == '7') {func 158 = 7;} 159 if (key == '8') {func = 8;} 160 if (key == '9') {func = 9;} 161 162 if (key == '0') {func = 10;} 163 } 164 if (func == 1) {disp_hora();relat_num 165 = lastEEP;max_val = 0;acerto_desp = 0;} 166 if (func == 2) {disp_desp();acerto_hora 167 = 0;} 168 if (func == 3) {disp_prev1();acerto_desp = 0;acerto_hora = 0;} 169 if 170 (func == 4) {disp_tempo_sono();acerto_desp = 0;acerto_hora = 0;} 171 if (func == 172 5) {disp_qt_mov();acerto_desp = 0;acerto_hora = 0;} 173 if (func == 6) {disp_temp_inerte();acerto_desp 174 = 0;acerto_hora = 0;} 175 if (func == 7) {relat_sono();acerto_desp = 0;acerto_hora 176 = 0;} 177 if (func == 8) {graf_sono();acerto_desp = 0;acerto_hora = 0;} 178 if 179 (func == 9) {disp_config();acerto_desp = 0;acerto_hora = 0;} 180 if (func == 10) 181 {logo();acerto_desp = 0;acerto_hora = 0;} 182 if (func == 20) {disp_monit();acerto_desp 183 = 0;acerto_hora = 0;} 184 185 timeout = timeout + 1; 186 if (timeout >= timeout_val) 187 { //tempo de inatividade, volta para tela principal 188 if (smonit == 0) 189 func = 1; 190 if (smonit == 1) func = 20; 191 timeout = 0; 192 } 193 194 195 //Botão liga ou desliga o led, após cerca de 10 minutos começa o fade out do led 196 197 est_bot_luz = digitalRead(bot_luz); 198 if (est_bot_luz == HIGH) { 199 ligaluz(3); 200 201 } 202 else { 203 cont3 = 0; // Desativa contador do SQ 204 } 205 if (tempoluz 206 > 0 && lights >= 1) { 207 esmaece(); //Se tempoluz=0 não apaga, caso contrário, 208 começa a esmaecer 209 } 210 211 if (acerto_hora == 0 && key == '*' && func != 212 7 && func != 9) ligaluz(0); 213 214} 215 216void disp_config(){ 217 timeout_val=2000; 218 //aumenta o timeout nessa tela 219 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 220 221 lcd.setTextSize(1);lcd.setCursor(3,1); lcd.print("Configuracoes");lcd.setTextColor(BLACK); 222 223 224 if (key == '*'){conf = conf + 1;cc2=0;cc3=0;} 225 lcd.drawRect(0,10*conf,84,10,BLACK); 226 227 228 lcd.setCursor(0,11);lcd.print("Tempo luz:");if (tempoluz == 0) {lcd.print("--");} 229 else {lcd.print(tempoluz);} 230 lcd.setCursor(0,21);lcd.print("Qtd.beeps:");lcd.print(desp_tipo); 231 232 if (cc2 == 0){lcd.setCursor(0,31);lcd.print("DEL ult monit");} 233 if (cc2 234 == 1){lcd.setCursor(0,31);lcd.print(" # Confirma ");} 235 if (cc2 == 2){ 236 237 for (i=20;i<=179;i=i+20){EEPROM.write(i+lastEEP,0);} 238 lastEEP = lastEEP 239 -1; EEPROM.write(0,lastEEP); 240 lcd.setCursor(0,31); lcd.print("Monit. APAGADA");lcd.display();delay(1500);cc2 241 = 0;} 242 if (cc3 == 0){lcd.setCursor(0,41);lcd.print("Apagar memoria");} 243 244 if (cc3 == 1){lcd.setCursor(0,41);lcd.print(" # Confirma ");} 245 if (cc3 246 == 2){ 247 lastEEP = 0; for (i=0;i<=255;i++){EEPROM.write(i,0);} 248 lcd.setCursor(0,41); 249 lcd.print("Memor APAGADA");lcd.display();delay(1500);cc3 = 0;} 250 251 if (conf 252 == 1 && key == '#'){tempoluz = tempoluz + 5; if (tempoluz >= 32) {tempoluz=0;} EEPROM.write(200,tempoluz);} 253 254 if (conf == 2 && key == '#'){desp_tipo = desp_tipo + 1; if (desp_tipo > 10) {desp_tipo 255 = 0;} EEPROM.write(202,desp_tipo);} 256 if (conf == 3 && key == '#'){cc2 = cc2 257 + 1;} 258 if (conf == 4 && key == '#'){cc3 = cc3 + 1;} 259 if (conf >= 5) conf 260 = 1; 261 262 lcd.display(); 263} 264 265void disp_desp(){ 266 lcd.clearDisplay();lcd.setTextColor(BLACK); 267 268 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 269 lcd.setTextSize(3);lcd.setCursor(4,2); 270 // posição da hora 271 if (dhora <= 9) {lcd.print("0");lcd.print(dhora);} 272 273 if (dhora > 9) {lcd.print(dhora);} 274 lcd.setCursor(33,2);lcd.print(":"); 275 276 lcd.setCursor(44,2); // posição do minuto 277 if (dminuto <= 9) {lcd.print("0");lcd.print(dminuto);} 278 279 if (dminuto > 9) {lcd.print(dminuto);} 280 lcd.setTextSize(1); 281 282 //acerto 283 da hora do despertador 284 if (key == '#') acerto_desp = acerto_desp + 1; 285 if 286 (acerto_desp == 1) { 287 lcd.setCursor(0,30);lcd.print("* Muda HORA"); 288 289 lcd.setCursor(0,40);lcd.print("# Confirma"); 290 } 291 if (acerto_desp == 292 2) { 293 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 294 lcd.setCursor(0,40);lcd.print("# 295 Confirma"); 296 } 297 if (acerto_desp == 3 & desp == 1) { 298 lcd.setCursor(0,30);lcd.print("* 299 ALARME Ligad"); 300 lcd.setCursor(0,40);lcd.print("# Confirma"); 301 } 302 303 if (acerto_desp == 3 & desp == 0) { 304 lcd.setCursor(0,30);lcd.print("* ALARME 305 Deslg"); 306 lcd.setCursor(0,40);lcd.print("# Confirma"); 307 } 308if (acerto_desp 309 == 4) { 310 lcd.setCursor(0,30); 311 if (desp == 1) {lcd.print("Despert.LIGADO");} 312 313 if (desp == 0) {lcd.print("Despert. DELIG");} 314 EEPROM.write(203,dhora);EEPROM.write(204,dminuto);EEPROM.write(201,desp); 315 //salva hora, minuto e situação do alarme 316 lcd.display(); delay(2000); acerto_desp 317 = 0; 318 } 319 if (acerto_desp == 1 & key == '*'){dhora = dhora + 1;if (dhora 320 >= 24){dhora = 0;}} 321 if (acerto_desp == 2 & key == '*'){dminuto = dminuto + 322 1;if (dminuto >= 60){dminuto = 0;}} 323 if (acerto_desp == 3 & key == '*'){if (desp 324 == 0){desp = 1;} else {desp = 0;}} 325 326 if (acerto_desp == 0){disp_hora_peq(); 327 disp_desp_peq();} //hora não está sendo alterada. Mostra demais informações 328 329 lcd.display(); 330} 331 332void disp_hora(){ 333 lcd.clearDisplay();lcd.setTextColor(BLACK); 334 335 lcd.drawRoundRect(0,0,84,26,2,BLACK); //moldura da hora 336 lcd.setTextSize(3);lcd.setCursor(4,2); 337 // posição da hora 338 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 339 340 if (hora > 9) {lcd.print(hora);} 341 lcd.setCursor(33,2); 342 cc5 = cc5 + 1; 343 344 if (cc5 < 10) lcd.print(" "); 345 if (cc5 > 10 && cc5 < 20){lcd.print(":");} 346 347 if (cc5 > 20) cc5 = 0; 348 lcd.setCursor(44,2); // posição do minuto 349 if 350 (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 351 if (minuto > 9) {lcd.print(minuto);} 352 353 lcd.setTextSize(1); 354 355 //acerto da hora 356 if (key == '#') acerto_hora 357 = acerto_hora + 1; 358 if (acerto_hora == 1) { 359 lcd.setCursor(0,30);lcd.print("* 360 Muda HORA"); 361 lcd.setCursor(0,40);lcd.print("# Confirma"); 362 } 363 if 364 (acerto_hora == 2) { 365 lcd.setCursor(0,30);lcd.print("* Muda MINUTO"); 366 367 lcd.setCursor(0,40);lcd.print("# Confirma"); 368 } 369 if (acerto_hora == 370 3) { 371 lcd.setCursor(0,30);lcd.print("Hora alterada"); 372 rtc.setTime(hora, 373 minuto, 00); 374 lcd.display(); delay(1500); acerto_hora = 0; 375 } 376 if 377 (acerto_hora == 1 & key == '*'){hora = hora + 1;if (hora >= 24){hora = 0;}} 378 379 if (acerto_hora == 2 & key == '*'){minuto = minuto + 1;if (minuto >= 60){minuto 380 = 0;}} 381 382 if (acerto_hora == 0){disp_prev(); disp_temp_peq();} //hora 383 não está sendo alterada. Mostra demais informações 384 lcd.display(); 385} 386 387void 388 disp_monit(){ 389 lcd.clearDisplay();lcd.setTextColor(BLACK); 390 lcd.drawRoundRect(0,0,84,26,2,BLACK); 391 //moldura da hora 392 lcd.setTextSize(3);lcd.setCursor(4,2); // posição da hora 393 394 if (hora <= 9) {lcd.print("0");lcd.print(hora);} 395 if (hora > 9) {lcd.print(hora);} 396 397 lcd.setCursor(33,2); 398 cc5 = cc5 + 1; 399 if (cc5 < 20) lcd.print(" "); 400 401 if (cc5 > 20 && cc5 < 40){lcd.print(":");} 402 if (cc5 > 40) cc5 = 0; 403 lcd.setCursor(44,2); 404 // posição do minuto 405 if (minuto <= 9) {lcd.print("0");lcd.print(minuto);} 406 407 if (minuto > 9) {lcd.print(minuto);} 408 409 lcd.setTextSize(1); 410 411 if (sbot_monit == HIGH && smonit == 0 ){ // Monitoração iniciada ********* 412 413 cc7 = 80;ligaluz(1);gettime();smonit = 1;sbot_monit = LOW;mov_cont = 0; 414 415 tempo_sono_inic = hora * 60 + minuto;hora_pos = hora + 1;if (hora_pos == 24) 416 hora_pos = 0;limpa_grafsono(); 417 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 418 419 lcd.setCursor(0,38);lcd.print(" Iniciada");lcd.display(); delay(1500);} 420 421 else if (sbot_monit == HIGH && smonit == 1 ){ // Monitaração terminada ********** 422 423 ligaluz(1);smonit = 0; tempo_sono_final = hora * 60 + minuto;salva_monit();relat_num 424 = lastEEP;func = 7; 425 lcd.setCursor(0,28);lcd.print(" Monitoracao"); 426 427 lcd.setCursor(0,38);lcd.print(" Concluida"); lcd.display();delay(1500);} 428 429 430 tempo_sono_parcial = hora * 60 + minuto; 431 if (tempo_sono_parcial < tempo_sono_inic) 432 tempo_sono_parcial = tempo_sono_parcial + 1440; //passou da meia noite, add 1 dia 433 434 hora_parcial = (tempo_sono_parcial - tempo_sono_inic) / 60; 435 minuto_parcial 436 = (tempo_sono_parcial - tempo_sono_inic) - (hora_parcial * 60); 437 438 lcd.fillRoundRect(0,25,36,23,1,BLACK); 439 440 lcd.setCursor(1,30);lcd.setTextColor(WHITE);lcd.setTextSize(2); 441 if (mov_cont 442 <=9) {lcd.print(" ");} 443 lcd.print(mov_cont);lcd.setTextSize(1);lcd.setTextColor(BLACK); 444 445 lcd.drawRoundRect(35,25,49,23,1,BLACK); //box 446 lcd.setCursor(37,27);lcd.print("T.Sono");lcd.setCursor(37,37); 447 448 cc8 = cc8 + 1; if (cc8 <= 5){lcd.fillRoundRect(0,25,36,23,1,BLACK);} if (cc8 449 > 15 ) cc8 = 0; //pisca qt de movimentos 450 lcd.print(hora_parcial);lcd.print("h");if 451 (minuto_parcial <=9 ){lcd.print("0");}lcd.print(minuto_parcial); 452 if (desp 453 == 1) lcd.drawBitmap(70,37,af,8,8,BLACK); 454 lcd.display(); 455} 456 457void disp_prev1(){ 458 459 letemp(); 460 lcd.clearDisplay();lcd.setTextColor(BLACK); 461 lcd.drawRoundRect(0,0,64,26,1,BLACK); 462 //moldura da hora 463 for (i=1;i<=84;i=i+2){lcd.drawPixel(i,13,BLACK);} 464 lcd.drawRoundRect(0,25,28,23,1,BLACK); 465 466 lcd.drawRoundRect(27,25,28,23,1,BLACK); 467 lcd.drawRoundRect(54,25,30,23,1,BLACK); 468 469 lcd.setTextSize(1); 470 lcd.setCursor(66,4);lcd.print("Sol"); 471 lcd.setCursor(66,15);lcd.print("Chu"); 472 473 lcd.setCursor(4,28);lcd.print("Max");lcd.setCursor(4,38);lcd.print(pres_max); 474 475 lcd.setCursor(32,28);lcd.print("Min");lcd.setCursor(32,38);lcd.print(pres_min); 476 477 lcd.setCursor(60,28);lcd.print("Atu"); lcd.setCursor(60,38);lcd.print(pres); 478 479 480 for (i=1;i<=hpres_cont;i++){lcd.fillRect(i*5-2,25,3,map(hpres[i],924,940,0,-25),BLACK);} 481 //pressão varia de 890 a 940 em sp 482 lcd.display(); 483} 484 485void disp_qt_mov(){ 486 487 timeout_val = 2000; // Aumenta o timeout nesta tela 488 max_val = 0; 489 490 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 491 492 lcd.setCursor(1,1);lcd.print("Movimentos");lcd.setTextColor(BLACK); 493 int 494 boxinit = -2; 495 for (i=1;i<=20;i++){ // captura o maior valor 496 para referência no gráfico 497 vatual = EEPROM.read(i+20); if (vatual == 255) 498 {vatual = 0;} 499 if (vatual > max_val) {max_val = vatual;} } 500 for (i=1;i<=20;i++){ 501 502 boxinit = boxinit + 4; 503 int boxsize = map(EEPROM.read(i+20),0,max_val,0,34); 504 // 21 é a posição da memória dos movimentos 505 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 506 507 } 508 lcd.display(); 509} 510 511void disp_temp_inerte(){ 512 timeout_val = 513 2000; // Aumenta o timeout nesta tela 514 max_val = 0; 515 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 516 517 lcd.setCursor(1,1);lcd.print("Tempo Inerte");lcd.setTextColor(BLACK); 518 int 519 boxinit = -2; 520 for (i=101;i<=120;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) 521 > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 522 for (i=1;i<=20;i++){ 523 524 boxinit = boxinit + 4; 525 int t = EEPROM.read(i+100)* 60 + EEPROM.read(i+120); 526 // 101 é a posição da memória do tempo inerte 527 int boxsize = map(t,0,max_val,0,34); 528 // 480 é o máximo de 8 horas sem movimentos durante o sono 529 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 530 531 } 532 lcd.display(); 533} 534 535void disp_tempo_sono(){ 536 timeout_val = 537 2000; // Aumenta o timeout nesta tela 538 max_val = 0; 539 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 540 541 lcd.setCursor(1,1);lcd.print("Tempo Sono");lcd.setTextColor(BLACK); 542 int 543 boxinit = -2; 544 for (i=41;i<=60;i++){if ((EEPROM.read(i)*60+EEPROM.read(i+20)) 545 > max_val) max_val = EEPROM.read(i)*60+EEPROM.read(i+20);} 546 for (i=1;i<=20;i++){ 547 548 boxinit = boxinit + 4; 549 int t = EEPROM.read(i+40)* 60 + EEPROM.read(i+60); 550 // 41 é a posição da memória do tempo de sono 551 int boxsize = map(t,0,max_val,0,34); 552 // 960 é o máximo de 16 horas de sono 553 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 554 555 } 556 lcd.display(); 557} 558 559void graf_sono(){ 560 timeout_val = 2000; // 561 Aumenta o timeout nesta tela 562 max_val = 0; 563 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 564 565 lcd.setCursor(1,1);lcd.print("Grafico Sono");lcd.setTextColor(BLACK); 566 int 567 boxinit = -2; 568 for (i=81;i<=100;i++){if (EEPROM.read(i) > max_val) max_val = 569 EEPROM.read(i); } //checa maior valor 570 for (i=81;i<=100;i++){ 571 boxinit 572 = boxinit + 4; 573 int boxsize = map(EEPROM.read(i),0,max_val,0,34); 574 lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK); 575 576 } 577 lcd.display(); 578} 579 580void letemp(){ 581 cc4 = cc4 + 1; 582 temp_tot 583 = temp_tot + bmp.readTemperature(); 584 if (cc4 >= 10) {cc4 = 0;temp = temp_tot 585 / 10;temp_tot = 0;} // média da temperatura das última 10 medições 586 pres 587 = bmp.readPressure()/100; 588 if (pres > pres_max) pres_max = pres; 589 if (pres 590 < pres_min) pres_min = pres; 591 if ((minuto==0||minuto==10||minuto==20||minuto==30||minuto==40||minuto==50) 592 && minuto != minuto_ant1) { 593 hpres_cont = hpres_cont + 1; 594 if (hpres_cont 595 >= 12){for (i=1;i<=11;i++){hpres[i]=hpres[i+1];} hpres[12]=pres; hpres_cont = 11;} 596 597 hpres[hpres_cont] = pres; 598 minuto_ant1 = minuto; 599 } 600} 601 602void 603 monit(){ 604 smov = digitalRead(mov); 605 if (smov == HIGH) { 606 c6 = c6 607 + 1; 608 if (c6 >= 30) { // Opa! mexeu. 30 é o ajuste de movimentos 609 610 mov_cont = mov_cont + 1; // soma 1 movimento 611 c6 = 0; 612 613 if (tempo_mov_ant > 0){ // a primeira vez não calcula 614 tempo_mov_atual 615 = hora * 60 + minuto; // captura tempo atual 616 if (tempo_mov_atual 617 < tempo_mov_ant) tempo_mov_atual = tempo_mov_atual + 1440; //passou da meia 618 noite 619 tempo_sem_mov = tempo_mov_atual - tempo_mov_ant; 620 if 621 (tempo_sem_mov > tempo_sem_mov_max) { 622 tempo_sem_mov_max = tempo_sem_mov; 623 // 624 hora_maior_mov = hora; 625 minuto_maior_mov = minuto; 626 627 } 628 } 629 tempo_mov_ant = (hora * 60) + minuto; 630 } 631 632 } 633 634 //captura quantidade de movimentos realizados em cada hora 635 636 if (hora == hora_pos) { 637 cc7 = cc7 + (1 && cc7 <= 100); 638 mov_cont_atual 639 = mov_cont - mov_cont_ant; 640 EEPROM.write(cc7,mov_cont_atual); 641 mov_cont_ant 642 = mov_cont; 643 hora_pos = hora_pos + 1; if (hora_pos == 24) hora_pos = 0; 644 645 } 646} 647 648void relat_sono(){ 649 timeout_val=2000; //aumenta 650 o timeout nessa tela 651 if (key == '7'){relat_num = lastEEP;} 652 if (key == 653 '*'){relat_num = relat_num - 1;if (relat_num <= 0){relat_num = lastEEP;}} 654 if 655 (key == '#'){relat_num = relat_num + 1;if (relat_num > lastEEP){relat_num = 1;}} 656 657 658 ledados_relat(); 659 660 lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK); 661 662 lcd.setTextSize(1);lcd.setCursor(1,1); lcd.print("Rel:SONO");lcd.setCursor(72,1);lcd.print(relat_num 663 - lastEEP); 664 lcd.setTextColor(BLACK); 665 lcd.setCursor(0,11);lcd.print("T.sono 666 :");lcd.print(relat[1]); lcd.print("h"); if (relat[2] <= 9 ){lcd.print("0");} 667 lcd.print(relat[2]); 668 lcd.setCursor(0,21);lcd.print("Qt.mov :");lcd.print(relat[3]); 669 670 lcd.setCursor(0,31);lcd.print("T.inert:");lcd.print(relat[4]);lcd.print("h");if 671 (relat[5] <= 9 ){lcd.print("0");}lcd.print(relat[5]); 672 lcd.setCursor(0,41);lcd.print(" 673 As:");lcd.print(relat[6]);lcd.print(":");if (relat[7] <= 9 ){lcd.print("0");}lcd.print(relat[7]); 674 675 lcd.display(); 676} 677 678void salva_monit(){ 679 lastEEP = lastEEP + 1; 680 681 if (lastEEP >= 20){ // número máximo atingido 682 for (i=21;i<40;i++) {EEPROM.write(i,EEPROM.read(i+1));} 683 //move cada atividade para posição anterior 684 for (i=41;i<60;i++) {EEPROM.write(i,EEPROM.read(i+1));} 685 //move cada atividade para posição anterior 686 for (i=61;i<80;i++) {EEPROM.write(i,EEPROM.read(i+1));} 687 //move cada atividade para posição anterior 688 for (i=101;i<120;i++){EEPROM.write(i,EEPROM.read(i+1));} 689 //move cada atividade para posição anterior 690 for (i=121;i<140;i++){EEPROM.write(i,EEPROM.read(i+1));} 691 //move cada atividade para posição anterior 692 for (i=141;i<160;i++){EEPROM.write(i,EEPROM.read(i+1));} 693 //move cada atividade para posição anterior 694 for (i=161;i<180;i++){EEPROM.write(i,EEPROM.read(i+1));} 695 //move cada atividade para posição anterior 696 for (i=181;i<200;i++){EEPROM.write(i,EEPROM.read(i+1));} 697 //move cada atividade para posição anterior 698 lastEEP = 20; // mantém 699 última posição como 20 700 } 701 702 if (tempo_sono_final <= tempo_sono_inic) 703 tempo_sono_final = tempo_sono_final + 1440; //passou da meia noite, add 1 dia 704 705 hora_tot = (tempo_sono_final - tempo_sono_inic) / 60; 706 minuto_tot = (tempo_sono_final 707 - tempo_sono_inic) - (hora_tot * 60); 708 if (hora_tot >= 24) hora_tot = 0; 709 710 tempo_mov_max_h = tempo_sem_mov_max / 60; // Maior quantidade 711 de tempo sem movimento (horas) 712 tempo_mov_max_m = tempo_sem_mov_max - (tempo_mov_max_h 713 * 60); // Maior qt de tempo sem movimento (minutos) 714 //Salva posições atuais 715 716 EEPROM.write(0,lastEEP); 717 EEPROM.write(lastEEP+20,mov_cont); 718 719 EEPROM.write(lastEEP+40,hora_tot); 720 EEPROM.write(lastEEP+60,minuto_tot); 721 722 EEPROM.write(lastEEP+100,tempo_mov_max_h); 723 EEPROM.write(lastEEP+120,tempo_mov_max_m); 724 725 EEPROM.write(lastEEP+140,hora_maior_mov); 726 EEPROM.write(lastEEP+160,minuto_maior_mov); 727 728} 729 730void 731 checa_desp(){ 732 if (hora == dhora & minuto == dminuto & minuto_ant != minuto) 733 { 734 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 735 736 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 737 digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100); 738 739 lights = 1;digitalWrite(led,HIGH); 740 if (desp_tipo > 0){for (i=1;i<=desp_tipo;i++){digitalWrite(buzz, 741 HIGH);delay(40);digitalWrite(buzz, LOW);delay(400);}} 742 } 743 minuto_ant = minuto; 744} 745 746void 747 disp_desp_peq(){ 748 lcd.setTextSize(1); 749 lcd.drawRoundRect(35,25,49,23,1,BLACK); 750 //box 751 lcd.setCursor(37,27);lcd.print("Despert");lcd.setCursor(37,37);sdesp(); 752} 753 754void 755 disp_hora_peq(){ 756 lcd.setTextSize(1); 757 lcd.drawRoundRect(0,25,36,23,1,BLACK); 758 //boxes 759 lcd.setCursor(2,27);lcd.print("Hora");lcd.setCursor(2,37);shora(); 760} 761 762void 763 disp_prev(){ 764 lcd.setTextSize(1); 765 lcd.drawRoundRect(0,25,36,23,1,BLACK); 766 767 lcd.fillRoundRect(1,36,35,9,1,BLACK); 768 lcd.setCursor(2,27);lcd.print("Prev");lcd.setTextColor(WHITE);lcd.setCursor(2,37); 769 770 if (pres < 930){ lcd.print("CHUVA");} else {lcd.print(" SOL");} // 930 771 é um intermediário para SP 772 lcd.setTextColor(BLACK); 773} 774 775void gettime(){ 776 777 lcd.setTextColor(BLACK); 778 t = rtc.getTime(); 779 hora = t.hour; minuto = 780 t.min; 781} 782 783void sdesp(){ 784 if (desp == 1){ //se alarme está ativo 785 786 if (dhora <= 9) {lcd.print("0");} lcd.print(dhora);lcd.print(":"); 787 if 788 (dminuto <= 9) {lcd.print("0");} lcd.print(dminuto); 789 lcd.drawBitmap(70,37,af,8,8,BLACK); 790 791 } 792 if (desp == 0){lcd.print("--:--");} 793} 794 795void shora(){ 796 if 797 (hora <= 9) {lcd.print("0");} lcd.print(hora);lcd.print(":"); 798 if (minuto 799 <= 9) {lcd.print("0");} lcd.print(minuto); 800} 801 802void disp_temp_peq(){ 803 804 lcd.setTextSize(1); 805 lcd.drawRoundRect(35,25,33,23,1,BLACK);lcd.drawRoundRect(67,25,17,23,1,BLACK); 806 //boxes 807 lcd.setCursor(37,27);lcd.print("Temp");lcd.setCursor(37,37);lcd.print(temp,1);lcd.drawBitmap(58,37,gr,8,4,BLACK); 808 809 //lcd.setCursor(70,27);lcd.print("D."); 810 if (desp == 1)lcd.drawBitmap(70,37,af,8,8,BLACK); 811 //se alarme está ativo 812} 813 814void ligaluz(int tipo_luz){ 815 if (tipo_luz 816 == 0){ // acende ou apaga somente o led do lcd 817 cc = -cc;; 818 if 819 (cc == -1){lights = 1;digitalWrite(led, HIGH);sluz = 1;} 820 else {lights = 0;digitalWrite(led, 821 LOW);sluz = 0;} 822 cont = 0; 823 } 824 if (tipo_luz == 3){ // acende 825 ou apaga o led do lcd e a luz 826 cc = -cc; 827 if (cc == -1){lights = 1;digitalWrite(luz, 828 HIGH);digitalWrite(led, HIGH);sluz = 3;} 829 else {lights = 0;digitalWrite(luz, 830 LOW);digitalWrite(led, LOW);sluz = 0;} 831 cont = 0; 832 } 833 if (tipo_luz 834 == 1){lights = 1;digitalWrite(led, HIGH);} 835 if (tipo_luz == 2){lights = 0;digitalWrite(led, 836 LOW);} 837 delay(100); 838} 839 840void esmaece(){ 841 if (lights == 1) {cont 842 = cont + 1;} 843 if (cont >= 750 * tempoluz){ //tempo luz começa a 844 esmaecer 845 for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) { 846 analogWrite(led, 847 fadeValue); 848 if (sluz = 0) analogWrite(led, fadeValue); 849 if (sluz 850 = 3) analogWrite(luz, fadeValue); 851 delay(80); 852 } 853 lights = 0; 854 cont = 0; 855 } 856} 857 858void ledados_relat(){ 859 relat[1] = EEPROM.read(40+relat_num); 860 // horas total 861 relat[2] = EEPROM.read(60+relat_num); // minutos 862 total 863 relat[3] = EEPROM.read(20+relat_num); // qt de movimentos 864 relat[4] 865 = EEPROM.read(100+relat_num); // horas tempo inerte 866 relat[5] = EEPROM.read(120+relat_num); 867 // minutos tempo inerte 868 relat[6] = EEPROM.read(140+relat_num); // 869 que horas foi 870 relat[7] = EEPROM.read(160+relat_num); // que minutos foi 871} 872 873void 874 limpa_grafsono(){ 875 for (i=81;i<=100;i++){EEPROM.write(i,0);} 876} 877 878void 879 logo(){ 880 lcd.clearDisplay(); 881 lcd.setCursor(2, 2); lcd.print("Sleep Quality"); 882 883 lcd.setTextSize(3); lcd.setTextColor(WHITE); 884 for (i=-10;i<=20;i++){ 885 lcd.fillRoundRect(16, 886 16, 58, 28, 2, BLACK); 887 lcd.drawRect(0, 0, 84, 48, BLACK); 888 lcd.setCursor(i, 889 20); lcd.print("VSL");lcd.display();delay(20); 890 } 891 delay(300);func = 1; 892 // sai do logo 893 lcd.setTextSize(1); lcd.display(); 894} 895
Downloadable files
Schematic for Sleep Quality Monitor VLS
Schematic for Sleep Quality Monitor VLS
Schematic for Sleep Quality Monitor VLS
Schematic for Sleep Quality Monitor VLS
Documentation
Schematic for Sleep Quality Monitor VLS
Schematic for Sleep Quality Monitor VLS
Comments
Only logged in users can leave comments