การกำหนดปุ่มกด (Keypad) เป็นชุดตัวเลข เพื่อสั่ง สัญญาณPWM ออกไปใช้งาน 🛠 ให้ Input A1 , Output pin ~9

111156 (ท๊อป ไหน’น) July 10, 2020, 11:51am #44

OCR1A = int(62.5-(xxx/2));

ตรงนี้หรอครับพี่ …:sweat_smile:ไม่ทราบครับ :pray:

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 2:03pm #45

ตอนกดคีย์ที่ 3 Pwm เปลี่ยนเแปลงไหม?

1 Like

111156 (ท๊อป ไหน’น) July 10, 2020, 3:29pm #46

เปลี่ยนครับ แต่มันขึ้นต่อจากkey2 เช่น กด22 A1 =1024
Key3 กด225 = 900
เมื่อกด22จะ A1=1024 และเมื่อกดต่ออีกที สมมุติกด 5 จะได้เป็น 225 A1 = 900
:face_with_raised_eyebrow:ครับ

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 4:42pm #47

งั้นก็แสดงว่ามันผ่านโด้ตจ่าย pwm ครับที่น้องเลือกมาแสดงว่ามันทำงาน ไหนลองหาดูอีกว่าส่วนไหนไม่ได้ทำงานเลย

1 Like

111156 (ท๊อป ไหน’น) July 10, 2020, 5:34pm #48

ckey = 0;

ส่วนสุดท้ายนี้หรอครับ

111156 (ท๊อป ไหน’น) July 10, 2020, 5:39pm #49

while (ckey == 2)
    {
        key = keypad.getKey(); // Read the key
        
        if (key != NO_KEY)
        
        {
            Serial.println(key);
            varKey3 = String(key);
            ckey++;

หรือชุดนี้ครับ

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 5:39pm #50

คำสั่งนี้ก็ทำงานครับ ลองแทนค่าจริงๆ ดูครับ

1 Like

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 5:42pm #51

ส่วนนี้ก็ทำครับ ยังไม่ถูก พอเรากดคีย์ที่ 3 มันก็รับค่าจากส่วนนี้ไป จ่าย PWM ต่อถูกไหมครับ

1 Like

111156 (ท๊อป ไหน’น) July 10, 2020, 5:53pm #52

ครับพี่ :thinking: เหลือตรงไหนกันนะ…:grin:

if (ckey == 3)
    {
        String KeySum = varKey1 + varKey2 + varKey3;
        Serial.println(String("KeySum = ") + KeySum);

:thinking::thinking:

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 6:00pm #53

น้องเขียนขึ้นมาเองนะครับ มองข้ามไปได้ยังไง โถ่วววว

1 Like

111156 (ท๊อป ไหน’น) July 10, 2020, 6:04pm #54

while (ckey == 0)
    {
        key = keypad.getKey(); // Read the key
        
        if (key != NO_KEY) //เช็คการกดปุ่ม

        {
            Serial.println(key);
            varKey1 = String(key);
            ckey++;
        }
    }

    while (ckey == 1)
    {
        key = keypad.getKey(); // Read the key
        
        if (key != NO_KEY)
        
        {
            Serial.println(key);
            varKey2 = String(key);
            ckey++;
        }
    }

หรือจะเป็นตรงนี้ เพราะมันไม่เริ่ม กดครั้งที่1,2 มันไปต่อครั้งที่3 ของkey2หลัก ครับ:grin::pray:

111156 (ท๊อป ไหน’น) July 10, 2020, 6:02pm #55

ทำไมมันไม่ทำงานครับพี่ :pray::grin:

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 6:04pm #56

คำอธิบายนี้ ถูกต้องแล้วครับ

1 Like

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 6:08pm #57

วิธีแก้กรณีนี้ก็คือ น้องจะต้องทำยังไงก็ได้ให้ ส่วนที่ไม่ได้ทำงานนี้ ทำครับ เพราะมันไปจำค่าของ 2 หลักไว้ มันก็เลยไม่ได้เริ่มทำ ในส่วนนี้ ลองคิดแล้วเสนอมาให้พี่ฟังหน่อย

1 Like

111156 (ท๊อป ไหน’น) July 10, 2020, 6:18pm #58

ผมจะทำยังไงครับให้โปรแกรมจำ ค่าของ 2หลัก กับค่า3หลักแยกส่วนกัน ใช้ตัวเลขเดียวกัน แต่ไม่ให้เก็บค่าซ้ำกันนะครับ แต่ให้มันทำงานร่วมกันได้ครับ

111156 (ท๊อป ไหน’น) July 10, 2020, 6:19pm #59

ตั้งตัวแปรใหม่หรอครับ :pray::sweat_smile:

Remy_Martin (Permpol Thanapunnamas) July 10, 2020, 8:02pm #60

ลองคิดดูสิครับ ผมอยากให้ฝึกคิด ประยุกค์ ให้ได้ ไม่งั้นเดียวไปติดจุดอื่นน้องก็จะคิดไม่ได้ แก้ไม่ตกอีกอยู่ดี คำตอบของผมมี แต่ผมยังไม่บอกครับ อยากฟังของเราเองมากกว่า คิดแล้วลงมือแก้ไข แล้วเทสดูว่าได้ผลอย่างที่คิดไหม

1 Like

111156 (ท๊อป ไหน’น) July 11, 2020, 3:19am #61

คับพี่เดี๋ยวลองเทสดูครับ ขอบคุณมากครับ🙏

111156 (ท๊อป ไหน’น) July 13, 2020, 5:54am #62

#include <Keypad.h>
float xxx;
unsigned long pwm1;
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
int inputA1;
char keys[ROWS][COLS] = {

    {'1', '2', '3'},
    {'4', '5', '6'},
    {'7', '8', '9'},
    {'*', '0', '#'}};

byte rowPins[ROWS] = {8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 3, 2};    //connect to the column pinouts of the keypad

//Create an object of keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup()
{
    pinMode(9, OUTPUT);
    
    TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1B0) | _BV(WGM11);
    TCCR1B = _BV(WGM13) | _BV(CS11);
    
    Serial.begin(9600);
}
char str_key;
char str_key1;
char key;
char key1;
int ckey = 0;
String varKey1 = "";
String varKey2 = "";
String varKey3 = "";

void loop()
{
  
    while (ckey == 0)
    {
        key = keypad.getKey(); // Read the key
        
        if (key != NO_KEY)

        {
            Serial.println(key);
            varKey1 = String(key);
            ckey++;
        }
    }

    while (ckey == 1)
    {
        key = keypad.getKey(); // Read the key
        
        if (key != NO_KEY)
        
        {
            Serial.println(key);
            varKey2 = String(key);
            ckey++;
        }
    }

    if (ckey == 2)
    {
        String KeySum = varKey1 + varKey2;
        Serial.println(String("[KeySum]:คุณกดค่าแรงดันไฟฟ้า = ")+ KeySum +(" V :กด # เพื่อตกลง [หรือ?] :กดปุ่มหมายเลขเพิ่มอีกตามค่าแรงดันไฟฟ้าที่ต้องการ"));
        if (key!='#'){
            str_key += key;
        
        if (KeySum == "00")
        {                   //เมื่อ กด 00 เข้าเงื่อนไขนี้
            inputA1 = 1024; // แทนค่า inputA1 ด้วย 1024 ที่ทำให้ PWM มี dutycycle 0 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum == "10")
        {                   //เมื่อ กด 10 เข้าเงื่อนไขนี้
            inputA1 = 1012; // แทนค่า inputA1 ด้วย 1012 ที่ทำให้ PWM มี dutycycle 5 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "15")
        {                  //เมื่อ กด 15 เข้าเงื่อนไขนี้
            inputA1 = 989; // แทนค่า inputA1 ด้วย 989 ที่ทำให้ PWM มี dutycycle 10 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "20")
        {                   //เมื่อ กด 20 เข้าเงื่อนไขนี้
            inputA1 = 966; // แทนค่า inputA1 ด้วย 966 ที่ทำให้ PWM มี dutycycle 13 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "25")
        {                  //เมื่อ กด 25 เข้าเงื่อนไขนี้
            inputA1 = 943; // แทนค่า inputA1 ด้วย 943 ที่ทำให้ PWM มี dutycycle 15 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum == "30")
        {                   //เมื่อ กด 30 เข้าเงื่อนไขนี้
            inputA1 = 920; // แทนค่า inputA1 ด้วย 920 ที่ทำให้ PWM มี dutycycle 18 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "35")
        {                  //เมื่อ กด 35 เข้าเงื่อนไขนี้
            inputA1 = 897; // แทนค่า inputA1 ด้วย 897 ที่ทำให้ PWM มี dutycycle 20 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "40")
        {                   //เมื่อ กด 40 เข้าเงื่อนไขนี้
            inputA1 = 874; // แทนค่า inputA1 ด้วย 874 ที่ทำให้ PWM มี dutycycle 23 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "45")
        {                  //เมื่อ กด 45 เข้าเงื่อนไขนี้
            inputA1 = 857; // แทนค่า inputA1 ด้วย 857 ที่ทำให้ PWM มี dutycycle 25 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "50")
        {                   //เมื่อ กด 50 เข้าเงื่อนไขนี้
            inputA1 = 828; // แทนค่า inputA1 ด้วย 828 ที่ทำให้ PWM มี dutycycle 28 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum == "55")
        {                   //เมื่อ กด 55 เข้าเงื่อนไขนี้
            inputA1 = 805; // แทนค่า inputA1 ด้วย 805 ที่ทำให้ PWM มี dutycycle 30 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "60")
        {                  //เมื่อ กด 60 เข้าเงื่อนไขนี้
            inputA1 = 782; // แทนค่า inputA1 ด้วย 782 ที่ทำให้ PWM มี dutycycle 33 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "65")
        {                   //เมื่อ กด 65 เข้าเงื่อนไขนี้
            inputA1 = 759; // แทนค่า inputA1 ด้วย 759 ที่ทำให้ PWM มี dutycycle 35 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "70")
        {                  //เมื่อ กด 70 เข้าเงื่อนไขนี้
            inputA1 = 736; // แทนค่า inputA1 ด้วย 736 ที่ทำให้ PWM มี dutycycle 38 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum == "75")
        {                   //เมื่อ กด 75 เข้าเงื่อนไขนี้
            inputA1 = 713; // แทนค่า inputA1 ด้วย 713 ที่ทำให้ PWM มี dutycycle 30 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "80")
        {                  //เมื่อ กด 80 เข้าเงื่อนไขนี้
            inputA1 = 690; // แทนค่า inputA1 ด้วย 690 ที่ทำให้ PWM มี dutycycle 43 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "85")
        {                   //เมื่อ กด 85 เข้าเงื่อนไขนี้
            inputA1 = 667; // แทนค่า inputA1 ด้วย 667 ที่ทำให้ PWM มี dutycycle 45 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "90")
        {                  //เมื่อ กด 90 เข้าเงื่อนไขนี้
            inputA1 = 644; // แทนค่า inputA1 ด้วย 644 ที่ทำให้ PWM มี dutycycle 48 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum == "95")
        {                  //เมื่อ กด 95 เข้าเงื่อนไขนี้
            inputA1 = 621; // แทนค่า inputA1 ด้วย 621 ที่ทำให้ PWM มี dutycycle 50 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        }

while (ckey == 0)
    {
        key1 = keypad.getKey(); // Read the key
        
        if (key1 != NO_KEY)

        {
            Serial.println(key1);
            varKey1 = String(key1);
            ckey++;
        }
    }

    while (ckey == 1)
    {
        key1 = keypad.getKey(); // Read the key
        
        if (key1 != NO_KEY)
        
        {
            Serial.println(key1);
            varKey2 = String(key1);
            ckey++;
        }
    }

  while (ckey == 2)
    {
        key1 = keypad.getKey(); // Read the key
        
        if (key1 != NO_KEY)
        
        {
            Serial.println(key1);
            varKey3 = String(key1);
            ckey++;
        }
    }

    if (ckey == 3)
    {
        String KeySum1 = varKey1 + varKey2 + varKey3;
        Serial.println(String("[KeySum1]:ค่าแรงดันไฟฟ้า = ") + KeySum1 + (" V"));
        
        if (KeySum1 == "100")
        {                   //เมื่อ กด 100 เข้าเงื่อนไขนี้
            inputA1 = 598; // แทนค่า inputA1 ด้วย 598 ที่ทำให้ PWM มี dutycycle 53 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "105")
        {                   //เมื่อ กด 105 เข้าเงื่อนไขนี้
            inputA1 = 575; // แทนค่า inputA1 ด้วย 575 ที่ทำให้ PWM มี dutycycle 55 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum1 == "110")
        {                   //เมื่อ กด 110 เข้าเงื่อนไขนี้
            inputA1 = 552; // แทนค่า inputA1 ด้วย 552 ที่ทำให้ PWM มี dutycycle 58 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "115")
        {                  //เมื่อ กด 115 เข้าเงื่อนไขนี้
            inputA1 = 529; // แทนค่า inputA1 ด้วย 529 ที่ทำให้ PWM มี dutycycle 60 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "120")
        {                   //เมื่อ กด 120 เข้าเงื่อนไขนี้
            inputA1 = 506; // แทนค่า inputA1 ด้วย 506 ที่ทำให้ PWM มี dutycycle 63 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "125")
        {                  //เมื่อ กด 125 เข้าเงื่อนไขนี้
            inputA1 = 483; // แทนค่า inputA1 ด้วย 483 ที่ทำให้ PWM มี dutycycle 65 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum1 == "130")
        {                   //เมื่อ กด 130 เข้าเงื่อนไขนี้
            inputA1 = 460; // แทนค่า inputA1 ด้วย 460 ที่ทำให้ PWM มี dutycycle 68 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "135")
        {                  //เมื่อ กด 135 เข้าเงื่อนไขนี้
            inputA1 = 437; // แทนค่า inputA1 ด้วย 437 ที่ทำให้ PWM มี dutycycle 70 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "140")
        {                   //เมื่อ กด 140 เข้าเงื่อนไขนี้
            inputA1 = 414; // แทนค่า inputA1 ด้วย 414 ที่ทำให้ PWM มี dutycycle 73 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "145")
        {                  //เมื่อ กด 145 เข้าเงื่อนไขนี้
            inputA1 = 391; // แทนค่า inputA1 ด้วย 391 ที่ทำให้ PWM มี dutycycle 75 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "150")
        {                   //เมื่อ กด 150 เข้าเงื่อนไขนี้
            inputA1 = 368; // แทนค่า inputA1 ด้วย 368 ที่ทำให้ PWM มี dutycycle 78 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum1 == "155")
        {                   //เมื่อ กด 155 เข้าเงื่อนไขนี้
            inputA1 = 345; // แทนค่า inputA1 ด้วย 345 ที่ทำให้ PWM มี dutycycle 80 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "160")
        {                  //เมื่อ กด 160 เข้าเงื่อนไขนี้
            inputA1 = 322; // แทนค่า inputA1 ด้วย 322 ที่ทำให้ PWM มี dutycycle 83 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "165")
        {                   //เมื่อ กด 165 เข้าเงื่อนไขนี้
            inputA1 = 299; // แทนค่า inputA1 ด้วย 299 ที่ทำให้ PWM มี dutycycle 85 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "170")
        {                  //เมื่อ กด 170 เข้าเงื่อนไขนี้
            inputA1 = 276; // แทนค่า inputA1 ด้วย 276 ที่ทำให้ PWM มี dutycycle 88 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        if (KeySum1 == "175")
        {                   //เมื่อ กด 175 เข้าเงื่อนไขนี้
            inputA1 = 253; // แทนค่า inputA1 ด้วย 253 ที่ทำให้ PWM มี dutycycle 90 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "180")
        {                  //เมื่อ กด 180 เข้าเงื่อนไขนี้
            inputA1 = 230; // แทนค่า inputA1 ด้วย 230 ที่ทำให้ PWM มี dutycycle 91 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "185")
        {                   //เมื่อ กด 185 เข้าเงื่อนไขนี้
            inputA1 = 207; // แทนค่า inputA1 ด้วย 207 ที่ทำให้ PWM มี dutycycle 92 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "190")
        {                  //เมื่อ กด 190 เข้าเงื่อนไขนี้
            inputA1 = 184; // แทนค่า inputA1 ด้วย 184 ที่ทำให้ PWM มี dutycycle 93 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "195")
        {                  //เมื่อ กด 195 เข้าเงื่อนไขนี้
            inputA1 = 161; // แทนค่า inputA1 ด้วย 161 ที่ทำให้ PWM มี dutycycle 94 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "200")
        {                   //เมื่อ กด 200 เข้าเงื่อนไขนี้
            inputA1 = 138; // แทนค่า inputA1 ด้วย 138 ที่ทำให้ PWM มี dutycycle 95 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "205")
        {                   //เมื่อ กด 205 เข้าเงื่อนไขนี้
            inputA1 = 115; // แทนค่า inputA1 ด้วย 115 ที่ทำให้ PWM มี dutycycle 96 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "210")
        {                   //เมื่อ กด 210 เข้าเงื่อนไขนี้
            inputA1 = 92; // แทนค่า inputA1 ด้วย 92 ที่ทำให้ PWM มี dutycycle 97 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "215")
        {                   //เมื่อ กด 215 เข้าเงื่อนไขนี้
            inputA1 = 69; // แทนค่า inputA1 ด้วย 69 ที่ทำให้ PWM มี dutycycle 98 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "220")
        {                   //เมื่อ กด 220 เข้าเงื่อนไขนี้
            inputA1 = 46; // แทนค่า inputA1 ด้วย 46 ที่ทำให้ PWM มี dutycycle 99 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }

        if (KeySum1 == "225")
        {                   //เมื่อ กด 255 เข้าเงื่อนไขนี้
            inputA1 = 0; // แทนค่า inputA1 ด้วย 0 ที่ทำให้ PWM มี dutycycle 100 %
            Serial.println(String("Read inputA1 = ") + inputA1);
        }
        
        ICR1 = 62.5;
        pwm1 = inputA1;
        
        xxx = float(pwm1);
        xxx = xxx * ICR1;
        xxx = xxx / 512;
        
        OCR1A = int(62.5 - (xxx / 2));

        ckey = 0;
  }
 }
}

111156 (ท๊อป ไหน’น) July 13, 2020, 6:31am #63

ถ้าจะกด 2หลัก ต้องกด อีกตัวนึงเพื่อให้ครบ3หลักถึงจะสั่งoutput
สมมุติ ผมกด 10 และเลือกกด # outputถึงจะออก
ตอนกดถึง2หลัก จะยังไม่ทำงาน ต้องกดอีกตัว ผมเลือกกด # ถึงสั่งทำงาน และโปรแกรมก็จะให้เริ่มกดใหม่
หรือเราจะกด3หลัก ก็กด 3ตัวเลยตามที่เราตั้งไว้ เช่น กด 100 outputก็จะออกเลย

เลขที่ต้องกดซ้ำเหมือนกัน มี
//10,15,20
//100,105,150,155,200,205

นอกนั้นกดได้หมด ที่ตั้งตัวเลขอื่นๆ

// คือถ้าต้องการกด2หลัก ให้กด2ตัว แล้วกด# ให้เป็นตัวครั้งที่3 เพื่อตกลงทำงาน
และถ้าต้องการกด3หลัก ก็กด3ตัว ก็ทำงานเลย

ผมเทสดู ก็ได้อยู่ครับ แต่ผมคิดว่าโปรแกรมมันยังไม่เวิร์คสำหรับพี่55 มันยังมั่วๆอยู่ ผมไม่เก่งจริงๆครับ😅
ช่วยเทสดูให้หน่อยครับพี่🙏