Published by NST on the Jan. 22, 2025, 7:35 p.m. view all posts

Plant Monitring System using a D1 mini

Simple plant monitoring system using a D1 Mini

 

A fun little experiment outputting animations to the oled display depending on plant soil conditions. 
 
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1351.h>
 
#define CS   D8 //These are d1 mini pins I am using to store the frame data
#define DC   D1
#define RST  D2
 
Adafruit_SSD1351 display = Adafruit_SSD1351(128, 128, &SPI, CS, DC, RST);
 
// LEDs
#define GREEN_LED D6
#define RED_LED   D0
 
// LEDs
#define GREEN_LED D6
#define RED_LED   D0
 
// Soil sensor
#define SOIL_PIN A0
 
// ===== CALIBRATE THIS =====
// Thresholds (CALIBRATE THESE)
int wetLevel = 700;
int dryLevel = 1000;
 
// Image position
int x = (128 - 101) / 2;
int y = (128 - 98) / 2;
 
// Your 64x64 image (must be RGB565)
// Frame 1 (normal heart eyes)
const uint16_t happy1[101 * 98] PROGMEM = {// Your 64x64 image - I pasted the frame in here};
 
// Frame 2 (pulsed heart eyes)
const uint16_t happy2[101 * 98] PROGMEM = {};
 
// Frame 3 (neutral to blink)
const uint16_t neutral1[101 * 98] PROGMEM = {};
 
// Frame 4 (blink to neutral)
const uint16_t neutral2[101 * 98] PROGMEM = {};
 
void setup() {
  SPI.begin();
  display.begin();
 
  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
 
  Serial.begin(9600);
 
  display.fillScreen(0x0000);
  Serial.println("Plant system ready");
}
 
void loop() {
  int soil = analogRead(SOIL_PIN);
 
  Serial.print("Soil: ");
  Serial.println(soil);
 
  // ========= STATE DECISION =========
 
  if (soil < wetLevel) {
    showHappy();
  }
  else if (soil > dryLevel) {
    showDry();
  }
  else {
    showNeutral();
  }
 
  delay(120);
}
 
// ================= HAPPY STATE =================
void showHappy() {
  digitalWrite(GREEN_LED, HIGH);
  digitalWrite(RED_LED, LOW);
 
  for (int i = 0; i < 4; i++) {
 
    display.drawRGBBitmap(x, y, happy1, 101, 98);
    delay(60);
 
    display.drawRGBBitmap(x, y, happy2, 101, 98);
    delay(60);
  }
}
 
// ================= NEUTRAL STATE =================
void showNeutral() {
  digitalWrite(GREEN_LED, LOW);
  digitalWrite(RED_LED, LOW);
 
  display.drawRGBBitmap(x, y, neutral1, 101, 98);
  delay(400);
 
  display.drawRGBBitmap(x, y, neutral2, 101, 98);
  delay(200);
}
 
// ================= DRY STATE =================
void showDry() {
  digitalWrite(GREEN_LED, LOW);
  digitalWrite(RED_LED, HIGH);
 
  display.drawRGBBitmap(x, y, neutral1, 101, 98);
  delay(800);
 
  display.drawRGBBitmap(x, y, neutral2, 101, 98);
  delay(150);
}

Comments...


No comments here yet :(