Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //GOOD JUNE 29, 2025
- //Changed to HCSR04 library June 30
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1331.h>
- #include <SPI.h>
- #include <OneButton.h>
- #include <Fonts\Seven_Segment7pt7b.h>
- #include <HCSR04.h>
- // --- Pin Definitions ---
- #define TRIG_PIN 0
- #define ECHO_PIN 1
- #define BUTTON_PIN 2
- HCSR04 hc(TRIG_PIN,ECHO_PIN);
- #define OLED_CS 7
- #define OLED_DC 10
- #define OLED_RST 3
- #define BLACK 0x0000
- #define BLUE 0x001F
- #define RED 0xF800
- #define GREEN 0x07E0
- #define CYAN 0x07FF
- #define MAGENTA 0xF81F
- #define YELLOW 0xFFE0
- #define WHITE 0xFFFF
- // --- Display: SSD1331 96x64 SPI OLED ---
- Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, OLED_CS, OLED_DC, OLED_RST);
- // --- OneButton setup ---
- OneButton button(BUTTON_PIN, true, true);
- // --- Constants ---
- const float CYLINDER_DIAMETER = 93.15; // mm
- const float CYLINDER_RADIUS = CYLINDER_DIAMETER / 2.0;
- const int SAMPLE_COUNT = 10;
- float baseDistance = 0;
- void setup() {
- Serial.begin(115200);
- pinMode(TRIG_PIN, OUTPUT);
- pinMode(ECHO_PIN, INPUT);
- // Initialize display
- display.begin();
- display.fillScreen(BLACK);
- display.setRotation(0);
- // Initialize button
- button.attachClick(onButtonClick);
- // Draw static layout
- drawLayout();
- // Read baseline distance
- delay(30);
- baseDistance = hc.dist(); //averageDistance();
- baseDistance = baseDistance * 10; //cm to mm
- Serial.print("Base Distance (mm): ");
- Serial.println(baseDistance,2);
- }
- void loop() {
- button.tick();
- }
- // --- Draw static UI elements ---
- void drawLayout() {
- display.fillScreen(BLACK);
- // Top green rectangle (distance)
- display.drawRoundRect(0, 0, 96, 30, 3, GREEN);
- // Bottom yellow rectangle (volume)
- display.drawRoundRect(0, 34, 96, 30, 3, YELLOW);
- }
- // --- Handle button press ---
- void onButtonClick() {
- float measured = hc.dist(); //averageDistance();
- measured = measured * 10; //cm to mm
- float corrected = baseDistance - measured;
- if (corrected < 0) corrected = 0;
- float height_mm = (float)corrected;
- float volume_mm3 = PI * CYLINDER_RADIUS * CYLINDER_RADIUS * height_mm;
- float volume_mL = volume_mm3 / 1000.0;
- updateDisplay(corrected, volume_mL);
- }
- // --- Display updated values ---
- void updateDisplay(float corrected_mm, float volume_mL) {
- // Clear inner rectangles
- display.fillRect(2, 2, 92, 26, BLACK);
- display.fillRect(2, 36, 92, 26, BLACK);
- // Distance (top area)
- display.setCursor(4, 6);
- display.setTextColor(GREEN);
- display.setFont(&Seven_Segment7pt7b);
- //display.setTextSize(1);
- display.print(corrected_mm,1);
- // display.print(" mm");
- // Volume (bottom area)
- display.setCursor(4, 47);
- display.setTextColor(YELLOW);
- display.setFont(&Seven_Segment7pt7b);
- // display.setTextSize(1);
- display.print(volume_mL, 2);
- // display.print(" mL");
- Serial.print("$"); //for serial plotter
- Serial.print(volume_mL, 2);
- Serial.print(";");
- // Bottom labels
- display.setCursor(12, 60);
- display.setTextColor(WHITE);
- display.setFont();
- display.setTextSize(1);
- display.print(" Volume mL");
- display.setCursor(6, 20);
- display.setTextColor(WHITE);
- display.setFont();
- display.setTextSize(1);
- display.print("Water Level mm");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement