Disegnato CIRKIT DESIGNER:
Prompt:Mi prepari un programma completo con le seguenti condizioni :
• ESP32 38 pin
• Sensore HC-SR04P (3.3. volt)
• Modulo microSD (SPI)
• Salvataggio su SD solo se la distanza cambia rispetto alla precedente
• Con piccola soglia anti-rumore (evita scritture inutili)
• Visualizza sul OLED la distanza rilevata
Ti preparo uno sketch completo per ESP32 con:
✅ Sensore HC-SR04P (3.3. volt)
✅ Display OLED I2C (SSD1306 128x64)
✅ Modulo microSD SPI
✅ Salvataggio su SD solo se la distanza cambia
✅ Soglia anti-rumore
✅ Visualizzazione su OLED
Media su 5 letture
Soglia anti-rumore: 0.5 cm
Scrittura su SD solo se la variazione supera la soglia
Timestamp in millisecondi
Chatgpt mi ha fornito il seguente programma da verificare: Funziona perfettamente è un grande!!!!
// Scheda :ESP32 Dev Module
// IDE Arduino 1.8.12
// 3 Marzo 2026
//
//
// OLED:SDA ==> GPI 21 SCL ==> GPI 22
//SENSORE: HC-SR04P 3.3. Volt • TRIG → GPI 13 • ECHO → GPI 12
//SD: • CS → GPI 5 • MOSI → GPI 23 • MISO → GPI 19 • SCK → GPI 18
//
//
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <SD.h>
// -------------------- OLED --------------------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// -------------------- PIN --------------------
#define TRIG_PIN 13
#define ECHO_PIN 12
#define SD_CS 5
// -------------------- PARAMETRI --------------------
#define NUM_SAMPLES 5
#define SOGLIA_CM 0.5 // soglia anti-rumore (cm)
float distanzaPrecedente = -1;
// -------------------- FUNZIONE MISURA --------------------
float misuraDistanza() {
float somma = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long durata = pulseIn(ECHO_PIN, HIGH, 30000); // timeout 30ms
float distanza = durata * 0.0343 / 2;
somma += distanza;
delay(10);
}
return somma / NUM_SAMPLES;
}
// -------------------- SETUP --------------------
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED non trovato");
while (true);
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
// SD
if (!SD.begin(SD_CS)) {
Serial.println("Errore SD!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("SD ERROR");
display.display();
while (true);
}
Serial.println("Sistema pronto");
}
// -------------------- LOOP --------------------
void loop() {
float distanza = misuraDistanza();
// Visualizzazione OLED
display.clearDisplay();
display.setCursor(0, 10);
display.print("Dist:");
display.setCursor(0, 35);
display.print(distanza,2);// Visualizza due decimali ..... superfluo
display.print(" cm");
display.display();
Serial.print("Distanza: ");
Serial.println(distanza);
// Controllo variazione con soglia
if (distanzaPrecedente < 0 || abs(distanza - distanzaPrecedente) > SOGLIA_CM) {
File file = SD.open("/distanze.csv", FILE_APPEND);
if (file) {
file.print(millis());
file.print(", ");
file.println(distanza,2);// memorizza anche due decimali.... superfluo
file.close();
Serial.println("Dato salvato su SD");
distanzaPrecedente = distanza;
} else {
Serial.println("Errore apertura file");
}
}
delay(500);
}
Ecco il file cvs memorizzato:
Primo valore dei mills e valore la distanza.... Serial Monitor Foto dell'assieme
Prompt. Funziona sei un grande!!!!!
Grande 😄 grazie davvero, fa piacere saperlo!
Direi che hai messo insieme un progetto pulito e robusto:
filtraggio
soglia anti-rumore
log su SD solo quando serve, esattamente come si fa quando si vuole evitare scritture inutili e avere dati affidabili
visualizzazione su OLED
Ottimo lavoro 👌
Quando vuoi possiamo fare un upgrade “da laboratorio”, per esempio:
aggiungere RTC per data/ora reale nei log
creare rotazione dei file su SD (un file al giorno)
inserire sleep dell’ESP32 per risparmio energetico
esportare i dati in formato pronto per Excel / LibreOffice
oppure integrare LoRa o Wi-Fi (so che le trasmissioni a lunga distanza ti intrigano 😉)
Quando hai voglia di fare il prossimo passo, sono qui 💪