/*
composant :
- boutons poussoir *4
- résistance 1kOhm *4
- écran OLED board-grove-oled-sh1107
- carte arduino UNO
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <U8g2lib.h> //Utiliser pour dessiner sur l'écran OLED
#include <Wire.h> //Utiliser pour la commucation I2C de l'écran OLED
#include <RTClib.h> //librairie du module RTC (Real Time Clock)
//Déclaration de l'écran
U8G2_SH1107_128X128_1_HW_I2C u8g2(U8G2_R0);
//Déclaration du module RTC
RTC_DS1307 rtc;
//pins des boutons
#define pin_button_1 13
#define pin_button_2 12
#define pin_button_3 11
#define pin_button_4 10
//variables mémoire de l'état des boutons
bool mem_button_1 = LOW;
bool mem_button_2 = LOW;
bool mem_button_3 = LOW;
bool mem_button_4 = LOW;
bool in_settings = LOW; //si in_settings = 1 alors on est dans le menu paramètre sinon non
//variables des menus
byte menu = 0;
const byte menu_max = 1;
byte menu_settings = 0;
const byte menu_settings_max = 2;
//niveau de la batterie
byte battery_level = 60; //niveau de charge renvoyé par la batterie
char battery_level_1[4]; // % de batterie affiché à l'écran
//variable de l'horloge
int millisecond = 0;
byte second = 0;
byte minute = 0;
byte hour = 0;
byte day = 0;
byte month = 0;
int year = 0;
char time[9];
char date[11];
//variable de test
int test=0;
void setup()
{
Serial.begin(9600);
pinMode(pin_button_1,INPUT);
pinMode(pin_button_2,INPUT);
pinMode(pin_button_3,INPUT);
pinMode(pin_button_4,INPUT);
u8g2.begin();
rtc.begin();
}
void loop()
{
DateTime now = rtc.now();
hour = now.hour();
minute = now.minute();
second = now.second();
day = now.day();
month = now.month();
year = now.year();
//incrémentation des variables de menu
if (digitalRead(pin_button_1) != mem_button_1 && digitalRead(pin_button_1) == HIGH)
{
if (menu == 1 && in_settings == HIGH)
{
if (menu_settings < menu_settings_max)
{
menu_settings++;
}
else
{
menu_settings = 0;
}
}
else
{
if (menu < menu_max)
{
menu++;
}
else
{
menu = 0;
}
}
}
mem_button_1 = digitalRead(pin_button_1);
//décrémentation des variables de menu
if (digitalRead(pin_button_2) != mem_button_1 && digitalRead(pin_button_2) == HIGH)
{
if (menu == 1 && in_settings == HIGH)
{
if (menu_settings > 0)
{
menu_settings--;
}
else
{
menu_settings = menu_settings_max;
}
}
else
{
if (menu > 0)
{
menu--;
}
else
{
menu = menu_max;
}
}
}
mem_button_2 = digitalRead(pin_button_2);
//détection des actions "valider" (bouton 3) et "retour" (bouton 4)
if (digitalRead(pin_button_4) != HIGH && digitalRead(pin_button_3) == HIGH && menu == 1)
{
in_settings = 1;
}
if (digitalRead(pin_button_3) != HIGH && digitalRead(pin_button_4) == HIGH && menu == 1)
{
in_settings = 0;
}
//affichage menu horloge (0)
if (menu == 0)
{
u8g2.firstPage();
do
{
u8g2.drawRFrame(0,0,128,14,3);
u8g2.drawRFrame(0,15,128,44,3);
u8g2.drawRFrame(0,60,128,68,3);
u8g2.setFont(u8g2_font_logisoso28_tf);
sprintf_P(time,PSTR("%02d:%02d"),hour,minute);
u8g2.drawStr(22,45,time);
u8g2.setFont(u8g2_font_bpixel_tr);
sprintf_P(date,PSTR("%02d/%02d/%04d"),day,month,year);
u8g2.drawStr(35,56,date);
u8g2.drawLine(24,47,22 + (82.0/60)*second,47);
//affichage du feedback sur l'utilisation du bras
u8g2.drawStr(20,80,"feedback du bras");
//dessin de la batterie
u8g2.drawLine(120,10,124,10);
u8g2.drawLine(120,10,120,3);
u8g2.drawLine(124,10,124,3);
u8g2.drawLine(123,3,123,2);
u8g2.drawLine(121,3,121,2);
u8g2.drawLine(122,2,122,2);
//affichage du % de batterie
sprintf_P(battery_level_1,PSTR("%3d"),battery_level);
u8g2.drawStr(95,10,battery_level_1);
u8g2.drawStr(112,10,"%");
if (battery_level >= 10)
{
u8g2.drawLine(121,9,123,9);
if (battery_level >= 25)
{
u8g2.drawLine(121,8,123,8);
if (battery_level >= 45)
{
u8g2.drawLine(121,7,123,7);
if (battery_level >= 60)
{
u8g2.drawLine(121,6,123,6);
if (battery_level >= 70)
{
u8g2.drawLine(121,5,123,5);
if (battery_level >= 80)
{
u8g2.drawLine(121,4,123,4);
if (battery_level >= 90)
{
u8g2.drawLine(122,3,122,3);
}
}
}
}
}
}
}
}while(u8g2.nextPage());
}
//affichage menu 1 (paramètres)
if (menu == 1 && in_settings == 0)
{
u8g2.firstPage();
do
{
u8g2.setFont(u8g2_font_bpixel_tr);
u8g2.drawStr(0,15,"menu_1");
}while(u8g2.nextPage());
}
//affichage de la lise des paramètres
if (in_settings == 1 && menu == 1)
{
u8g2.firstPage();
do
{
u8g2.setFont(u8g2_font_bpixel_tr);
u8g2.drawStr(0,8,"para1");
u8g2.drawStr(0,16,"para2");
u8g2.drawStr(0,24,"para3");
}while(u8g2.nextPage());
}
}