Community project · Arduino Uno R3

projek STEM

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

Runs in your browser. Free · 3 remixes · 1 heart.

projek STEM: 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 · uno2
// Pin LCD (4-bit mode) - Menggunakan pin yang sudah berhasil jalan
const int RS = 12;
const int EN = 11;
const int D4 = 5;
const int D5 = 4;
const int D6 = 3;
const int D7 = 2;

// Pin Sensor Kelembapan Tanah & Relay Pompa
const int pinSensor = A0;
const int pinRelay  = A3;

// Batas kelembapan tanah
const int batasKering = 400; 

void sendNibble(byte nibble) {
  digitalWrite(D4, (nibble >> 0) & 0x01);
  digitalWrite(D5, (nibble >> 1) & 0x01);
  digitalWrite(D6, (nibble >> 2) & 0x01);
  digitalWrite(D7, (nibble >> 3) & 0x01);
  
  digitalWrite(EN, HIGH);
  delayMicroseconds(1);
  digitalWrite(EN, LOW);
  delayMicroseconds(100);
}

void sendByte(byte data, byte isData) {
  digitalWrite(RS, isData); 
  sendNibble(data >> 4);    
  sendNibble(data & 0x0F);  
}

void lcdCommand(byte cmd) {
  sendByte(cmd, LOW);
  delay(2);
}

void lcdWriteChar(char c) {
  sendByte(c, HIGH);
}

void lcdWriteString(const char* str) {
  while (*str) {
    lcdWriteChar(*str++);
  }
}

void lcdInit() {
  pinMode(RS, OUTPUT);
  pinMode(EN, OUTPUT);
  pinMode(D4, OUTPUT);
  pinMode(D5, OUTPUT);
  pinMode(D6, OUTPUT);
  pinMode(D7, OUTPUT);

  delay(50); 

  sendNibble(0x03);
  delay(5);
  sendNibble(0x03);
  delayMicroseconds(150);
  sendNibble(0x03);
  sendNibble(0x02);

  lcdCommand(0x28); 
  lcdCommand(0x0C); 
  lcdCommand(0x06); 
  lcdCommand(0x01); 
  delay(2);
}

void setup() {
  pinMode(pinSensor, INPUT);
  pinMode(pinRelay, OUTPUT);
  digitalWrite(pinRelay, LOW); 
  
  lcdInit();
  
  // Test Teks Awal saat Dinyalakan
  lcdCommand(0x80); 
  lcdWriteString("Sistem Otomatis");
  lcdCommand(0xC0); 
  lcdWriteString("Penyiram Siap...");
  delay(2000);
  lcdCommand(0x01); // Clear Layar
}

void loop() {
  // Baca nilai sensor kelembapan tanah
  int nilaiTanah = analogRead(pinSensor);

  // --- BARIS 1: Status Kelembapan Tanah ---
  lcdCommand(0x80); 
  lcdWriteString("Tanah: ");
  
  if (nilaiTanah > batasKering) {
    lcdWriteString("Kering ");
  } else {
    lcdWriteString("Lembab ");
  }
  
  // Konversi angka ke teks dengan kapasitas buffer memori yang aman
  char buffer[10];
  itoa(nilaiTanah, buffer, 10);
  lcdWriteString("(");
  lcdWriteString(buffer);
  lcdWriteString(")   "); 

  // --- BARIS 2: Status Pompa ---
  lcdCommand(0xC0); 
  
  if (nilaiTanah > batasKering) {
    digitalWrite(pinRelay, HIGH); 
    lcdWriteString("Status: Menyiram");
  } else {
    digitalWrite(pinRelay, LOW);  
    lcdWriteString("Status: Diam    ");
  }

  delay(500); 
}

Parts list

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