Sleep Quality Monitor

Monitor the quality of your sleep and live better.

  • 3,927 views
  • 1 comment
  • 11 respects

Components and supplies

Apps and online services

About this project

Sleep Quality Monitor VSL

Do you feel tired during the day? Your memory is not the same? You are gaining weight? Get sick easily? Your blood pressure is deregulated? The performance in the gym is decreasing? Are you grumpy?

Your problem may be related to poor quality of sleep. The amount of sleep a person needs varies greatly, however, they need to be well used. A good night's sleep means a day of great productivity, but how to know if we're sleeping well?

Now you can count on SleepQuality VSL Monitor to monitor the quality of your sleep. The SleepQuality VSL Monitor is an electronic component of high technology that detects your movements during the night and provides reports and comparison charts.

How it works:

As you prepare for sleep, check the temperature of the environment and thus better prepare for sleep. Then press the Light button, which will light up the display illumination, but do not worry about that this because the lighting will fade slowly after about ten minutes (this time can be set). Before bed, just press the Monitor button and have a good sleep. When you wake up press the Monitor button again to and check the following information:

And there´s more:

Now you can think about changing your routine, such as sleep sooner or later, take walks in the evening or in the morning, change the food, etc. and follow it on the right track through SleepQuality Monitor VLS.

Code

Code for Sleep Quality Monitor VLSArduino
The complete code for Code for Sleep Quality Monitor VLS
// Sleep Quality Monitor VSL - Monitor da qualidade do sono
// Charles - August/2016 - Version 3 - Jumbo
#include <Keypad.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>    // Sensor de pressão atmosférica e temperatura
Adafruit_BMP085 bmp; //Vcc=3.3V, UNO: SCL=A5, SDA=A4 MEGA: SCL=21, SDA=20
#include <EEPROM.h>
#include <DS1307.h>     // rtc
DS1307 rtc(A2, A3);  //RTC A2=CLK A3=SDA VCC=5V
#include <Adafruit_GFX.h>          // para LCD Nokia
#include <Adafruit_PCD8544.h>      // para LCD Nokia
#include <Keypad.h>
Adafruit_PCD8544 lcd = Adafruit_PCD8544(13, 12, 11, 10, 9); //CLK DIN DC CE RST  

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'},
};

byte rowPins[ROWS] = {A10, A11, A12, A13}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {26, 24, 28}; //connect to the column pinouts of the keypad
char key;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int 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;
int tempoluz,vatual,tempo_sem_mov,tempo_mov_ant, tempo_sem_mov_max, hora_tot, minuto_tot,temp_tot;
int timeout,timeout_val=150, hora_maior_mov, minuto_maior_mov, tempo_mov_atual, tempo_mov_max_h, tempo_mov_max_m;
int func=1,pres,dhora, dminuto, acerto_hora, acerto_desp, desp=0, minuto_ant, minuto_ant1, mov=A0, smov, c6, pres_max, pres_min;
int hpres_cont, hpres[13], smonit=0, tempo_sono, tempo_sono_inic, tempo_sono_final, hora_pos, cc7=80, h[20], mov_cont_ant;
int tempo_sono_parcial, hora_parcial, minuto_parcial, conf=1, desp_tipo, relat[7], relat_num, max_val,mov_cont_atual,luz=4,sluz;
unsigned int cont, umid, cont2, cont3;
float temp, temp_ant;
String sono_tipo="Sleep Ql", sp;
Time t;
const unsigned char PROGMEM af[] = {B00001, B00011, B00101, B11001, B11001, B00101, B00011, B00001}; //auto falante
const unsigned char PROGMEM gr[] = {B00100, B01010, B01010, B00100}; //grau

void setup() {
  //Serial.begin(9600);
  //rtc.halt(false);
  //rtc.setDOW(FRIDAY);      //Remover as linhas após a primeira execução
  //rtc.setTime(06, 30, 00);
  //rtc.setDate(19, 8, 2016);   //Define o dia, mes e ano
  //rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
  bmp.begin();
  //   Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  //  while (1) {}
  // }
  digitalWrite(buzz, HIGH); delay(40); digitalWrite(buzz, LOW);
  delay(100);
  pinMode(led, OUTPUT);
  pinMode(luz, OUTPUT);
  pinMode(mov, INPUT);
  pinMode(bot_luz, INPUT);
  pinMode(bot_monit, INPUT);
  pinMode(buzz, OUTPUT);

  lastEEP = EEPROM.read(0); if (lastEEP == 255) lastEEP = 0;      //lê a última qt de medição na posição 0
  tempoluz = EEPROM.read(200); if (tempoluz == 255) tempoluz = 0; //lê o tempo de luz acesa
  desp = EEPROM.read(201); if (desp == 255) desp = 0;             //0=despertador desligado, 1=despertador ativo
  desp_tipo = EEPROM.read(202); if (desp_tipo == 255) desp_tipo = 0; //0=despertador desligado, 1=despertador ativo
  dhora = EEPROM.read(203); if (dhora == 255) dhora = 0;          //lê a hora do despertador
  dminuto = EEPROM.read(204); if (dminuto == 255) dminuto = 0;    //lê o minuto do despertador
  relat_num = lastEEP; ledados_relat();

  lcd.begin();
  lcd.setContrast(50); //Ajusta o contraste do display

  logo();     // Chama a tela de logo
  delay(200); digitalWrite(led,HIGH); delay(300);digitalWrite(led,LOW);
  
  pres = bmp.readPressure() / 100;
  temp = bmp.readTemperature();
  pres_max = pres; pres_min = pres;
  desp = 1;       //1=ativo, 0=false = mudar para eeprom
}

void loop() {
  sbot_monit = digitalRead(bot_monit);
  if (sbot_monit == HIGH) {
    func = 20;
    //disp_monit();
  }

  if (acerto_hora <= 0) gettime();   //a hora não está sendo alterada. Atualiza a hora
  if (desp == 1) checa_desp();       //despertador ativo. Está na hora ?
  letemp();
  if (smonit == 1) monit();

  key = keypad.getKey();
  if (key) {
    timeout = 0; timeout_val = 200;      // houve atividade, zera o timeout
    if (key == '1') {func = 1;}
    if (key == '2') {func = 2;}
    if (key == '3') {func = 3;}
    if (key == '4') {func = 4;}
    if (key == '5') {func = 5;}
    if (key == '6') {func = 6;}
    if (key == '7') {func = 7;}
    if (key == '8') {func = 8;}
    if (key == '9') {func = 9;}
    if (key == '0') {func = 10;}
  }
  if (func == 1) {disp_hora();relat_num = lastEEP;max_val = 0;acerto_desp = 0;}
  if (func == 2) {disp_desp();acerto_hora = 0;}
  if (func == 3) {disp_prev1();acerto_desp = 0;acerto_hora = 0;}
  if (func == 4) {disp_tempo_sono();acerto_desp = 0;acerto_hora = 0;}
  if (func == 5) {disp_qt_mov();acerto_desp = 0;acerto_hora = 0;}
  if (func == 6) {disp_temp_inerte();acerto_desp = 0;acerto_hora = 0;}
  if (func == 7) {relat_sono();acerto_desp = 0;acerto_hora = 0;}
  if (func == 8) {graf_sono();acerto_desp = 0;acerto_hora = 0;}
  if (func == 9) {disp_config();acerto_desp = 0;acerto_hora = 0;}
  if (func == 10) {logo();acerto_desp = 0;acerto_hora = 0;}
  if (func == 20) {disp_monit();acerto_desp = 0;acerto_hora = 0;}

  timeout = timeout + 1;
  if (timeout >= timeout_val) {     //tempo de inatividade, volta para tela principal
    if (smonit == 0) func = 1;
    if (smonit == 1) func = 20;
    timeout = 0;
  }

  //Botão liga ou desliga o led, após cerca de 10 minutos começa o fade out do led
  est_bot_luz = digitalRead(bot_luz);
  if (est_bot_luz == HIGH) {
    ligaluz(3);
  }
  else {
    cont3 = 0; //  Desativa contador do SQ
  }
  if (tempoluz > 0 && lights >= 1) {
    esmaece(); //Se tempoluz=0 não apaga, caso contrário, começa a esmaecer
  }

  if (acerto_hora == 0 && key == '*' && func != 7 && func != 9) ligaluz(0);

}

void disp_config(){
  timeout_val=2000;             //aumenta o timeout nessa tela
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setTextSize(1);lcd.setCursor(3,1); lcd.print("Configuracoes");lcd.setTextColor(BLACK);
  
  if (key == '*'){conf = conf + 1;cc2=0;cc3=0;}
  lcd.drawRect(0,10*conf,84,10,BLACK);

  lcd.setCursor(0,11);lcd.print("Tempo luz:");if (tempoluz == 0) {lcd.print("--");} else {lcd.print(tempoluz);}
  lcd.setCursor(0,21);lcd.print("Qtd.beeps:");lcd.print(desp_tipo);
  if (cc2 == 0){lcd.setCursor(0,31);lcd.print("DEL ult monit");}
  if (cc2 == 1){lcd.setCursor(0,31);lcd.print(" # Confirma  ");}
  if (cc2 == 2){
    for (i=20;i<=179;i=i+20){EEPROM.write(i+lastEEP,0);} 
    lastEEP = lastEEP -1; EEPROM.write(0,lastEEP);
    lcd.setCursor(0,31); lcd.print("Monit. APAGADA");lcd.display();delay(1500);cc2 = 0;}
  if (cc3 == 0){lcd.setCursor(0,41);lcd.print("Apagar memoria");}
  if (cc3 == 1){lcd.setCursor(0,41);lcd.print(" # Confirma  ");}
  if (cc3 == 2){
    lastEEP = 0; for (i=0;i<=255;i++){EEPROM.write(i,0);}
    lcd.setCursor(0,41); lcd.print("Memor APAGADA");lcd.display();delay(1500);cc3 = 0;}

  if (conf == 1 && key == '#'){tempoluz = tempoluz + 5; if (tempoluz >= 32) {tempoluz=0;} EEPROM.write(200,tempoluz);}
  if (conf == 2 && key == '#'){desp_tipo = desp_tipo + 1; if (desp_tipo > 10) {desp_tipo = 0;} EEPROM.write(202,desp_tipo);}
  if (conf == 3 && key == '#'){cc2 = cc2 + 1;}
  if (conf == 4 && key == '#'){cc3 = cc3 + 1;}
  if (conf >= 5) conf = 1;
  
  lcd.display();  
}

void disp_desp(){
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,84,26,2,BLACK);  //moldura da hora
  lcd.setTextSize(3);lcd.setCursor(4,2);  // posição da hora
  if (dhora <= 9) {lcd.print("0");lcd.print(dhora);}
  if (dhora >  9) {lcd.print(dhora);}
  lcd.setCursor(33,2);lcd.print(":");
  lcd.setCursor(44,2);    // posição do minuto
  if (dminuto <= 9) {lcd.print("0");lcd.print(dminuto);}
  if (dminuto >  9) {lcd.print(dminuto);}
  lcd.setTextSize(1);
  
  //acerto da hora do despertador
  if (key == '#') acerto_desp = acerto_desp + 1;
  if (acerto_desp == 1) {
    lcd.setCursor(0,30);lcd.print("* Muda HORA");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_desp == 2) {
    lcd.setCursor(0,30);lcd.print("* Muda MINUTO");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_desp == 3 & desp == 1) {
    lcd.setCursor(0,30);lcd.print("* ALARME Ligad");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_desp == 3 & desp == 0) {
    lcd.setCursor(0,30);lcd.print("* ALARME Deslg");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
if (acerto_desp == 4) {
    lcd.setCursor(0,30);
    if (desp == 1) {lcd.print("Despert.LIGADO");}
    if (desp == 0) {lcd.print("Despert. DELIG");}
    EEPROM.write(203,dhora);EEPROM.write(204,dminuto);EEPROM.write(201,desp);  //salva hora, minuto e situação do alarme
    lcd.display(); delay(2000); acerto_desp = 0;
  }
  if (acerto_desp == 1 & key == '*'){dhora = dhora + 1;if (dhora >= 24){dhora = 0;}}
  if (acerto_desp == 2 & key == '*'){dminuto = dminuto + 1;if (dminuto >= 60){dminuto = 0;}}
  if (acerto_desp == 3 & key == '*'){if (desp == 0){desp = 1;} else {desp = 0;}}
      
  if (acerto_desp == 0){disp_hora_peq(); disp_desp_peq();}   //hora não está sendo alterada. Mostra demais informações
  lcd.display();
}

void disp_hora(){
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,84,26,2,BLACK);  //moldura da hora
  lcd.setTextSize(3);lcd.setCursor(4,2);  // posição da hora
  if (hora <= 9) {lcd.print("0");lcd.print(hora);}
  if (hora >  9) {lcd.print(hora);}
  lcd.setCursor(33,2);
  cc5 = cc5 + 1;
  if (cc5 < 10) lcd.print(" ");
  if (cc5 > 10 && cc5 < 20){lcd.print(":");}
  if (cc5 > 20) cc5 = 0;
  lcd.setCursor(44,2);    // posição do minuto
  if (minuto <= 9) {lcd.print("0");lcd.print(minuto);}
  if (minuto >  9) {lcd.print(minuto);}
  lcd.setTextSize(1);
  
  //acerto da hora
  if (key == '#') acerto_hora = acerto_hora + 1;
  if (acerto_hora == 1) {
    lcd.setCursor(0,30);lcd.print("* Muda HORA");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_hora == 2) {
    lcd.setCursor(0,30);lcd.print("* Muda MINUTO");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_hora == 3) {
    lcd.setCursor(0,30);lcd.print("Hora alterada");
    rtc.setTime(hora, minuto, 00);
    lcd.display(); delay(1500); acerto_hora = 0;
  }
  if (acerto_hora == 1 & key == '*'){hora = hora + 1;if (hora >= 24){hora = 0;}}
  if (acerto_hora == 2 & key == '*'){minuto = minuto + 1;if (minuto >= 60){minuto = 0;}}
      
  if (acerto_hora == 0){disp_prev(); disp_temp_peq();}   //hora não está sendo alterada. Mostra demais informações
  lcd.display();
}

void disp_monit(){
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,84,26,2,BLACK);  //moldura da hora
  lcd.setTextSize(3);lcd.setCursor(4,2);  // posição da hora
  if (hora <= 9) {lcd.print("0");lcd.print(hora);}
  if (hora >  9) {lcd.print(hora);}
  lcd.setCursor(33,2);
  cc5 = cc5 + 1;
  if (cc5 < 20) lcd.print(" ");
  if (cc5 > 20 && cc5 < 40){lcd.print(":");}
  if (cc5 > 40) cc5 = 0;
  lcd.setCursor(44,2);    // posição do minuto
  if (minuto <= 9) {lcd.print("0");lcd.print(minuto);}
  if (minuto >  9) {lcd.print(minuto);}

  lcd.setTextSize(1);             
  if (sbot_monit == HIGH && smonit == 0 ){      // Monitoração iniciada  *********
    cc7 = 80;ligaluz(1);gettime();smonit = 1;sbot_monit = LOW;mov_cont = 0;
    tempo_sono_inic = hora * 60 + minuto;hora_pos = hora + 1;if (hora_pos == 24) hora_pos = 0;limpa_grafsono();
    lcd.setCursor(0,28);lcd.print("  Monitoracao");
    lcd.setCursor(0,38);lcd.print("   Iniciada");lcd.display(); delay(1500);}
  else if (sbot_monit == HIGH && smonit == 1 ){    // Monitaração terminada  **********
    ligaluz(1);smonit = 0; tempo_sono_final = hora * 60 + minuto;salva_monit();relat_num = lastEEP;func = 7;
    lcd.setCursor(0,28);lcd.print("  Monitoracao");
    lcd.setCursor(0,38);lcd.print("   Concluida"); lcd.display();delay(1500);}

  tempo_sono_parcial = hora * 60 + minuto;    
  if (tempo_sono_parcial < tempo_sono_inic) tempo_sono_parcial = tempo_sono_parcial + 1440;  //passou da meia noite, add 1 dia 
  hora_parcial = (tempo_sono_parcial - tempo_sono_inic) / 60;     
  minuto_parcial = (tempo_sono_parcial - tempo_sono_inic) - (hora_parcial * 60);
    
  lcd.fillRoundRect(0,25,36,23,1,BLACK);
  lcd.setCursor(1,30);lcd.setTextColor(WHITE);lcd.setTextSize(2);
  if (mov_cont <=9) {lcd.print(" ");}
  lcd.print(mov_cont);lcd.setTextSize(1);lcd.setTextColor(BLACK);
  lcd.drawRoundRect(35,25,49,23,1,BLACK);            //box
  lcd.setCursor(37,27);lcd.print("T.Sono");lcd.setCursor(37,37);
  cc8 = cc8 + 1;  if (cc8 <= 5){lcd.fillRoundRect(0,25,36,23,1,BLACK);} if (cc8 > 15 ) cc8 = 0;   //pisca qt de movimentos
  lcd.print(hora_parcial);lcd.print("h");if (minuto_parcial <=9 ){lcd.print("0");}lcd.print(minuto_parcial);
    if (desp == 1) lcd.drawBitmap(70,37,af,8,8,BLACK);
  lcd.display();
}

void disp_prev1(){
  letemp();
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,64,26,1,BLACK);  //moldura da hora
  for (i=1;i<=84;i=i+2){lcd.drawPixel(i,13,BLACK);}
  lcd.drawRoundRect(0,25,28,23,1,BLACK);
  lcd.drawRoundRect(27,25,28,23,1,BLACK);
  lcd.drawRoundRect(54,25,30,23,1,BLACK);
  lcd.setTextSize(1);
  lcd.setCursor(66,4);lcd.print("Sol");
  lcd.setCursor(66,15);lcd.print("Chu");
  lcd.setCursor(4,28);lcd.print("Max");lcd.setCursor(4,38);lcd.print(pres_max);
  lcd.setCursor(32,28);lcd.print("Min");lcd.setCursor(32,38);lcd.print(pres_min);
  lcd.setCursor(60,28);lcd.print("Atu"); lcd.setCursor(60,38);lcd.print(pres);
  
  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
  lcd.display();
}

void disp_qt_mov(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Movimentos");lcd.setTextColor(BLACK);
  int boxinit = -2;
  for (i=1;i<=20;i++){                     // captura o maior valor para referência no gráfico
    vatual = EEPROM.read(i+20); if (vatual == 255) {vatual = 0;}    
    if (vatual > max_val) {max_val = vatual;} }
  for (i=1;i<=20;i++){
    boxinit = boxinit + 4;
    int boxsize = map(EEPROM.read(i+20),0,max_val,0,34);      // 21 é a posição da memória dos movimentos
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display();
}

void disp_temp_inerte(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Tempo Inerte");lcd.setTextColor(BLACK);
  int boxinit = -2;
  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);}
  for (i=1;i<=20;i++){
    boxinit = boxinit + 4;
    int t = EEPROM.read(i+100)* 60 + EEPROM.read(i+120);     // 101 é a posição da memória do tempo inerte
    int boxsize = map(t,0,max_val,0,34);    // 480 é o máximo de 8 horas sem movimentos durante o sono
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display();  
}

void disp_tempo_sono(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Tempo Sono");lcd.setTextColor(BLACK);
  int boxinit = -2;
  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);}
  for (i=1;i<=20;i++){
    boxinit = boxinit + 4;
    int t = EEPROM.read(i+40)* 60 + EEPROM.read(i+60);      // 41 é a posição da memória do tempo de sono
    int boxsize = map(t,0,max_val,0,34);    // 960 é o máximo de 16 horas de sono
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display();
}

void graf_sono(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Grafico Sono");lcd.setTextColor(BLACK);
  int boxinit = -2;
  for (i=81;i<=100;i++){if (EEPROM.read(i) > max_val) max_val = EEPROM.read(i); }    //checa maior valor
  for (i=81;i<=100;i++){
    boxinit = boxinit + 4;
    int boxsize = map(EEPROM.read(i),0,max_val,0,34);
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display(); 
}

void letemp(){
  cc4 = cc4 + 1;
  temp_tot = temp_tot + bmp.readTemperature();
  if (cc4 >= 10) {cc4 = 0;temp = temp_tot / 10;temp_tot = 0;}     // média da temperatura das última 10 medições
  pres = bmp.readPressure()/100;
  if (pres > pres_max) pres_max = pres;
  if (pres < pres_min) pres_min = pres;
  if ((minuto==0||minuto==10||minuto==20||minuto==30||minuto==40||minuto==50) && minuto != minuto_ant1) {
    hpres_cont = hpres_cont + 1;
    if (hpres_cont >= 12){for (i=1;i<=11;i++){hpres[i]=hpres[i+1];} hpres[12]=pres; hpres_cont = 11;}
    hpres[hpres_cont] = pres;
    minuto_ant1 = minuto;
  }
}

void monit(){
   smov = digitalRead(mov);
   if (smov == HIGH) {
     c6 = c6 + 1;
     if (c6 >= 30) {                 // Opa! mexeu. 30 é o ajuste de movimentos
       mov_cont = mov_cont + 1;      // soma 1 movimento
       c6 = 0;                       
       if (tempo_mov_ant > 0){       // a primeira vez não calcula
         tempo_mov_atual = hora * 60 + minuto;        // captura tempo atual
         if (tempo_mov_atual < tempo_mov_ant) tempo_mov_atual = tempo_mov_atual + 1440;     //passou da meia noite
         tempo_sem_mov = tempo_mov_atual - tempo_mov_ant;
         if (tempo_sem_mov > tempo_sem_mov_max) {
           tempo_sem_mov_max = tempo_sem_mov;    // 
           hora_maior_mov = hora;
           minuto_maior_mov = minuto;
         }
       }
       tempo_mov_ant = (hora * 60) + minuto;
     }
   }     
   
   //captura quantidade de movimentos realizados em cada hora
   if (hora == hora_pos) {
     cc7 = cc7 + (1 && cc7 <= 100);
     mov_cont_atual = mov_cont - mov_cont_ant;
     EEPROM.write(cc7,mov_cont_atual);
     mov_cont_ant = mov_cont;
     hora_pos = hora_pos + 1; if (hora_pos == 24) hora_pos = 0;
   }
}

void relat_sono(){
  timeout_val=2000;             //aumenta o timeout nessa tela
  if (key == '7'){relat_num = lastEEP;}
  if (key == '*'){relat_num = relat_num - 1;if (relat_num <= 0){relat_num = lastEEP;}}
  if (key == '#'){relat_num = relat_num + 1;if (relat_num > lastEEP){relat_num = 1;}}
  
  ledados_relat();
  
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setTextSize(1);lcd.setCursor(1,1); lcd.print("Rel:SONO");lcd.setCursor(72,1);lcd.print(relat_num - lastEEP);
  lcd.setTextColor(BLACK);
  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]);
  lcd.setCursor(0,21);lcd.print("Qt.mov :");lcd.print(relat[3]);
  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]);
  lcd.setCursor(0,41);lcd.print("     As:");lcd.print(relat[6]);lcd.print(":");if (relat[7] <= 9 ){lcd.print("0");}lcd.print(relat[7]);
  lcd.display();
}

void salva_monit(){
  lastEEP = lastEEP + 1;
  if (lastEEP >= 20){    // número máximo atingido
    for (i=21;i<40;i++)  {EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=41;i<60;i++)  {EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=61;i<80;i++)  {EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=101;i<120;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=121;i<140;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=141;i<160;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=161;i<180;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=181;i<200;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    lastEEP = 20;         // mantém última posição como 20
  }

  if (tempo_sono_final <= tempo_sono_inic) tempo_sono_final = tempo_sono_final + 1440;  //passou da meia noite, add 1 dia 
  hora_tot = (tempo_sono_final - tempo_sono_inic) / 60;     
  minuto_tot = (tempo_sono_final - tempo_sono_inic) - (hora_tot * 60);
  if (hora_tot >= 24) hora_tot = 0;
  tempo_mov_max_h = tempo_sem_mov_max / 60;                       // Maior quantidade de tempo sem movimento (horas)
  tempo_mov_max_m = tempo_sem_mov_max - (tempo_mov_max_h * 60);   // Maior qt de tempo sem movimento (minutos)
  //Salva posições atuais
  EEPROM.write(0,lastEEP);             
  EEPROM.write(lastEEP+20,mov_cont);
  EEPROM.write(lastEEP+40,hora_tot);
  EEPROM.write(lastEEP+60,minuto_tot);
  EEPROM.write(lastEEP+100,tempo_mov_max_h);
  EEPROM.write(lastEEP+120,tempo_mov_max_m);
  EEPROM.write(lastEEP+140,hora_maior_mov);
  EEPROM.write(lastEEP+160,minuto_maior_mov);

}

void checa_desp(){
  if (hora == dhora & minuto == dminuto & minuto_ant != minuto) {
    digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100);
    digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100);
    digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100);
    lights = 1;digitalWrite(led,HIGH);
    if (desp_tipo > 0){for (i=1;i<=desp_tipo;i++){digitalWrite(buzz, HIGH);delay(40);digitalWrite(buzz, LOW);delay(400);}}
  }
  minuto_ant = minuto;
}

void disp_desp_peq(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(35,25,49,23,1,BLACK);            //box
  lcd.setCursor(37,27);lcd.print("Despert");lcd.setCursor(37,37);sdesp();
}

void disp_hora_peq(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(0,25,36,23,1,BLACK);            //boxes
  lcd.setCursor(2,27);lcd.print("Hora");lcd.setCursor(2,37);shora();
}

void disp_prev(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(0,25,36,23,1,BLACK);
  lcd.fillRoundRect(1,36,35,9,1,BLACK);
  lcd.setCursor(2,27);lcd.print("Prev");lcd.setTextColor(WHITE);lcd.setCursor(2,37);
  if (pres < 930){ lcd.print("CHUVA");} else {lcd.print(" SOL");}    // 930 é um intermediário para SP
  lcd.setTextColor(BLACK);
}

void gettime(){
  lcd.setTextColor(BLACK);
  t = rtc.getTime();
  hora = t.hour; minuto = t.min;
}

void sdesp(){
  if (desp == 1){    //se alarme está ativo
    if (dhora <= 9) {lcd.print("0");} lcd.print(dhora);lcd.print(":");
    if (dminuto <= 9) {lcd.print("0");} lcd.print(dminuto);  
    lcd.drawBitmap(70,37,af,8,8,BLACK);
  }
  if (desp == 0){lcd.print("--:--");}
}

void shora(){
  if (hora <= 9) {lcd.print("0");} lcd.print(hora);lcd.print(":");
  if (minuto <= 9) {lcd.print("0");} lcd.print(minuto);  
}

void disp_temp_peq(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(35,25,33,23,1,BLACK);lcd.drawRoundRect(67,25,17,23,1,BLACK);            //boxes
  lcd.setCursor(37,27);lcd.print("Temp");lcd.setCursor(37,37);lcd.print(temp,1);lcd.drawBitmap(58,37,gr,8,4,BLACK);
  //lcd.setCursor(70,27);lcd.print("D.");
  if (desp == 1)lcd.drawBitmap(70,37,af,8,8,BLACK);    //se alarme está ativo
}

void ligaluz(int tipo_luz){
  if (tipo_luz == 0){        // acende ou apaga somente o led do lcd
    cc = -cc;;
    if (cc == -1){lights = 1;digitalWrite(led, HIGH);sluz = 1;}
    else {lights = 0;digitalWrite(led, LOW);sluz = 0;}
    cont = 0;
  }
  if (tipo_luz == 3){         // acende ou apaga o led do lcd e a luz
    cc = -cc;
    if (cc == -1){lights = 1;digitalWrite(luz, HIGH);digitalWrite(led, HIGH);sluz = 3;}
    else {lights = 0;digitalWrite(luz, LOW);digitalWrite(led, LOW);sluz = 0;}
    cont = 0;
  }
  if (tipo_luz == 1){lights = 1;digitalWrite(led, HIGH);}
  if (tipo_luz == 2){lights = 0;digitalWrite(led, LOW);}
  delay(100);
}

void esmaece(){
  if (lights == 1) {cont = cont + 1;}
  if (cont >= 750 * tempoluz){             //tempo luz começa a esmaecer
    for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
      analogWrite(led, fadeValue);
      if (sluz = 0) analogWrite(led, fadeValue);
      if (sluz = 3) analogWrite(luz, fadeValue);
      delay(80);
    }
    lights = 0; cont = 0;
  }
}

void ledados_relat(){
  relat[1] = EEPROM.read(40+relat_num);       // horas total
  relat[2] = EEPROM.read(60+relat_num);       // minutos total
  relat[3] = EEPROM.read(20+relat_num);       // qt de movimentos
  relat[4] = EEPROM.read(100+relat_num);      // horas tempo inerte
  relat[5] = EEPROM.read(120+relat_num);      // minutos tempo inerte
  relat[6] = EEPROM.read(140+relat_num);      // que horas foi
  relat[7] = EEPROM.read(160+relat_num);      // que minutos foi
}

void limpa_grafsono(){
  for (i=81;i<=100;i++){EEPROM.write(i,0);}
}

void logo(){
  lcd.clearDisplay();
  lcd.setCursor(2, 2); lcd.print("Sleep Quality");
  lcd.setTextSize(3); lcd.setTextColor(WHITE);
  for (i=-10;i<=20;i++){
    lcd.fillRoundRect(16, 16, 58, 28, 2, BLACK);
    lcd.drawRect(0, 0, 84, 48, BLACK);
    lcd.setCursor(i, 20); lcd.print("VSL");lcd.display();delay(20);
  }
  delay(300);func = 1;  // sai do logo
  lcd.setTextSize(1); lcd.display();
}
Code for Sleep Quality Monitor VLSArduino
Complete code for Sleep Quality Monitor VLS
// Sleep Quality Monitor VSL - Monitor da qualidade do sono
// Charles - August/2016 - Version 3 - Jumbo
#include <Keypad.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>    // Sensor de pressão atmosférica e temperatura
Adafruit_BMP085 bmp; //Vcc=3.3V, UNO: SCL=A5, SDA=A4 MEGA: SCL=21, SDA=20
#include <EEPROM.h>
#include <DS1307.h>     // rtc
DS1307 rtc(A2, A3);  //RTC A2=CLK A3=SDA VCC=5V
#include <Adafruit_GFX.h>          // para LCD Nokia
#include <Adafruit_PCD8544.h>      // para LCD Nokia
#include <Keypad.h>
Adafruit_PCD8544 lcd = Adafruit_PCD8544(13, 12, 11, 10, 9); //CLK DIN DC CE RST  

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'},
};

byte rowPins[ROWS] = {A10, A11, A12, A13}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {26, 24, 28}; //connect to the column pinouts of the keypad
char key;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int 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;
int tempoluz,vatual,tempo_sem_mov,tempo_mov_ant, tempo_sem_mov_max, hora_tot, minuto_tot,temp_tot;
int timeout,timeout_val=150, hora_maior_mov, minuto_maior_mov, tempo_mov_atual, tempo_mov_max_h, tempo_mov_max_m;
int func=1,pres,dhora, dminuto, acerto_hora, acerto_desp, desp=0, minuto_ant, minuto_ant1, mov=A0, smov, c6, pres_max, pres_min;
int hpres_cont, hpres[13], smonit=0, tempo_sono, tempo_sono_inic, tempo_sono_final, hora_pos, cc7=80, h[20], mov_cont_ant;
int tempo_sono_parcial, hora_parcial, minuto_parcial, conf=1, desp_tipo, relat[7], relat_num, max_val,mov_cont_atual,luz=4,sluz;
unsigned int cont, umid, cont2, cont3;
float temp, temp_ant;
String sono_tipo="Sleep Ql", sp;
Time t;
const unsigned char PROGMEM af[] = {B00001, B00011, B00101, B11001, B11001, B00101, B00011, B00001}; //auto falante
const unsigned char PROGMEM gr[] = {B00100, B01010, B01010, B00100}; //grau

void setup() {
  //Serial.begin(9600);
  //rtc.halt(false);
  //rtc.setDOW(FRIDAY);      //Remover as linhas após a primeira execução
  //rtc.setTime(06, 30, 00);
  //rtc.setDate(19, 8, 2016);   //Define o dia, mes e ano
  //rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
  bmp.begin();
  //   Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  //  while (1) {}
  // }
  digitalWrite(buzz, HIGH); delay(40); digitalWrite(buzz, LOW);
  delay(100);
  pinMode(led, OUTPUT);
  pinMode(luz, OUTPUT);
  pinMode(mov, INPUT);
  pinMode(bot_luz, INPUT);
  pinMode(bot_monit, INPUT);
  pinMode(buzz, OUTPUT);

  lastEEP = EEPROM.read(0); if (lastEEP == 255) lastEEP = 0;      //lê a última qt de medição na posição 0
  tempoluz = EEPROM.read(200); if (tempoluz == 255) tempoluz = 0; //lê o tempo de luz acesa
  desp = EEPROM.read(201); if (desp == 255) desp = 0;             //0=despertador desligado, 1=despertador ativo
  desp_tipo = EEPROM.read(202); if (desp_tipo == 255) desp_tipo = 0; //0=despertador desligado, 1=despertador ativo
  dhora = EEPROM.read(203); if (dhora == 255) dhora = 0;          //lê a hora do despertador
  dminuto = EEPROM.read(204); if (dminuto == 255) dminuto = 0;    //lê o minuto do despertador
  relat_num = lastEEP; ledados_relat();

  lcd.begin();
  lcd.setContrast(50); //Ajusta o contraste do display

  logo();     // Chama a tela de logo
  delay(200); digitalWrite(led,HIGH); delay(300);digitalWrite(led,LOW);
  
  pres = bmp.readPressure() / 100;
  temp = bmp.readTemperature();
  pres_max = pres; pres_min = pres;
  desp = 1;       //1=ativo, 0=false = mudar para eeprom
}

void loop() {
  sbot_monit = digitalRead(bot_monit);
  if (sbot_monit == HIGH) {
    func = 20;
    //disp_monit();
  }

  if (acerto_hora <= 0) gettime();   //a hora não está sendo alterada. Atualiza a hora
  if (desp == 1) checa_desp();       //despertador ativo. Está na hora ?
  letemp();
  if (smonit == 1) monit();

  key = keypad.getKey();
  if (key) {
    timeout = 0; timeout_val = 200;      // houve atividade, zera o timeout
    if (key == '1') {func = 1;}
    if (key == '2') {func = 2;}
    if (key == '3') {func = 3;}
    if (key == '4') {func = 4;}
    if (key == '5') {func = 5;}
    if (key == '6') {func = 6;}
    if (key == '7') {func = 7;}
    if (key == '8') {func = 8;}
    if (key == '9') {func = 9;}
    if (key == '0') {func = 10;}
  }
  if (func == 1) {disp_hora();relat_num = lastEEP;max_val = 0;acerto_desp = 0;}
  if (func == 2) {disp_desp();acerto_hora = 0;}
  if (func == 3) {disp_prev1();acerto_desp = 0;acerto_hora = 0;}
  if (func == 4) {disp_tempo_sono();acerto_desp = 0;acerto_hora = 0;}
  if (func == 5) {disp_qt_mov();acerto_desp = 0;acerto_hora = 0;}
  if (func == 6) {disp_temp_inerte();acerto_desp = 0;acerto_hora = 0;}
  if (func == 7) {relat_sono();acerto_desp = 0;acerto_hora = 0;}
  if (func == 8) {graf_sono();acerto_desp = 0;acerto_hora = 0;}
  if (func == 9) {disp_config();acerto_desp = 0;acerto_hora = 0;}
  if (func == 10) {logo();acerto_desp = 0;acerto_hora = 0;}
  if (func == 20) {disp_monit();acerto_desp = 0;acerto_hora = 0;}

  timeout = timeout + 1;
  if (timeout >= timeout_val) {     //tempo de inatividade, volta para tela principal
    if (smonit == 0) func = 1;
    if (smonit == 1) func = 20;
    timeout = 0;
  }

  //Botão liga ou desliga o led, após cerca de 10 minutos começa o fade out do led
  est_bot_luz = digitalRead(bot_luz);
  if (est_bot_luz == HIGH) {
    ligaluz(3);
  }
  else {
    cont3 = 0; //  Desativa contador do SQ
  }
  if (tempoluz > 0 && lights >= 1) {
    esmaece(); //Se tempoluz=0 não apaga, caso contrário, começa a esmaecer
  }

  if (acerto_hora == 0 && key == '*' && func != 7 && func != 9) ligaluz(0);

}

void disp_config(){
  timeout_val=2000;             //aumenta o timeout nessa tela
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setTextSize(1);lcd.setCursor(3,1); lcd.print("Configuracoes");lcd.setTextColor(BLACK);
  
  if (key == '*'){conf = conf + 1;cc2=0;cc3=0;}
  lcd.drawRect(0,10*conf,84,10,BLACK);

  lcd.setCursor(0,11);lcd.print("Tempo luz:");if (tempoluz == 0) {lcd.print("--");} else {lcd.print(tempoluz);}
  lcd.setCursor(0,21);lcd.print("Qtd.beeps:");lcd.print(desp_tipo);
  if (cc2 == 0){lcd.setCursor(0,31);lcd.print("DEL ult monit");}
  if (cc2 == 1){lcd.setCursor(0,31);lcd.print(" # Confirma  ");}
  if (cc2 == 2){
    for (i=20;i<=179;i=i+20){EEPROM.write(i+lastEEP,0);} 
    lastEEP = lastEEP -1; EEPROM.write(0,lastEEP);
    lcd.setCursor(0,31); lcd.print("Monit. APAGADA");lcd.display();delay(1500);cc2 = 0;}
  if (cc3 == 0){lcd.setCursor(0,41);lcd.print("Apagar memoria");}
  if (cc3 == 1){lcd.setCursor(0,41);lcd.print(" # Confirma  ");}
  if (cc3 == 2){
    lastEEP = 0; for (i=0;i<=255;i++){EEPROM.write(i,0);}
    lcd.setCursor(0,41); lcd.print("Memor APAGADA");lcd.display();delay(1500);cc3 = 0;}

  if (conf == 1 && key == '#'){tempoluz = tempoluz + 5; if (tempoluz >= 32) {tempoluz=0;} EEPROM.write(200,tempoluz);}
  if (conf == 2 && key == '#'){desp_tipo = desp_tipo + 1; if (desp_tipo > 10) {desp_tipo = 0;} EEPROM.write(202,desp_tipo);}
  if (conf == 3 && key == '#'){cc2 = cc2 + 1;}
  if (conf == 4 && key == '#'){cc3 = cc3 + 1;}
  if (conf >= 5) conf = 1;
  
  lcd.display();  
}

void disp_desp(){
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,84,26,2,BLACK);  //moldura da hora
  lcd.setTextSize(3);lcd.setCursor(4,2);  // posição da hora
  if (dhora <= 9) {lcd.print("0");lcd.print(dhora);}
  if (dhora >  9) {lcd.print(dhora);}
  lcd.setCursor(33,2);lcd.print(":");
  lcd.setCursor(44,2);    // posição do minuto
  if (dminuto <= 9) {lcd.print("0");lcd.print(dminuto);}
  if (dminuto >  9) {lcd.print(dminuto);}
  lcd.setTextSize(1);
  
  //acerto da hora do despertador
  if (key == '#') acerto_desp = acerto_desp + 1;
  if (acerto_desp == 1) {
    lcd.setCursor(0,30);lcd.print("* Muda HORA");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_desp == 2) {
    lcd.setCursor(0,30);lcd.print("* Muda MINUTO");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_desp == 3 & desp == 1) {
    lcd.setCursor(0,30);lcd.print("* ALARME Ligad");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_desp == 3 & desp == 0) {
    lcd.setCursor(0,30);lcd.print("* ALARME Deslg");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
if (acerto_desp == 4) {
    lcd.setCursor(0,30);
    if (desp == 1) {lcd.print("Despert.LIGADO");}
    if (desp == 0) {lcd.print("Despert. DELIG");}
    EEPROM.write(203,dhora);EEPROM.write(204,dminuto);EEPROM.write(201,desp);  //salva hora, minuto e situação do alarme
    lcd.display(); delay(2000); acerto_desp = 0;
  }
  if (acerto_desp == 1 & key == '*'){dhora = dhora + 1;if (dhora >= 24){dhora = 0;}}
  if (acerto_desp == 2 & key == '*'){dminuto = dminuto + 1;if (dminuto >= 60){dminuto = 0;}}
  if (acerto_desp == 3 & key == '*'){if (desp == 0){desp = 1;} else {desp = 0;}}
      
  if (acerto_desp == 0){disp_hora_peq(); disp_desp_peq();}   //hora não está sendo alterada. Mostra demais informações
  lcd.display();
}

void disp_hora(){
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,84,26,2,BLACK);  //moldura da hora
  lcd.setTextSize(3);lcd.setCursor(4,2);  // posição da hora
  if (hora <= 9) {lcd.print("0");lcd.print(hora);}
  if (hora >  9) {lcd.print(hora);}
  lcd.setCursor(33,2);
  cc5 = cc5 + 1;
  if (cc5 < 10) lcd.print(" ");
  if (cc5 > 10 && cc5 < 20){lcd.print(":");}
  if (cc5 > 20) cc5 = 0;
  lcd.setCursor(44,2);    // posição do minuto
  if (minuto <= 9) {lcd.print("0");lcd.print(minuto);}
  if (minuto >  9) {lcd.print(minuto);}
  lcd.setTextSize(1);
  
  //acerto da hora
  if (key == '#') acerto_hora = acerto_hora + 1;
  if (acerto_hora == 1) {
    lcd.setCursor(0,30);lcd.print("* Muda HORA");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_hora == 2) {
    lcd.setCursor(0,30);lcd.print("* Muda MINUTO");
    lcd.setCursor(0,40);lcd.print("# Confirma");
  }
  if (acerto_hora == 3) {
    lcd.setCursor(0,30);lcd.print("Hora alterada");
    rtc.setTime(hora, minuto, 00);
    lcd.display(); delay(1500); acerto_hora = 0;
  }
  if (acerto_hora == 1 & key == '*'){hora = hora + 1;if (hora >= 24){hora = 0;}}
  if (acerto_hora == 2 & key == '*'){minuto = minuto + 1;if (minuto >= 60){minuto = 0;}}
      
  if (acerto_hora == 0){disp_prev(); disp_temp_peq();}   //hora não está sendo alterada. Mostra demais informações
  lcd.display();
}

void disp_monit(){
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,84,26,2,BLACK);  //moldura da hora
  lcd.setTextSize(3);lcd.setCursor(4,2);  // posição da hora
  if (hora <= 9) {lcd.print("0");lcd.print(hora);}
  if (hora >  9) {lcd.print(hora);}
  lcd.setCursor(33,2);
  cc5 = cc5 + 1;
  if (cc5 < 20) lcd.print(" ");
  if (cc5 > 20 && cc5 < 40){lcd.print(":");}
  if (cc5 > 40) cc5 = 0;
  lcd.setCursor(44,2);    // posição do minuto
  if (minuto <= 9) {lcd.print("0");lcd.print(minuto);}
  if (minuto >  9) {lcd.print(minuto);}

  lcd.setTextSize(1);             
  if (sbot_monit == HIGH && smonit == 0 ){      // Monitoração iniciada  *********
    cc7 = 80;ligaluz(1);gettime();smonit = 1;sbot_monit = LOW;mov_cont = 0;
    tempo_sono_inic = hora * 60 + minuto;hora_pos = hora + 1;if (hora_pos == 24) hora_pos = 0;limpa_grafsono();
    lcd.setCursor(0,28);lcd.print("  Monitoracao");
    lcd.setCursor(0,38);lcd.print("   Iniciada");lcd.display(); delay(1500);}
  else if (sbot_monit == HIGH && smonit == 1 ){    // Monitaração terminada  **********
    ligaluz(1);smonit = 0; tempo_sono_final = hora * 60 + minuto;salva_monit();relat_num = lastEEP;func = 7;
    lcd.setCursor(0,28);lcd.print("  Monitoracao");
    lcd.setCursor(0,38);lcd.print("   Concluida"); lcd.display();delay(1500);}

  tempo_sono_parcial = hora * 60 + minuto;    
  if (tempo_sono_parcial < tempo_sono_inic) tempo_sono_parcial = tempo_sono_parcial + 1440;  //passou da meia noite, add 1 dia 
  hora_parcial = (tempo_sono_parcial - tempo_sono_inic) / 60;     
  minuto_parcial = (tempo_sono_parcial - tempo_sono_inic) - (hora_parcial * 60);
    
  lcd.fillRoundRect(0,25,36,23,1,BLACK);
  lcd.setCursor(1,30);lcd.setTextColor(WHITE);lcd.setTextSize(2);
  if (mov_cont <=9) {lcd.print(" ");}
  lcd.print(mov_cont);lcd.setTextSize(1);lcd.setTextColor(BLACK);
  lcd.drawRoundRect(35,25,49,23,1,BLACK);            //box
  lcd.setCursor(37,27);lcd.print("T.Sono");lcd.setCursor(37,37);
  cc8 = cc8 + 1;  if (cc8 <= 5){lcd.fillRoundRect(0,25,36,23,1,BLACK);} if (cc8 > 15 ) cc8 = 0;   //pisca qt de movimentos
  lcd.print(hora_parcial);lcd.print("h");if (minuto_parcial <=9 ){lcd.print("0");}lcd.print(minuto_parcial);
    if (desp == 1) lcd.drawBitmap(70,37,af,8,8,BLACK);
  lcd.display();
}

void disp_prev1(){
  letemp();
  lcd.clearDisplay();lcd.setTextColor(BLACK);
  lcd.drawRoundRect(0,0,64,26,1,BLACK);  //moldura da hora
  for (i=1;i<=84;i=i+2){lcd.drawPixel(i,13,BLACK);}
  lcd.drawRoundRect(0,25,28,23,1,BLACK);
  lcd.drawRoundRect(27,25,28,23,1,BLACK);
  lcd.drawRoundRect(54,25,30,23,1,BLACK);
  lcd.setTextSize(1);
  lcd.setCursor(66,4);lcd.print("Sol");
  lcd.setCursor(66,15);lcd.print("Chu");
  lcd.setCursor(4,28);lcd.print("Max");lcd.setCursor(4,38);lcd.print(pres_max);
  lcd.setCursor(32,28);lcd.print("Min");lcd.setCursor(32,38);lcd.print(pres_min);
  lcd.setCursor(60,28);lcd.print("Atu"); lcd.setCursor(60,38);lcd.print(pres);
  
  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
  lcd.display();
}

void disp_qt_mov(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Movimentos");lcd.setTextColor(BLACK);
  int boxinit = -2;
  for (i=1;i<=20;i++){                     // captura o maior valor para referência no gráfico
    vatual = EEPROM.read(i+20); if (vatual == 255) {vatual = 0;}    
    if (vatual > max_val) {max_val = vatual;} }
  for (i=1;i<=20;i++){
    boxinit = boxinit + 4;
    int boxsize = map(EEPROM.read(i+20),0,max_val,0,34);      // 21 é a posição da memória dos movimentos
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display();
}

void disp_temp_inerte(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Tempo Inerte");lcd.setTextColor(BLACK);
  int boxinit = -2;
  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);}
  for (i=1;i<=20;i++){
    boxinit = boxinit + 4;
    int t = EEPROM.read(i+100)* 60 + EEPROM.read(i+120);     // 101 é a posição da memória do tempo inerte
    int boxsize = map(t,0,max_val,0,34);    // 480 é o máximo de 8 horas sem movimentos durante o sono
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display();  
}

void disp_tempo_sono(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Tempo Sono");lcd.setTextColor(BLACK);
  int boxinit = -2;
  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);}
  for (i=1;i<=20;i++){
    boxinit = boxinit + 4;
    int t = EEPROM.read(i+40)* 60 + EEPROM.read(i+60);      // 41 é a posição da memória do tempo de sono
    int boxsize = map(t,0,max_val,0,34);    // 960 é o máximo de 16 horas de sono
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display();
}

void graf_sono(){
  timeout_val = 2000;      // Aumenta o timeout nesta tela
  max_val = 0;
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setCursor(1,1);lcd.print("Grafico Sono");lcd.setTextColor(BLACK);
  int boxinit = -2;
  for (i=81;i<=100;i++){if (EEPROM.read(i) > max_val) max_val = EEPROM.read(i); }    //checa maior valor
  for (i=81;i<=100;i++){
    boxinit = boxinit + 4;
    int boxsize = map(EEPROM.read(i),0,max_val,0,34);
    lcd.fillRect(boxinit,48-boxsize,3,boxsize,BLACK);
  }
  lcd.display(); 
}

void letemp(){
  cc4 = cc4 + 1;
  temp_tot = temp_tot + bmp.readTemperature();
  if (cc4 >= 10) {cc4 = 0;temp = temp_tot / 10;temp_tot = 0;}     // média da temperatura das última 10 medições
  pres = bmp.readPressure()/100;
  if (pres > pres_max) pres_max = pres;
  if (pres < pres_min) pres_min = pres;
  if ((minuto==0||minuto==10||minuto==20||minuto==30||minuto==40||minuto==50) && minuto != minuto_ant1) {
    hpres_cont = hpres_cont + 1;
    if (hpres_cont >= 12){for (i=1;i<=11;i++){hpres[i]=hpres[i+1];} hpres[12]=pres; hpres_cont = 11;}
    hpres[hpres_cont] = pres;
    minuto_ant1 = minuto;
  }
}

void monit(){
   smov = digitalRead(mov);
   if (smov == HIGH) {
     c6 = c6 + 1;
     if (c6 >= 30) {                 // Opa! mexeu. 30 é o ajuste de movimentos
       mov_cont = mov_cont + 1;      // soma 1 movimento
       c6 = 0;                       
       if (tempo_mov_ant > 0){       // a primeira vez não calcula
         tempo_mov_atual = hora * 60 + minuto;        // captura tempo atual
         if (tempo_mov_atual < tempo_mov_ant) tempo_mov_atual = tempo_mov_atual + 1440;     //passou da meia noite
         tempo_sem_mov = tempo_mov_atual - tempo_mov_ant;
         if (tempo_sem_mov > tempo_sem_mov_max) {
           tempo_sem_mov_max = tempo_sem_mov;    // 
           hora_maior_mov = hora;
           minuto_maior_mov = minuto;
         }
       }
       tempo_mov_ant = (hora * 60) + minuto;
     }
   }     
   
   //captura quantidade de movimentos realizados em cada hora
   if (hora == hora_pos) {
     cc7 = cc7 + (1 && cc7 <= 100);
     mov_cont_atual = mov_cont - mov_cont_ant;
     EEPROM.write(cc7,mov_cont_atual);
     mov_cont_ant = mov_cont;
     hora_pos = hora_pos + 1; if (hora_pos == 24) hora_pos = 0;
   }
}

void relat_sono(){
  timeout_val=2000;             //aumenta o timeout nessa tela
  if (key == '7'){relat_num = lastEEP;}
  if (key == '*'){relat_num = relat_num - 1;if (relat_num <= 0){relat_num = lastEEP;}}
  if (key == '#'){relat_num = relat_num + 1;if (relat_num > lastEEP){relat_num = 1;}}
  
  ledados_relat();
  
  lcd.clearDisplay();lcd.setTextColor(WHITE);lcd.fillRect(0,0,84,10,BLACK);
  lcd.setTextSize(1);lcd.setCursor(1,1); lcd.print("Rel:SONO");lcd.setCursor(72,1);lcd.print(relat_num - lastEEP);
  lcd.setTextColor(BLACK);
  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]);
  lcd.setCursor(0,21);lcd.print("Qt.mov :");lcd.print(relat[3]);
  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]);
  lcd.setCursor(0,41);lcd.print("     As:");lcd.print(relat[6]);lcd.print(":");if (relat[7] <= 9 ){lcd.print("0");}lcd.print(relat[7]);
  lcd.display();
}

void salva_monit(){
  lastEEP = lastEEP + 1;
  if (lastEEP >= 20){    // número máximo atingido
    for (i=21;i<40;i++)  {EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=41;i<60;i++)  {EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=61;i<80;i++)  {EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=101;i<120;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=121;i<140;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=141;i<160;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=161;i<180;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    for (i=181;i<200;i++){EEPROM.write(i,EEPROM.read(i+1));}   //move cada atividade para posição anterior
    lastEEP = 20;         // mantém última posição como 20
  }

  if (tempo_sono_final <= tempo_sono_inic) tempo_sono_final = tempo_sono_final + 1440;  //passou da meia noite, add 1 dia 
  hora_tot = (tempo_sono_final - tempo_sono_inic) / 60;     
  minuto_tot = (tempo_sono_final - tempo_sono_inic) - (hora_tot * 60);
  if (hora_tot >= 24) hora_tot = 0;
  tempo_mov_max_h = tempo_sem_mov_max / 60;                       // Maior quantidade de tempo sem movimento (horas)
  tempo_mov_max_m = tempo_sem_mov_max - (tempo_mov_max_h * 60);   // Maior qt de tempo sem movimento (minutos)
  //Salva posições atuais
  EEPROM.write(0,lastEEP);             
  EEPROM.write(lastEEP+20,mov_cont);
  EEPROM.write(lastEEP+40,hora_tot);
  EEPROM.write(lastEEP+60,minuto_tot);
  EEPROM.write(lastEEP+100,tempo_mov_max_h);
  EEPROM.write(lastEEP+120,tempo_mov_max_m);
  EEPROM.write(lastEEP+140,hora_maior_mov);
  EEPROM.write(lastEEP+160,minuto_maior_mov);

}

void checa_desp(){
  if (hora == dhora & minuto == dminuto & minuto_ant != minuto) {
    digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100);
    digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100);
    digitalWrite(led,HIGH);delay(500);digitalWrite(led,LOW);delay(100);
    lights = 1;digitalWrite(led,HIGH);
    if (desp_tipo > 0){for (i=1;i<=desp_tipo;i++){digitalWrite(buzz, HIGH);delay(40);digitalWrite(buzz, LOW);delay(400);}}
  }
  minuto_ant = minuto;
}

void disp_desp_peq(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(35,25,49,23,1,BLACK);            //box
  lcd.setCursor(37,27);lcd.print("Despert");lcd.setCursor(37,37);sdesp();
}

void disp_hora_peq(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(0,25,36,23,1,BLACK);            //boxes
  lcd.setCursor(2,27);lcd.print("Hora");lcd.setCursor(2,37);shora();
}

void disp_prev(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(0,25,36,23,1,BLACK);
  lcd.fillRoundRect(1,36,35,9,1,BLACK);
  lcd.setCursor(2,27);lcd.print("Prev");lcd.setTextColor(WHITE);lcd.setCursor(2,37);
  if (pres < 930){ lcd.print("CHUVA");} else {lcd.print(" SOL");}    // 930 é um intermediário para SP
  lcd.setTextColor(BLACK);
}

void gettime(){
  lcd.setTextColor(BLACK);
  t = rtc.getTime();
  hora = t.hour; minuto = t.min;
}

void sdesp(){
  if (desp == 1){    //se alarme está ativo
    if (dhora <= 9) {lcd.print("0");} lcd.print(dhora);lcd.print(":");
    if (dminuto <= 9) {lcd.print("0");} lcd.print(dminuto);  
    lcd.drawBitmap(70,37,af,8,8,BLACK);
  }
  if (desp == 0){lcd.print("--:--");}
}

void shora(){
  if (hora <= 9) {lcd.print("0");} lcd.print(hora);lcd.print(":");
  if (minuto <= 9) {lcd.print("0");} lcd.print(minuto);  
}

void disp_temp_peq(){
  lcd.setTextSize(1);             
  lcd.drawRoundRect(35,25,33,23,1,BLACK);lcd.drawRoundRect(67,25,17,23,1,BLACK);            //boxes
  lcd.setCursor(37,27);lcd.print("Temp");lcd.setCursor(37,37);lcd.print(temp,1);lcd.drawBitmap(58,37,gr,8,4,BLACK);
  //lcd.setCursor(70,27);lcd.print("D.");
  if (desp == 1)lcd.drawBitmap(70,37,af,8,8,BLACK);    //se alarme está ativo
}

void ligaluz(int tipo_luz){
  if (tipo_luz == 0){        // acende ou apaga somente o led do lcd
    cc = -cc;;
    if (cc == -1){lights = 1;digitalWrite(led, HIGH);sluz = 1;}
    else {lights = 0;digitalWrite(led, LOW);sluz = 0;}
    cont = 0;
  }
  if (tipo_luz == 3){         // acende ou apaga o led do lcd e a luz
    cc = -cc;
    if (cc == -1){lights = 1;digitalWrite(luz, HIGH);digitalWrite(led, HIGH);sluz = 3;}
    else {lights = 0;digitalWrite(luz, LOW);digitalWrite(led, LOW);sluz = 0;}
    cont = 0;
  }
  if (tipo_luz == 1){lights = 1;digitalWrite(led, HIGH);}
  if (tipo_luz == 2){lights = 0;digitalWrite(led, LOW);}
  delay(100);
}

void esmaece(){
  if (lights == 1) {cont = cont + 1;}
  if (cont >= 750 * tempoluz){             //tempo luz começa a esmaecer
    for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
      analogWrite(led, fadeValue);
      if (sluz = 0) analogWrite(led, fadeValue);
      if (sluz = 3) analogWrite(luz, fadeValue);
      delay(80);
    }
    lights = 0; cont = 0;
  }
}

void ledados_relat(){
  relat[1] = EEPROM.read(40+relat_num);       // horas total
  relat[2] = EEPROM.read(60+relat_num);       // minutos total
  relat[3] = EEPROM.read(20+relat_num);       // qt de movimentos
  relat[4] = EEPROM.read(100+relat_num);      // horas tempo inerte
  relat[5] = EEPROM.read(120+relat_num);      // minutos tempo inerte
  relat[6] = EEPROM.read(140+relat_num);      // que horas foi
  relat[7] = EEPROM.read(160+relat_num);      // que minutos foi
}

void limpa_grafsono(){
  for (i=81;i<=100;i++){EEPROM.write(i,0);}
}

void logo(){
  lcd.clearDisplay();
  lcd.setCursor(2, 2); lcd.print("Sleep Quality");
  lcd.setTextSize(3); lcd.setTextColor(WHITE);
  for (i=-10;i<=20;i++){
    lcd.fillRoundRect(16, 16, 58, 28, 2, BLACK);
    lcd.drawRect(0, 0, 84, 48, BLACK);
    lcd.setCursor(i, 20); lcd.print("VSL");lcd.display();delay(20);
  }
  delay(300);func = 1;  // sai do logo
  lcd.setTextSize(1); lcd.display();
}

Custom parts and enclosures

Schematic for Sleep Quality Monitor VLS
Diagrama

Schematics

Schematic for Sleep Quality Monitor VLS
Diagrama

Comments

Similar projects you might like

Air Quality Monitor Live Display

Project in progress by Parts Oven

  • 1,526 views
  • 0 comments
  • 6 respects

Realtime Air Quality Monitor

Project showcase by Dheerendra Singh Tomar

  • 902 views
  • 5 comments
  • 8 respects

Air Quality Monitor using Arduino & Blynk

Project showcase by Lintang Wisesa

  • 540 views
  • 0 comments
  • 1 respect

Environment Air Quality Monitor

Project tutorial by Robert Korn

  • 739 views
  • 0 comments
  • 4 respects

CPAP Humidifier H2O Reservoir Monitor - Sleep Apnea

Project in progress by Scott Clandinin

  • 734 views
  • 0 comments
  • 4 respects

Good Sleep - Your Sleep Assistant

Project tutorial by Jey Biddulph

  • 1,672 views
  • 2 comments
  • 18 respects
Add projectSign up / Login