Navigation

    LILYGO

    • Register
    • Login
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    T-Display-S3 with ultrasonic sensor ( water level indicator )

    Technical Discussion
    2
    7
    686
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • O
      OH23 last edited by

      I'm trying to figure out if someone out there used the T-Display-S3 combined with any ultrasonic range detector to detect and display the water level in a small 2gal tank. I've picked the T-Display-S3 for its onboard display and looking for some instructions.
      if anyone can point me out in the right direction it would be great.
      tried to search but couldn't come up with anything.
      I have few sensor options :

      1. HC-SR04
      2. A02YYUW

      cheers

      teastain2 1 Reply Last reply Reply Quote 0
      • teastain2
        teastain2 @OH23 last edited by

        @oh23 Do you have experience with Arduino IDE?
        The LilyGO T-Display S3 is a beautiful state of the art dev board, and is really an Arduino on steroids.
        99% of all Arduino sensors will work on LilyGO T-Display S3 !
        It is specifically an ESP32 S3.
        With sensors I prefer i2c connected ones!
        The A02YYUW you recommended works very well and is UART comm and water proof.
        The other HC-SR04 is more for dry environments and I am not familiar with the trig/echo scheme, but it probably is supported by libraries.
        My first choice would be a VL53L TOF sensor with i2c comms, but in a waterproof package.
        -Terry

        O 1 Reply Last reply Reply Quote 0
        • O
          OH23 @teastain2 last edited by

          @teastain2 Hey Terry,
          Thank you so much for your elaborated reply, I've somehow missed it and didn't even get a notification that someone have replied to my question.

          I was able to find a very nice YT tut of exactly what I'm looking for.
          here is the link
          link text

          the only thing I'm trying to figure out is what exactly do i have to change in the scheme so it will work on my board and display.
          I actually don't even need the blynk app, buzzer, or any other remote options just to be able to see the water level in the tank, on the 1.9" T-Display in %

          here is the scheme

          /**********************************************************************************
           *  TITLE: IoT-based Water Level Indicator using ESP32, Ultrasonic Sensor & Blynk with 0.96" OLED
           *  Click on the following links to learn more. 
           *  YouTube Video: https://youtu.be/9geREeE13jc
           *  Related Blog : https://iotcircuithub.com/esp32-projects/
           *  
           *  This code is provided free for project purpose and fair use only.
           *  Please do mail us to techstudycell@gmail.com if you want to use it commercially.
           *  Copyrighted © by Tech StudyCell
           *  
           *  Preferences--> Aditional boards Manager URLs : 
           *  https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
           *  
           *  Download Board ESP32 (2.0.5) : https://github.com/espressif/arduino-esp32
           *
           *  Download the libraries 
           *  Blynk Library (1.1.0):  https://github.com/blynkkk/blynk-library
           *  Adafruit_SSD1306 Library (2.5.7): https://github.com/adafruit/Adafruit_SSD1306
           *  AceButton Library (1.9.2): https://github.com/bxparks/AceButton
           **********************************************************************************/
           
          /* Fill-in your Template ID (only if using Blynk.Cloud) */
          #define BLYNK_TEMPLATE_ID ""
          #define BLYNK_DEVICE_NAME ""
          #define BLYNK_AUTH_TOKEN ""
          
          // Your WiFi credentials.
          // Set password to "" for open networks.
          char ssid[] = "";
          char pass[] = "";
          
          //Set Water Level Distance in CM
          int emptyTankDistance = 70 ;  //Distance when tank is empty
          int fullTankDistance =  30 ;  //Distance when tank is full
          
          //Set trigger value in percentage
          int triggerPer =   10 ;  //alarm will start when water level drop below triggerPer
          
          #include <Adafruit_SSD1306.h>
          #include <WiFi.h>
          #include <WiFiClient.h>
          #include <BlynkSimpleEsp32.h>
          #include <AceButton.h>
          using namespace ace_button; 
          
          // Define connections to sensor
          #define TRIGPIN    27  //D27
          #define ECHOPIN    26  //D26
          #define wifiLed    2   //D2
          #define ButtonPin1 12  //D12
          #define BuzzerPin  13  //D13
          #define GreenLed   14  //D14
          
          //Change the virtual pins according the rooms
          #define VPIN_BUTTON_1    V1 
          #define VPIN_BUTTON_2    V2
          
          #define SCREEN_WIDTH 128 // OLED display width, in pixels
          #define SCREEN_HEIGHT 32 // OLED display height, in pixels
          
          // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
          #define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
          Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
          
          
          float duration;
          float distance;
          int   waterLevelPer;
          bool  toggleBuzzer = HIGH; //Define to remember the toggle state
          
          char auth[] = BLYNK_AUTH_TOKEN;
          
          ButtonConfig config1;
          AceButton button1(&config1);
          
          void handleEvent1(AceButton*, uint8_t, uint8_t);
          
          BlynkTimer timer;
          
          void checkBlynkStatus() { // called every 3 seconds by SimpleTimer
          
            bool isconnected = Blynk.connected();
            if (isconnected == false) {
              //Serial.println("Blynk Not Connected");
              digitalWrite(wifiLed, LOW);
            }
            if (isconnected == true) {
              digitalWrite(wifiLed, HIGH);
              //Serial.println("Blynk Connected");
            }
          }
          
          BLYNK_CONNECTED() {
            Blynk.syncVirtual(VPIN_BUTTON_1);
            Blynk.syncVirtual(VPIN_BUTTON_2);
          }
          
          void displayData(int value){
            display.clearDisplay();
            display.setTextSize(4);
            display.setCursor(8,2);
            display.print(value);
            display.print(" ");
            display.print("%");
            display.display();
          }
          
          void measureDistance(){
            // Set the trigger pin LOW for 2uS
            digitalWrite(TRIGPIN, LOW);
            delayMicroseconds(2);
           
            // Set the trigger pin HIGH for 20us to send pulse
            digitalWrite(TRIGPIN, HIGH);
            delayMicroseconds(20);
           
            // Return the trigger pin to LOW
            digitalWrite(TRIGPIN, LOW);
           
            // Measure the width of the incoming pulse
            duration = pulseIn(ECHOPIN, HIGH);
           
            // Determine distance from duration
            // Use 343 metres per second as speed of sound
            // Divide by 1000 as we want millimeters
           
            distance = ((duration / 2) * 0.343)/10;
          
            if (distance > (fullTankDistance - 10)  && distance < emptyTankDistance ){
              waterLevelPer = map((int)distance ,emptyTankDistance, fullTankDistance, 0, 100);
              displayData(waterLevelPer);
              Blynk.virtualWrite(VPIN_BUTTON_1, waterLevelPer);
              Blynk.virtualWrite(VPIN_BUTTON_2, (String(distance) + " cm"));
          
              // Print result to serial monitor
              Serial.print("Distance: ");
              Serial.print(distance);
              Serial.println(" cm");
          
              if (waterLevelPer < triggerPer){
                digitalWrite(GreenLed, HIGH);
                if (toggleBuzzer == HIGH){
                  digitalWrite(BuzzerPin, HIGH);
                }      
              }
              if (distance < fullTankDistance){
                digitalWrite(GreenLed, LOW);
                if (toggleBuzzer == HIGH){
                  digitalWrite(BuzzerPin, HIGH);
                } 
              }
          
              if (distance > (fullTankDistance + 5) && waterLevelPer > (triggerPer + 5)){
                toggleBuzzer = HIGH;
                digitalWrite(BuzzerPin, LOW);
              }        
            }
            
            // Delay before repeating measurement
            delay(100);
          }
          
           
          void setup() {
            // Set up serial monitor
            Serial.begin(115200);
           
            // Set pinmodes for sensor connections
            pinMode(ECHOPIN, INPUT);
            pinMode(TRIGPIN, OUTPUT);
            pinMode(wifiLed, OUTPUT);
            pinMode(GreenLed, OUTPUT);
            pinMode(BuzzerPin, OUTPUT);
          
            pinMode(ButtonPin1, INPUT_PULLUP);
          
            digitalWrite(wifiLed, LOW);
            digitalWrite(GreenLed, LOW);
            digitalWrite(BuzzerPin, LOW);
          
            config1.setEventHandler(button1Handler);
            
            button1.init(ButtonPin1);
          
            if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
              Serial.println(F("SSD1306 allocation failed"));
              for(;;);
            }
            delay(1000);  
            display.setTextSize(1);
            display.setTextColor(WHITE);
            display.clearDisplay();
          
            WiFi.begin(ssid, pass);
            timer.setInterval(2000L, checkBlynkStatus); // check if Blynk server is connected every 2 seconds
            Blynk.config(auth);
            delay(1000);
           
          }
           void loop() {
          
            measureDistance();
          
            Blynk.run();
            timer.run(); // Initiates SimpleTimer
          
            button1.check();
             
          }
          
          void button1Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) {
            Serial.println("EVENT1");
            switch (eventType) {
              case AceButton::kEventReleased:
                //Serial.println("kEventReleased");
                digitalWrite(BuzzerPin, LOW);
                toggleBuzzer = LOW;
                break;
            }
          }
          
          
          1 Reply Last reply Reply Quote 0
          • teastain2
            teastain2 last edited by

            @oh23 Well, if you don't need any of it except the water sensor...can you tell me which sensor and sensor board product and I'll recommend a hook up?
            -Terry

            O 1 Reply Last reply Reply Quote 0
            • O
              OH23 @teastain2 last edited by

              @teastain2 ATM I have the HC-SR04 connected.
              I have to pick up the A02YYUM from the post office tomorrow so if its not much of a hustle for you ill be happy if you can try with the HC-SR04 first.

              and I want to say again that I really appreciate your prompt replies and help, THANK YOU.

              teastain2 1 Reply Last reply Reply Quote 0
              • teastain2
                teastain2 @OH23 last edited by teastain2

                @oh23 Here is an “Instructable” set up guide:
                https://www.instructables.com/Simple-Arduino-and-HC-SR04-Example/
                You could use GPIOpins 1 and 2 for the trig and echo.
                The other, fancier sensor would need need a dedicated library with a suggested example.
                Such as here:
                https://www.dfrobot.com/product-1935.html
                Use pins 17, 18 as per the LilyGO T-Display S3 pinout, strictly observing tx and rx pin assignments.
                Hope this helps!
                -Terry
                P.S. I also have a general, but comprehensive setup guide for the LilyGO T-Display S3 here:
                https://github.com/teastainGit/LilyGO-T-display-S3-setup-and-examples

                O 1 Reply Last reply Reply Quote 0
                • O
                  OH23 @teastain2 last edited by

                  @teastain2 Thank you Terry,

                  I'll give the instructions a go and see if I make it to work the way I want.

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post
                  Powered by NodeBB | Contributors