#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Puoi lasciarlo a -1 se non utilizzi un pin di reset
// Dichiarazione dei pin SDA e SCL per la comunicazione I2C
#define SDA_PIN A4
#define SCL_PIN A5
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
// Inizializzazione della comunicazione seriale
Serial.begin(9600);
// Inizializzazione della comunicazione I2C
Wire.begin();
// Inizializzazione del display OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Pulisce il buffer del display
display.clearDisplay();
}
void loop() {
// Lettura del valore analogico dal sensore
int valoreLettura = analogRead(A0);
// Calcolo della tensione in ingresso
float tensioneIngresso = (valoreLettura / 1023.0) * 5.0;
// Calcolo della resistenza del NTC utilizzando la legge di Ohm
const float resistenzaPullUp = 10000.0; // 10k ohm
const float resistenzaNominalNTC = 100000.0; // 100k ohm
float resistenzaNTC = resistenzaPullUp / ((5.0 / tensioneIngresso) - 1.0);
// Calcolo della temperatura utilizzando la formula di Steinhart-Hart
const float invT0 = 1.0 / (273.15 + 25); // Temperatura di riferimento in Kelvin (25 °C)
const float invBeta = 3950.0; // Coefficiente Beta
float invR0 = 1.0 / resistenzaNominalNTC; // Resistenza nominale inversa
float invT = invT0 + (1.0 / invBeta) * log(resistenzaNTC * invR0); // Calcolo l'inverso della temperatura
float temperatura = 1.0 / invT - 273.15; // Temperatura in Celsius
// Lettura della tensione della batteria
int valoreTensioneBatteria = analogRead(A1);
// Calcolo della tensione letta dal lettore
float tensioneBatteria = (valoreTensioneBatteria / 1023.0) * 5.0;
// Calcolo della tensione effettiva della batteria
float tensioneEffettivaBatteria = tensioneBatteria * 5.0; // supponendo un partitore di tensione 5:1
// Stampa delle letture sulla porta seriale
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" °C");
Serial.print("Tensione Batteria: ");
Serial.print(tensioneEffettivaBatteria);
Serial.println(" V");
// Pulisce il buffer del display
display.clearDisplay();
// Imposta il colore del testo
display.setTextColor(SSD1306_WHITE);
// Imposta la dimensione del testo
display.setTextSize(1);
// Imposta la posizione del testo
display.setCursor(0, 0);
// Scrive le letture sul display
display.print("Temp: ");
display.print(temperatura);
display.println(" C");
display.print("Batt: ");
display.print(tensioneEffettivaBatteria);
display.println(" V");
// Aggiorna il display
display.display();
// Attendi un breve periodo di tempo prima di eseguire una nuova lettura
delay(1000);
}