ESP8266 i HC-SR04 oraz OLED SSD1306. Pomiar odległości.

Projekt wykonany w ramach koła naukowego informatyki stosowanej Państwowej Akademii Nauk Stosowanych im. Ignacego Mościckiego w Ciechanowie.

Urządzenia programowane w środowisku Arduino IDE.

Założenia:

  • Odczyt odległości badanego przedmiotu od czujnika
  • Przekazanie odczytanej wartości do drugiego urządzenia za pomocą sieci WiFi.
  • Wyświetlenie odczytanej wartości na podłączonym wyświetlaczu OLED.

Urządzenie 1

NodeMCU V3 z podłączonym ultradźwiękowym czujnikiem odległości HC-SR04 łączy się przez sieć WiFi z AP (urządzenie 2). Wysyła za pomocą protokołu HTTP obliczoną odległość na podstawie odczytów z czujnika.

Obliczenie odległości odbywa się za pomocą wyrażenia: odleglosc=(czas*.0343)/2;

  • czas to czas w mili sekundach w jakim fala dźwiękowa pokonuje drogę z czujnika do przeszkody i z powrotem.
  • .0343 to prędkość dźwięku cm/μs (około 340 metrów na sekundę)
  • /2 to dzielenie przez dwa, ponieważ fala dźwiękowa pokonuje drogę z czujnika do przeszkody i z powrotem.

Kod urządzenia:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define echoPin D7
#define trigPin D6
const char* ssid = "ESP8266_AP";
const char* password = "PANS2025";
const char* serverIP = "192.168.4.1";  // IP AP
WiFiClient client;
HTTPClient http;
void callback(char* topic, byte* payload, unsigned int length) {}

void setup() {
  pinMode(trigPin, OUTPUT);//Pin syhnału wyjściowego
  pinMode(echoPin, INPUT);//Pin syhnału wejściowego
  delay(10);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Łączenie do: "); Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
  Serial.println(""); Serial.println("WiFi OK !");
  Serial.println("IP: "); Serial.println(WiFi.localIP());
}
void loop() 
{
  long lastMsg = 0; char msg[50]; int odl=0;
  long czas, odleglosc;
  digitalWrite (trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite (trigPin, LOW);
  czas = pulseIn(echoPin, HIGH);
  odleglosc = (czas*.0343) / 2;
  //Serial.println(odleglosc);//debug czy odleglosc prawidlowa
  delay(1000);//odczyt co 1 sek

  if (WiFi.status() == WL_CONNECTED) {
    String url = "http://" + String(serverIP) + "/data?value=" + String(odleglosc);
    http.begin(client, url);
    int httpCode = http.GET();
    //if (httpCode == 200) {
    //  Serial.println("Wysłano dane!");//debug czy komunikacja po http
    //}
    http.end();
  }
}

Urządzenie 2

Wemos D1 mini z podłączonym wyświetlaczem OLED SSD1306 z modułem WiFi pracującym w trybie AP. Odbiera wartości odczytane z urządzenia 1 i wyświetla je. Na potrzeby prezentacji na biurku maksymalna wyświetlana wartość to 50cm, powyżej tej wartości na wyświetlaczu pojawia się napis MAX.

Kod urządzenia:



#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define OLED_RESET -1  // Reset not connected
Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, OLED_RESET);

const char* ssid = "ESP8266_AP";
const char* password = "PANS2025";

ESP8266WebServer server(80);
String receivedValue;

void handleData() {
  if (server.hasArg("value")) {
    receivedValue = server.arg("value");
    //Serial.print("Odebrana wartość: "); debug
    //Serial.println(receivedValue);
    int value = receivedValue.toInt();
    
    // Wyświetlenie na OLED
    display.clearDisplay();
    display.setTextSize(2.5);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0,15);
    display.print("Dystans:");
    display.setCursor(0,35);
    if (value <= 50){
    display.print(receivedValue + " cm");
    }
    else {
    display.print("MAX");
    }
    display.display();
  }
  server.send(200, "text/plain", "OK");
}

void setup() {
  Serial.begin(115200);
  WiFi.softAP(ssid, password);
  Serial.println("Access Point uruchomiony!");
  Serial.print("IP: ");
  Serial.println(WiFi.softAPIP());

  // OLED inicjalizacja
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("Błąd OLED!"));
    while (true);
  }

  display.display();
  delay(500);
  display.clearDisplay();

  server.on("/data", HTTP_GET, handleData);
  server.begin();
}

void loop() {
  server.handleClient();
}

Obudowy do urządzeń zostały wykonane w technologii druku 3D, wg projektów ogólnodostępnych oraz opracowania własnego.

  1. Wspornik sensora HC-SR04 do pobrania z Thingsverse lub bezpośrednio.
  2. Obudowa NodeMCU do pobrania z MakerWorld lub bezpośrednio.
  3. Obudowa Wemos D1 mini oraz OLED do pobrania z MakerWorld lub bezpośrednio.
  4. Sześcian podstawy – prosty projekt własny.

Koniec 🙂

Jeżeli pomogłem to Postaw mi kawę na buycoffee.to ,a będę miał więcej energii na pisanie kolejnych ciekawych wpisów.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *