เนื่องจากกระทู้นี้
กระทู้นี้เป็นตัวอย่างการจำลองการทำงานของ Arduino ต่อ Keypad และแสดงผลด้วย LCD 16*2
ตัวอย่างการต่อเบื้องต้น
ตัวอย่างโค้ตที่ใช้งาน
//**main websit https://eleceasy.com
//support https://eleceasy.com/t/keypad-alert-pump/3683
#include <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(5, 4, 3, 2, A4, A5);
const byte ROWS = 4;
const byte COLS = 4;
bool clear = false;
bool clear10 = false;
bool clear100 = false;
bool autoMode = false;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}};
byte rowPins[ROWS] = {A0, A1, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
int LCDRow = 0;
int valueAlert = 0;
#define acRelay 13
int analogPin = A2;
int analogRead_value = 0;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup()
{
Serial.begin(9600);
pinMode(acRelay,OUTPUT);
digitalWrite(acRelay, HIGH);
lcd.begin(16, 2);
lcd.setCursor(LCDRow, 0);
}
void loop()
{
analogRead_value = analogRead(analogPin);
float scale_voltage = map(analogRead_value, 0, 1023, 0, 3000);
float Final_voltage = scale_voltage / 5;
lcd.setCursor(0, 0);
lcd.print(" SOLAR CELL");
if (autoMode == true)
{
lcd.print(" ");
lcd.print("AU"); //แสดง AU เพื่อให้รู้ว่าเข้าสู่โหมดทำงานตามเงื่อนไขแล้ว
}
else
{
lcd.print(" ");
lcd.print(" "); // เคลียร์หน้า AU ออก
}
lcd.setCursor(0, 1);
lcd.print("VOLTS: ");
lcd.print(Final_voltage);
lcd.print(" ");
lcd.print("V");
if (Final_voltage > 100)
{
clear100 = false;
clear10 = false;
}
if (Final_voltage < 100 && Final_voltage > 10 && clear100 != true)
{
lcd.clear();
clear100 = true;
}
if (Final_voltage <= 10 && clear10 != true)
{
lcd.clear();
clear10 = true;
}
char key = keypad.getKey();
if (key == 'C')
{
autoMode = true;
} //if(key == 'C')
if (key == 'D')
{
autoMode = false;
} //if(key == 'D')
while (key == '#')
{
if (clear == false)
{
lcd.clear();
clear = true;
}
lcd.setCursor(0, 0);
lcd.print(" SETUP ALERT");
lcd.setCursor(0, 1);
lcd.print("VALUE: ");
lcd.print("0");
lcd.print(" ");
lcd.print("V");
key = keypad.getKey();
while (key != '#')
{
key = keypad.getKey();
if (key == 'A')
{
valueAlert++;
clear = false;
} //if(key == 'A')
if (key == 'B')
{
valueAlert--;
clear = false;
} //if(key == 'B')
if (clear == false)
{
lcd.clear();
clear = true;
}
lcd.setCursor(0, 0);
lcd.print(" SETUP ALERT");
lcd.setCursor(0, 1);
lcd.print("_VALUE: ");
lcd.print(valueAlert);
lcd.print(" ");
lcd.print("V");
} //while(key != '#')
break;
} //while(key == '#')
//โหมดการทำงาน
if (autoMode == true)
{
Serial.println("Login Mode Auto");
if (Final_voltage >= valueAlert)
{
digitalWrite(acRelay, LOW);
Serial.println("Valve HIGH");
}
else
{
digitalWrite(acRelay, HIGH);
Serial.println("Valve LOW");
}
}
else
{
digitalWrite(acRelay, HIGH);
Serial.println("Valve LOW");
Serial.println("Logout Mode Auto");
}
} //loop ()
หมุนเพื่อซิมผลการรับค่า analog input
กด # เพื่อเข้าสู่การตั้งค่า SETUP ALERT ค่าเริ่มต้นคือ 0 เมื่อตั้งค่าเสร็จแล้ว กด A เพื่อเพิ่มค่า ครั้งละ 1 หน่อย กด B เพื่อลบค่าครั้งละ 1 หน่วย ให้กด # ซ้ำเพื่อออก จากการตั้งค่า
กด C เพื่อเริ่มทำงานตามเงื่อนไข LCD จะแสดงคำว่า AU ต่อท้ายเพื่อให้รู้ว่าเราเข้าโหมดการทำงาน Auto แล้ว และกด D เพื่อหยุดการทำงานตามเงื่อนไข AU ก็จะหายไปด้วย
ตัวอย่างการทำงานเต็ม
Simulate
กระทู้นี้นำเงื่อนไขบางส่วนของกระทู้อ้างอิงออกมาเขียน เท่านั้น เงื่อนไขบางอย่างอาจจะไม่ตรง หรืออาจจะมี bug เล็กๆ อยู่บาง ดังนั้นกระทู้นี้เหมาะสำหรับ ผู้ขึ้นโครงสร้างของโปรเจค ซึ่งการกำหนด การทำงานก็สามารถปรับแก้เอาตามใจชอบเลย เช่น กระทู้อ้างอิงต้องการใช้ปุ่มภายนอก มาช่วยในการ กด หรือลด ค่า valueAlert ผมก็คิดว่าจะต่อออกไปเพื่ออะไร ในเมื่อ Keypad เรามี ABCD#* เหลืออยู่ ก็เอามาใช้ซะ เว้นเสียแต่ว่า มีข้อจำกัดด้านอุปกรณ์ คือ Keypad ไม่มี ABCD#* นั้นก็อีกเรื่องหนึ่งครับ