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 :(