Community project · Arduino Uno R3

First blink

A circuit on the Arduino Uno R3 by rishi upadhyay (@rishi-upadhyay), shared on Mokxi. Open it and press Run: it runs in your browser, free.

Runs in your browser. Free · 1 remix · 1 heart.

First blink: the circuit as it is drawn in the Mokxi editor.

The code

The sketch exactly as it was saved. Open it in the editor and press Run: it compiles in your browser.

sketch.ino · uno1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

// ---------------- PINS ----------------
#define SOIL_PIN A0

#define DHT_PIN 2
#define DHT_TYPE DHT22

#define TRIG_PIN 7
#define ECHO_PIN 6

#define RELAY_PIN 8

#define GREEN_LED 9
#define RED_LED 10

#define BUZZER 11

// ---------------- SETTINGS ----------------
#define SOIL_THRESHOLD 400
#define LOW_WATER_DISTANCE 25

LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHT_PIN, DHT_TYPE);

// ---------------- ULTRASONIC ----------------
long getDistance()
{
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);

  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH, 30000);

  if (duration == 0)
    return 999;

  return duration * 0.034 / 2;
}

// ---------------- SETUP ----------------
void setup()
{
  Serial.begin(9600);

  pinMode(SOIL_PIN, INPUT);

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  pinMode(RELAY_PIN, OUTPUT);

  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);

  pinMode(BUZZER, OUTPUT);

  digitalWrite(RELAY_PIN, LOW);
  digitalWrite(GREEN_LED, LOW);
  digitalWrite(RED_LED, LOW);
  digitalWrite(BUZZER, LOW);

  dht.begin();

  lcd.init();
  lcd.backlight();

  lcd.setCursor(0, 0);
  lcd.print("SMART AGRICULTURE");

  lcd.setCursor(0, 1);
  lcd.print("SYSTEM STARTING");

  delay(2000);

  lcd.clear();
}

// ---------------- MAIN LOOP ----------------
void loop()
{
  int soilValue = analogRead(SOIL_PIN);

  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  long tankDistance = getDistance();

  // Higher analog value = drier soil
  bool soilDry = soilValue > SOIL_THRESHOLD;

  bool lowWater = tankDistance > LOW_WATER_DISTANCE;

  // ---------------- CONTROL LOGIC ----------------

  if (lowWater)
  {
    // Water tank is low
    digitalWrite(RELAY_PIN, LOW);

    digitalWrite(GREEN_LED, LOW);
    digitalWrite(RED_LED, HIGH);

    digitalWrite(BUZZER, HIGH);
  }

  else if (soilDry)
  {
    // Soil is dry
    digitalWrite(RELAY_PIN, HIGH);

    digitalWrite(GREEN_LED, HIGH);
    digitalWrite(RED_LED, LOW);

    digitalWrite(BUZZER, LOW);
  }

  else
  {
    // Soil has enough moisture
    digitalWrite(RELAY_PIN, LOW);

    digitalWrite(GREEN_LED, LOW);
    digitalWrite(RED_LED, LOW);

    digitalWrite(BUZZER, LOW);
  }

  // ---------------- LCD ----------------

  lcd.clear();

  lcd.setCursor(0, 0);

  lcd.print("S:");
  lcd.print(soilValue);

  lcd.print(" T:");

  if (isnan(temperature))
  {
    lcd.print("--");
  }
  else
  {
    lcd.print(temperature, 1);
  }

  lcd.print("C");

  lcd.setCursor(0, 1);

  if (lowWater)
  {
    lcd.print("LOW WATER");
  }
  else if (soilDry)
  {
    lcd.print("DRY-PUMP ON");
  }
  else
  {
    lcd.print("SOIL OK-OFF");
  }

  // ---------------- SERIAL MONITOR ----------------

  Serial.println("----------------------------");

  Serial.print("Soil Moisture: ");
  Serial.println(soilValue);

  Serial.print("Temperature: ");

  if (isnan(temperature))
  {
    Serial.println("ERROR");
  }
  else
  {
    Serial.print(temperature);
    Serial.println(" C");
  }

  Serial.print("Humidity: ");

  if (isnan(humidity))
  {
    Serial.println("ERROR");
  }
  else
  {
    Serial.print(humidity);
    Serial.println(" %");
  }

  Serial.print("Water Surface: ");
  Serial.print(tankDistance);
  Serial.println(" cm");

  if (lowWater)
  {
    Serial.println("STATUS: LOW WATER - PUMP OFF");
  }
  else if (soilDry)
  {
    Serial.println("STATUS: DRY SOIL - PUMP ON");
  }
  else
  {
    Serial.println("STATUS: SOIL OK - PUMP OFF");
  }

  delay(2000);
}

Parts list

12 parts, plus the jumper wires. Every one is in the editor's parts bin.