nge-Pot 84 with LCD (Pot Elektronik Open Source Hardware)

Masih meneruskan tulisan tentang nge-Pot 84 with LCD (Pot Elektronik), kali ini saya akan membahas desain prototype ini. Mohon maaf jika skema-nya tidak saya sertakan, karena saya belum sempat merapikannya. Di bawah ini adalah tampilan desain PCB nge-Pot 84 with LCD.

Desain Layout PCB nge-Pot 84 with LCD
Desain Layout PCB nge-Pot 84 with LCD

Sedangkan di bawah ini tampilan bagian bawah untuk etsa (etching). Saya mengexportnya ke format JPG. Jika ada yg membutuhkannya dalam format SVG atau PDF bisa menghubungi saya. Oh iya, untuk mencetaknya harus dengan skala 1:1 alias tidak boleh resize supaya presisi. Jangan lupa menggunakan socket 16 pin untuk chip Attiny84.

Siap untuk transfer paper ke PCB
Siap untuk transfer paper ke PCB

Dalam desain ini relay sengaja saya pindah ke sebelah kiri supaya tidak tersentuh tangan saat mengeset nilai-nilai ambang dengan tombol di sebelah kanan. Berikut adalah daftar penggunaan pin ATtiny84.

Pin fisik Attiny84 Pin I/O Arduino Fungsi Pin
13 0 Soil Moisture sensor
12 1 Relay utk pompa air
11, 10, 9, 8 2, 3, 4, 5 LCD – Data
7 6 Tombol Minus
6 7 Tombol Plus & Sensor Suhu
5 8 Tombol Mode
3 9 LCD – Enable
2 10 LCD – RS

Di bawah ini adalah Bill of Materials dalam 2 format, yaitu Assembly List yang berguna saat perakitan dan daftar komponen yang berguna saat belanja komponen.

Assembly List

Label Part Type Properties
7805 Voltage Regulator – 5V package TO220 [THT]; voltage 5V
AC Screw terminal – 2 pins package THT; hole size 1.0mm,0.508mm; pins 2; pin spacing 0.137in (3.5mm)
ATTiny84 DIP – 14 pins package DIP (Dual Inline) [THT]; hole size 1.0mm,0.508mm; true; chip label IC; pins 14; pin spacing 300mil
C1 Electrolytic Capacitor package 100 mil [THT, electrolytic]; capacitance 10µF; voltage 6.3V
C2 Tantalum Capacitor package 100 mil [THT, tantalum]; capacitance 1 μF; voltage 6.3V
C3 Electrolytic Capacitor package 100 mil [THT, electrolytic]; capacitance 10µF; voltage 6.3V
D1 Rectifier Diode package 300 mil [THT]; type Rectifier; part # 1N4001
DC Power plug
Kecerahan Trimmer Potentiometer package THT; size Trimmer – 6mm; track Linear; type Trimmer Potentiometer; maximum resistance 10kΩ
Kecerahan1 Trimmer Potentiometer package THT; size Trimmer – 6mm; track Linear; type Trimmer Potentiometer; maximum resistance 10kΩ
LCD1 LCD screen type Character; pins 16
LED2 Green LED – 5mm package 5 mm [THT]; leg yes; color Green (570nm)
LED3 Red LED – 5mm package 5 mm [THT]; leg yes; color Red (633nm)
Min Pushbutton package [THT]
MODE Pushbutton package [THT]
NPN NPN-Transistor package TO92 [THT]; type NPN
Plus Pushbutton package [THT]
R1 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 10kΩ; pin spacing 400 mil
R2 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 10kΩ; pin spacing 400 mil
R3 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 10kΩ; pin spacing 400 mil
R4 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 10kΩ; pin spacing 400 mil
R5 1k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 1kΩ; pin spacing 400 mil
R7 220 Ω Resistor package THT; tolerance ±5%; bands 4; resistance 220Ω; pin spacing 400 mil
R8 220 Ω Resistor package THT; tolerance ±5%; bands 4; resistance 220Ω; pin spacing 400 mil
Relay Relay T73 voltage 5V
SOIL Generic female header – 3 pins package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 3; pin spacing 0.1in (2.54mm)
T1 LM35 Temperature Sensor package TO92 [THT]; type LM35

Shopping List

Amount Part Type Properties
1 Power plug
2 Electrolytic Capacitor package 100 mil [THT, electrolytic]; capacitance 10µF; voltage 6.3V
1 Tantalum Capacitor package 100 mil [THT, tantalum]; capacitance 1 μF; voltage 6.3V
1 Rectifier Diode package 300 mil [THT]; type Rectifier; part # 1N4001
1 Green LED – 5mm package 5 mm [THT]; leg yes; color Green (570nm)
1 Red LED – 5mm package 5 mm [THT]; leg yes; color Red (633nm)
1 DIP – 14 pins package DIP (Dual Inline) [THT]; hole size 1.0mm,0.508mm; true; chip label IC; pins 14; pin spacing 300mil
1 Screw terminal – 2 pins package THT; hole size 1.0mm,0.508mm; pins 2; pin spacing 0.137in (3.5mm)
1 Generic female header – 3 pins package THT; hole size 1.0mm,0.508mm; row single; form ♀ (female); pins 3; pin spacing 0.1in (2.54mm)
2 Trimmer Potentiometer package THT; size Trimmer – 6mm; track Linear; type Trimmer Potentiometer; maximum resistance 10kΩ
4 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 10kΩ; pin spacing 400 mil
1 1k Ω Resistor package THT; tolerance ±5%; bands 4; resistance 1kΩ; pin spacing 400 mil
2 220 Ω Resistor package THT; tolerance ±5%; bands 4; resistance 220Ω; pin spacing 400 mil
1 Voltage Regulator – 5V package TO220 [THT]; voltage 5V
1 LM35 Temperature Sensor package TO92 [THT]; type LM35
1 NPN-Transistor package TO92 [THT]; type NPN
3 Pushbutton package [THT]
1 LCD screen type Character; pins 16
1 Relay T73 voltage 5V

Sedangkan di bawah ini adalah source code yang saya pakai. Anda bisa turut mengembangkan hardware & software nge-Pot 84 ini.

/*
Soil Moisture Sensor with LCD
Dewo, 27/09/2012
*/

#include <LiquidCrystal.h>
//LiquidCrystal lcd(10, 9, 5, 4, 3, 2);
LiquidCrystal lcd(10, 9, 2, 3, 4, 5);

#include <EEPROM.h>

#define soil_pin 0        // pin sensor soil moisture
#define temp_pin 7        // pin sensor humidity & temp DHT11
#define tombol_pin 8      // pin tombol mode
#define up_pin 7          // tombol +
#define down_pin 6        // tombol -
#define jeda_sensor 1000  // jeda pembacaan sensor
#define jeda_tombol 150   // jeda penekanan tombol
#define relay1_pin 1      // relay 1
//#define relay2_pin 6    // relay 2

int mode = 0;
unsigned long prev_millis = 0;
unsigned long prev_sensor = 0;
int batas_bawah;
int batas_atas;
int relay1_state = LOW;

byte derajat[8] = {
  0b00100,
  0b01010,
  0b00100,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

void setup() {
  // initial threshold
  //write_batas(0, 300);
  //write_batas(4, 500);
  
  // create custom char
  lcd.createChar(0, derajat);

  for (int i=2; i<=5; i++) pinMode(i, OUTPUT);
  pinMode(8, INPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  
  pinMode(relay1_pin, OUTPUT);
  digitalWrite(relay1_pin, LOW);
  // Baca EEPROM
  batas_bawah = read_batas(0);
  batas_atas = read_batas(4);
  
  // Init LCD
  lcd.begin(16, 2);
  lcd.print("Ngepot Attiny 84");
  lcd.setCursor(0, 1);
  lcd.print("         by Dewo");
  delay(5000);
 
  // tampilkan sensor2
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 0);
  lcd.print("Soil  Temp  Pump");
  lcd.setCursor(0, 1);
  lcd.print("                ");
}

void loop() {
  read_button();
  read_sensors();  
  
  if (mode == 0) {
    //
  }
  else if (mode == 1) {
    read_button2();
  }
  else {
    read_button2();
  }
}

void read_sensors() {
  if (millis() - prev_sensor > jeda_sensor) {
    // mengindera soil moisture
    read_soil();
    // mengindera DHT
    read_temp();
    delay(10);
    prev_sensor = millis();
  }
}

void read_soil() {
  int soil_val = analogRead(soil_pin);
  if (mode == 0) {
    // hapus baris
    lcd.setCursor(0, 1);
    lcd.print("      ");
    lcd.setCursor(0, 1);
    lcd.print(soil_val);
  }
  
  //lcd.setCursor(0, 0);
  if (soil_val <= batas_bawah) {
    lcd.blink();
    // jalankan pompa
    if (relay1_state == LOW) {
      relay1_state = HIGH;
      digitalWrite(relay1_pin, relay1_state);
      if (mode == 0) {
        lcd.setCursor(12, 1);
        lcd.print("    ");
        lcd.setCursor(12, 1);
        lcd.print("ON");
      }
    }
  }
  else if (soil_val >= batas_atas) {
    lcd.noBlink();
    // matikan pompa
    if (relay1_state == HIGH) {
      relay1_state = LOW;
      digitalWrite(relay1_pin, relay1_state);
      if (mode == 1) {
        lcd.setCursor(12, 1);
        lcd.print("    ");
        lcd.setCursor(12, 1);
        lcd.print("x");
      }
    }
  }
}

void read_temp() {
  if (mode == 0) {
    long samples = 0;
    int temp_val;
    for (int i = 0; i <5; i++) {
      temp_val = analogRead(temp_pin);
      //long c = ((100 * 1.1 * temp_val) / 1024) * 10;
      samples += 5.0 * temp_val * 100.0 / 1024.0;
      delay(1);
    }
    samples /= 5;
    lcd.setCursor(6, 1);
    lcd.print("      ");
    // tuliskan nilai sensing
    lcd.setCursor(6, 1);
    lcd.print(samples);
    lcd.write((byte)0);
    lcd.write("C");
  }
}

void refresh_batas(int v) {
  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print(v);
  delay(50);
}

void read_button2() {
  int btn_up = digitalRead(up_pin);
  if (btn_up == HIGH && millis() - prev_millis > jeda_tombol) {
    if (mode == 1) {
      batas_bawah++;
      if (batas_bawah > 1020) batas_bawah = 1020;
      refresh_batas(batas_bawah);
    }
    else if (mode == 2) {
      batas_atas++;
      if (batas_atas > 1020) batas_atas = 1020;
      refresh_batas(batas_atas);
    }
    prev_millis = millis();
  }
  
  int btn_down = digitalRead(down_pin);
  if (btn_down == HIGH && millis() - prev_millis > jeda_tombol) {
    if (mode == 1) {
      batas_bawah--;
      if (batas_bawah <= 0) batas_bawah = 0;
      refresh_batas(batas_bawah);
    }
    else if (mode == 2) {
      batas_atas--;
      if (batas_atas <= 0) batas_atas = 0;
      refresh_batas(batas_atas);
    }
    prev_millis = millis();
  }
}

void read_button() {
  int btn = digitalRead(tombol_pin);
  unsigned long mi = millis();
  if (btn == HIGH && mi - prev_millis > jeda_tombol) {
    // Action sebelum ganti mode
    if (mode == 1) {
      int prev_bawah = read_batas(0);
      if (prev_bawah != batas_bawah) {
        write_batas(0, batas_bawah);
        lcd.setCursor(0, 1);
        lcd.print(batas_bawah);
        lcd.print(" -> B");
        delay(1000);
      }
    }
    else if (mode == 2) {
      int prev_atas = read_batas(4);
      if (prev_atas != batas_atas) {
        write_batas(4, batas_atas);
        lcd.setCursor(0, 1);
        lcd.print(batas_atas);
        lcd.print(" -> A");
        delay(1000);
      }
      if (batas_bawah > batas_atas) {
        lcd.clear();
        lcd.print("ERROR NilaiBatas");
        lcd.setCursor(0, 1);
        lcd.print("Bawah > Atas ???");
        delay(2000);
      }
    }
    // Ganti mode
    mode++;
    if (mode >= 3) mode = 0;
    // Action setelah ganti mode
    lcd.clear();
    if (mode == 0) {
      lcd.setCursor(0, 0);
      lcd.print("Soil  Temp  Pump");
      lcd.noBlink();
      delay(1);
    }
    else if (mode == 1) {
      lcd.setCursor(0, 0);
      lcd.print("Batas BAWAH Soil");
      lcd.setCursor(0, 1);
      batas_bawah = read_batas(0);
      refresh_batas(batas_bawah);
    }
    else {
      lcd.setCursor(0, 0);
      lcd.print("Batas ATAS Soil ");
      lcd.setCursor(0, 1);
      batas_atas = read_batas(4);
      refresh_batas(batas_atas);
    }
    prev_millis = millis();
  }
}

int read_batas(int a) {
  int hsl = 0;
  for (int i = a; i < a+4; i++) {
    hsl += EEPROM.read(i);
  }
  return hsl;
}

int tuliskan(int nilai, int i) {
  if (nilai < 255) {
    if (nilai > 0) {
      EEPROM.write(i, nilai);
      return 0;
    }
    else {
      EEPROM.write(i, 0);
      return 0;
    }
  }
  else {
    EEPROM.write(i, 255);
    return nilai - 255;
  }
}

void write_batas(int mulai, int b) {
  int sisa = b;
  for (int i = mulai; i < mulai+4; i++) {
    sisa = tuliskan(sisa, i);
  }
}

Semoga proyek ini dapat bermanfaat bagi banyak orang. Sampai jumpa lagi di ngoprek selanjutnya. Salam…

Peringatan:

  • Seperti biasa, desain & prototype ini mengikuti azas Open Source Hardware. Anda bisa meneruskan lisensi ini untuk membuat & mengembangkannya.
  • Rangkaian ini menggunakan relay yang bisa digunakan untuk mengontrol piranti lain dengan tegangan tinggi (s/d 240 Volt). Berhati-hatilah saat bekerja dengan tegangan tinggi karena dapat mencederai Anda atau orang lain, bahkan bisa menyebabkan kematian. Jangan hubungkan dengan tegangan tinggi jika Anda tidak yakin atas apa yang Anda lakukan.
Iklan

3 pemikiran pada “nge-Pot 84 with LCD (Pot Elektronik Open Source Hardware)

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.