กด Keypad เพื่อตั้งค่า Alert การทำงาน Pump ตามเงื่อนไข

เนื่องจากกระทู้นี้

กระทู้นี้เป็นตัวอย่างการจำลองการทำงานของ 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

2021-07-28_10-58-08

กด # เพื่อเข้าสู่การตั้งค่า SETUP ALERT ค่าเริ่มต้นคือ 0 เมื่อตั้งค่าเสร็จแล้ว กด A เพื่อเพิ่มค่า ครั้งละ 1 หน่อย กด B เพื่อลบค่าครั้งละ 1 หน่วย ให้กด # ซ้ำเพื่อออก จากการตั้งค่า

2021-07-28_10-59-42

กด C เพื่อเริ่มทำงานตามเงื่อนไข LCD จะแสดงคำว่า AU ต่อท้ายเพื่อให้รู้ว่าเราเข้าโหมดการทำงาน Auto แล้ว และกด D เพื่อหยุดการทำงานตามเงื่อนไข AU ก็จะหายไปด้วย

2021-07-28_11-01-52

ตัวอย่างการทำงานเต็ม

Simulate

:warning: กระทู้นี้นำเงื่อนไขบางส่วนของกระทู้อ้างอิงออกมาเขียน เท่านั้น เงื่อนไขบางอย่างอาจจะไม่ตรง หรืออาจจะมี bug เล็กๆ อยู่บาง ดังนั้นกระทู้นี้เหมาะสำหรับ ผู้ขึ้นโครงสร้างของโปรเจค ซึ่งการกำหนด การทำงานก็สามารถปรับแก้เอาตามใจชอบเลย เช่น กระทู้อ้างอิงต้องการใช้ปุ่มภายนอก มาช่วยในการ กด หรือลด ค่า valueAlert ผมก็คิดว่าจะต่อออกไปเพื่ออะไร ในเมื่อ Keypad เรามี ABCD#* เหลืออยู่ ก็เอามาใช้ซะ เว้นเสียแต่ว่า มีข้อจำกัดด้านอุปกรณ์ คือ Keypad ไม่มี ABCD#* นั้นก็อีกเรื่องหนึ่งครับ