#include "SSD1306_minimal.h"
#include <avr/pgmspace.h>
#define BUTTON 1
#define INPUT_PIN 3
#define DEG "\xa7" \ "C"
// 'vuoto', 32x32px
const unsigned char vuoto[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
// 'timer', 32x32px
const unsigned char imgtimer[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0x60, 0x6c, 0x6c, 0x7c, 0x3c,
0x3c, 0x7c, 0x6c, 0x6c, 0x60, 0xc0, 0xc0, 0x80, 0xf0, 0xf0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc0, 0xf8, 0x3c, 0x0e, 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x3c, 0xf8, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0x7f, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0x7f, 0x1f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0e, 0x1c, 0x18, 0x38, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x38, 0x18, 0x1c, 0x0e, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'gasgas', 32x32px
const unsigned char gasgas[] PROGMEM = {
0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0x78, 0x3c, 0x3c, 0x1e, 0x1e, 0x0e, 0x0f, 0x0f, 0x0f,
0x0f, 0x0f, 0x0f, 0x0e, 0x1e, 0x1e, 0x3c, 0x3c, 0x78, 0xf8, 0xf0, 0xe0, 0xc0, 0x00, 0x00, 0x00,
0xe0, 0xfc, 0xff, 0xff, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0,
0xf8, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0xff, 0xff, 0xfe, 0xf0,
0x0f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xbf, 0x9f, 0xbc, 0xf8, 0xf3, 0x77,
0x33, 0x73, 0xf8, 0x7e, 0x3f, 0x9f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x0f,
0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x3e, 0x7c, 0x79, 0x7a, 0xf8, 0xf9, 0xf9, 0xfc,
0xfc, 0xfc, 0xf9, 0xfb, 0x7b, 0x7a, 0x78, 0x3d, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00
};
// 'FINE', 60x12px
const unsigned char FINE[] PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf1, 0x61, 0x01, 0x01, 0x61, 0xf9, 0xf9, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x01, 0x01, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xfd, 0xff, 0xff, 0x01, 0xff,
0xff, 0xff, 0x01, 0xf9, 0xe3, 0xc7, 0x8f, 0x1f, 0x7f, 0xff, 0x01, 0x01, 0xff, 0xff, 0x01, 0x01,
0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x08,
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f, 0x0f, 0x08, 0x0f, 0x0f,
0x0f, 0x0f, 0x0f, 0x0e, 0x0c, 0x08, 0x08, 0x0f, 0x0f, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
0x0b, 0x0b, 0x0f, 0x0f, 0x0f, 0x0f
};
// '0', 12x16px
const unsigned char Bitmap0[] PROGMEM = {
0xfe, 0x03, 0x03, 0x03, 0x03, 0x83, 0xc3, 0x63, 0x33, 0x1b, 0xff, 0xfc, 0x7f, 0xf0, 0xdc, 0xce,
0xc7, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0x3f
};
// '1', 12x16px
const unsigned char Bitmap1[] PROGMEM = {
0x00, 0x00, 0x10, 0x18, 0x0e, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
};
// '2', 12x16px
const unsigned char Bitmap2[] PROGMEM = {
0x0e, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xff, 0x7c, 0xff, 0xc1, 0xc1, 0xc1,
0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0
};
// '3', 12x16px
const unsigned char Bitmap3[] PROGMEM = {
0x06, 0x03, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xfe, 0x00, 0x60, 0xc0, 0xc1, 0xc1,
0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xff, 0x1c
};
// '4', 12x16px
const unsigned char Bitmap4[] PROGMEM = {
0x00, 0x00, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0xff, 0xff, 0x00, 0x0e, 0x0f, 0x0d, 0x0c,
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xff, 0x0c
};
// '5', 12x16px
const unsigned char Bitmap5[] PROGMEM = {
0xff, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x03, 0x71, 0xc1, 0xc1, 0xc1,
0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xff, 0x3e
};
// '6', 12x16px
const unsigned char Bitmap6[] PROGMEM = {
0xfe, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x80, 0x00, 0x7f, 0xc1, 0xc1, 0xc1,
0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xff, 0x3e
};
// '7', 12x16px
const unsigned char Bitmap7[] PROGMEM = {
0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00
};
// '8', 12x16px
const unsigned char Bitmap8[] PROGMEM = {
0xfe, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xff, 0x7c, 0x7f, 0xc1, 0xc1, 0xc1,
0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xff, 0x3e
};
// '9', 12x16px
const unsigned char Bitmap9[] PROGMEM = {
0xfe, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xfe, 0x40, 0xc1, 0xc1, 0xc1,
0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0x7f
};
// '9', 12x16px
const unsigned char Batt[] PROGMEM = {
0xfe, 0xff, 0xff, 0xfe
};
char buff[10];
int stato = 0;
int inputPin = 4;
unsigned long tempo=0;
const unsigned char line[] PROGMEM = {
B00000001
};
SSD1306_Mini oled; // Declare the OLED object
void splash() {
oled.startScreen();
oled.clear(); // Clears the display
pinMode(BUTTON, INPUT_PULLUP);
pinMode(inputPin, INPUT); // declare sensor as input
}
void setup() {
oled.init(0x3C); // Initializes the display to the specified address
oled.clear(); // Clears the display
delay(1000); // Delay for 1 second
splash(); // Write something to the display (refer to the splash() method
oled.cursorTo(4, 0); // x:0, y:0
oled.printString("Avvio dei Sensori"); //al primo avvio il sensore deve riscaldarsi per 10 secondi
oled.drawImage(gasgas, 48, 2, 32, 4);
for (int i = 0; i < 129; i++) {
oled.drawImage(line, i, 7, 1, 1); // barra di avanzamento progressiva in for di 13 secondi
delay(100);
}
oled.clear();
}
void loop() {
controllo_gas();
int batteria=0;
int check=0;
int volt = map(analogRead(INPUT_PIN), 0, 1024, 0, 46); // ESEGUO MAPPATURA DELL'INPUT PER IMPOSTARE IL TIMER
oled.cursorTo(0, 0); // x:0, y:0
oled.printString("TIMER");
oled.cursorTo(0, 1); // x:0, y:0
for (int i = 0; i < 129; i++)
oled.drawImage(line, i, 1, 1, 1);
for (int i = 0; i < 129; i++)
oled.drawImage(line, i, 7, 1, 1);
oled.cursorTo(40, 0); // x:0, y:0
sprintf(buff, "%0.2hd\%", volt);
oled.printString(buff);
oled.drawImage(imgtimer, 48, 2, 32, 4);
oled.drawImage(Batt, 0, 6, 4, 1);
batteria=tensione();
oled.cursorTo(6, 6); // x:0, y:0
sprintf(buff, "%0.2hd\%", batteria);
oled.printString(buff);
tempo=millis();
while(digitalRead(1) == 1){
controllo_gas();
volt = map(analogRead(INPUT_PIN), 0, 1024, 0, 46);
oled.cursorTo(40, 0); // x:0, y:0
sprintf(buff, "%0.2hd\%", volt);
oled.printString(buff);
oled.drawImage(imgtimer, 48, 2, 32, 4);
if (digitalRead(1) == 0)
timer(volt);
if (millis()>tempo+10000 && volt != 45){
oled.clear();
riposo();
}
if(volt != check){
tempo=millis();
}
check=volt;
}
}
void riposo(){
while(digitalRead(1) == 1){
controllo_gas();
}
}
void controllo_gas(){
if (digitalRead(inputPin) == HIGH) { //se il sensore rileva esegue
oled.cursorTo(75, 0); // x:0, y:0
oled.printString(" "); // CANCELLO LA SCRITTA GAS:OK
oled.drawImage(gasgas, 48, 2, 32, 4); // ICONA GAS
pinMode(BUTTON, OUTPUT); // PASSO IL PIN DA PULLUP A INPUT PER AVERE 5VOLT SUL PIN A FAR SUONARE IL BUZZER CHE HO CABLATO SULLO STESSO PIN DEL TASTO PER MANCANZA DI OUTPUT
analogWrite(BUTTON, 500);
delay(50);
analogWrite(BUTTON, 0);
delay(50);
//oled.clear();
oled.drawImage(vuoto, 48, 2, 32, 4);
oled.printString(" ");
pinMode(BUTTON, INPUT_PULLUP); //METTO IL PIN ALLO STATO PRECEDENTE PER RIPRENDERE IL SISTEMA DI INPUT CON TASTO
} else {
oled.cursorTo(75, 0); // x:0, y:0
oled.printString("|GAS:OK"); // FINITO IL RILEVAMENTO RISCRIVO GAS OK
}
}
void timer(int volt) {
oled.drawImage(vuoto, 48, 2, 32, 4); // QUADRATO NERO PER COPRIRE ICONA PRECEDENTE
int primo, secondo; // DICHIARO INTERI PER SCOMPORRE LE DUE CIFRE DELLA VARIABILE IN CIFRE SINGOLE
primo = volt / 10;
secondo = volt % 10;
//oled.drawImage(B00001100, 63, 4, 1, 1); //metto i :
oled.cursorTo(59, 4); // x:0, y:0
oled.printString("|");
oled.drawImage(Bitmap0, 66, 3, 12, 2); // metto i 00
oled.drawImage(Bitmap0, 80, 3, 12, 2);
switch (primo) {
case 0: oled.drawImage(Bitmap0, 34, 3, 12, 2); break;
case 1: oled.drawImage(Bitmap1, 34, 3, 12, 2); break;
case 2: oled.drawImage(Bitmap2, 34, 3, 12, 2); break;
case 3: oled.drawImage(Bitmap3, 34, 3, 12, 2); break;
case 4: oled.drawImage(Bitmap4, 34, 3, 12, 2); break;
case 5: oled.drawImage(Bitmap5, 34, 3, 12, 2); break;
case 6: oled.drawImage(Bitmap6, 34, 3, 12, 2); break;
case 7: oled.drawImage(Bitmap7, 34, 3, 12, 2); break;
case 8: oled.drawImage(Bitmap8, 34, 3, 12, 2); break;
case 9: oled.drawImage(Bitmap9, 34, 3, 12, 2); break;
default:;
}
switch (secondo) {
case 0: oled.drawImage(Bitmap0, 48, 3, 12, 2); break;
case 1: oled.drawImage(Bitmap1, 48, 3, 12, 2); break;
case 2: oled.drawImage(Bitmap2, 48, 3, 12, 2); break;
case 3: oled.drawImage(Bitmap3, 48, 3, 12, 2); break;
case 4: oled.drawImage(Bitmap4, 48, 3, 12, 2); break;
case 5: oled.drawImage(Bitmap5, 48, 3, 12, 2); break;
case 6: oled.drawImage(Bitmap6, 48, 3, 12, 2); break;
case 7: oled.drawImage(Bitmap7, 48, 3, 12, 2); break;
case 8: oled.drawImage(Bitmap8, 48, 3, 12, 2); break;
case 9: oled.drawImage(Bitmap9, 48, 3, 12, 2); break;
default:;
}
delay(1000);
for (int tim = volt; tim > 0;) {
tim--;
for (int i = 5; i >= 0; i--) {
for (int j = 9; j >= 0; j--) {
tempo=millis(); // SEGNO IL VALORE DEL TEMPO PASSATO DALL'ACCENSIONE
controllo_gas();
if (digitalRead(1) == 0)
stato++;
if (stato == 3)
goto fine;
primo = tim / 10; //DIVIDO IL PRIMO E IL SECONDO NUMERO DALLA VARIABILE
secondo = tim % 10;
switch (primo) {
case 0: oled.drawImage(Bitmap0, 34, 3, 12, 2); break;
case 1: oled.drawImage(Bitmap1, 34, 3, 12, 2); break;
case 2: oled.drawImage(Bitmap2, 34, 3, 12, 2); break;
case 3: oled.drawImage(Bitmap3, 34, 3, 12, 2); break;
case 4: oled.drawImage(Bitmap4, 34, 3, 12, 2); break;
case 5: oled.drawImage(Bitmap5, 34, 3, 12, 2); break;
case 6: oled.drawImage(Bitmap6, 34, 3, 12, 2); break;
case 7: oled.drawImage(Bitmap7, 34, 3, 12, 2); break;
case 8: oled.drawImage(Bitmap8, 34, 3, 12, 2); break;
case 9: oled.drawImage(Bitmap9, 34, 3, 12, 2); break;
default:;
}
switch (secondo) {
case 0: oled.drawImage(Bitmap0, 48, 3, 12, 2); break;
case 1: oled.drawImage(Bitmap1, 48, 3, 12, 2); break;
case 2: oled.drawImage(Bitmap2, 48, 3, 12, 2); break;
case 3: oled.drawImage(Bitmap3, 48, 3, 12, 2); break;
case 4: oled.drawImage(Bitmap4, 48, 3, 12, 2); break;
case 5: oled.drawImage(Bitmap5, 48, 3, 12, 2); break;
case 6: oled.drawImage(Bitmap6, 48, 3, 12, 2); break;
case 7: oled.drawImage(Bitmap7, 48, 3, 12, 2); break;
case 8: oled.drawImage(Bitmap8, 48, 3, 12, 2); break;
case 9: oled.drawImage(Bitmap9, 48, 3, 12, 2); break;
default:;
}
//oled.drawImage(B00001100, 63, 4, 1, 1); // METTO I DUE PUNTI PER IL TIMER
oled.cursorTo(59, 4); // x:0, y:0
oled.printString("|");
switch (i) {
case 0: oled.drawImage(Bitmap0, 66, 3, 12, 2); break;
case 1: oled.drawImage(Bitmap1, 66, 3, 12, 2); break;
case 2: oled.drawImage(Bitmap2, 66, 3, 12, 2); break;
case 3: oled.drawImage(Bitmap3, 66, 3, 12, 2); break;
case 4: oled.drawImage(Bitmap4, 66, 3, 12, 2); break;
case 5: oled.drawImage(Bitmap5, 66, 3, 12, 2); break;
case 6: oled.drawImage(Bitmap6, 66, 3, 12, 2); break;
case 7: oled.drawImage(Bitmap7, 66, 3, 12, 2); break;
case 8: oled.drawImage(Bitmap8, 66, 3, 12, 2); break;
case 9: oled.drawImage(Bitmap9, 66, 3, 12, 2); break;
default:;
}
switch (j) {
case 0: oled.drawImage(Bitmap0, 80, 3, 12, 2); break;
case 1: oled.drawImage(Bitmap1, 80, 3, 12, 2); break;
case 2: oled.drawImage(Bitmap2, 80, 3, 12, 2); break;
case 3: oled.drawImage(Bitmap3, 80, 3, 12, 2); break;
case 4: oled.drawImage(Bitmap4, 80, 3, 12, 2); break;
case 5: oled.drawImage(Bitmap5, 80, 3, 12, 2); break;
case 6: oled.drawImage(Bitmap6, 80, 3, 12, 2); break;
case 7: oled.drawImage(Bitmap7, 80, 3, 12, 2); break;
case 8: oled.drawImage(Bitmap8, 80, 3, 12, 2); break;
case 9: oled.drawImage(Bitmap9, 80, 3, 12, 2); break;
default:;
}
while(millis() < tempo+1000){controllo_gas();} //ESEGUO CONTROLLO GAS FINO A CHE NON PASSA UN SECONDO PER RIPRENDERE IL CICLO
//delay(900);
}
}
}
for (int i = 0; i == 0;) {
oled.drawImage(FINE, 34, 3, 59, 2);
pinMode(BUTTON, OUTPUT); // PASSO IL PIN DA PULLUP A INPUT PER AVERE 5VOLT SUL PIN A FAR SUONARE IL BUZZER CHE HO CABLATO SULLO STESSO PIN DEL TASTO PER MANCANZA DI OUTPUT
analogWrite(BUTTON, 1000);
delay(200);
analogWrite(BUTTON, 0);
delay(200);
pinMode(BUTTON, INPUT_PULLUP);
if (digitalRead(1) == 0)
i = 1;
controllo_gas();
delay(200);
}
fine:
stato = 0;
oled.clear(); // PULISCE LO SCHERMO
delay(1000);
loop();
}
int tensione() {
ADMUX = _BV(MUX3) | _BV(MUX2); // ATtiny85
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA, ADSC));
uint8_t low = ADCL;
unsigned int val = (ADCH << 8) | low;
//discard previous result
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA, ADSC));
low = ADCL;
val = (ADCH << 8) | low;
//return map(((long)1024 * 1100) / val,2500,5000,0,100);
return (((long)1024 * 1100) / val);
}