กดหมายเลขบน Keypad (Arduino) ควบคุมการปรับค่าดิวตี้ และสัญญาณพัลส์ PWM

Remy_Martin (Permpol Thanapunnamas) June 28, 2020, 5:26pm #43

ลองแล้วเป็นไงบ้างครับ

1 Like

111156 (ท๊อป ไหน’น) June 29, 2020, 3:24am #44

ยังเป็นยุครับ ต้องกดให้เป็นศูนย์ก่อน 0 =0v ก่อนกดตัวที่เราต้องการ ถึงจะได้ครับ เช่น กด0 ละกด1, กด0ละกด2,กด0ละกด3 , หรือไม่ก็กดย้ำๆ ถึงได้
หรือถ้ากด0,1,2,3 เลย มันจะสลับกัน เหมือนมันนับการกดปุ่มไว้ อะไร ผมก็งง:sweat_smile::thinking:

Remy_Martin (Permpol Thanapunnamas) June 29, 2020, 6:31am #45

เดียวคงต้องต่อเทสดูก่อนครับ ว่าเป็นเหมือนกันไหม

1 Like

111156 (ท๊อป ไหน’น) June 29, 2020, 8:29am #46

ขอบคุณมากครับพี่:pray::grin:

111156 (ท๊อป ไหน’น) June 30, 2020, 3:06pm #47

เป็นยังไงบ้างครับผม😁

Remy_Martin (Permpol Thanapunnamas) June 30, 2020, 5:46pm #48

ลองเทสดูครับ

#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);
}
  
void loop(){  
 

  char key = keypad.getKey();// Read the key

  if(key == '0'){ //เมื่อ กด 0 เข้าเงื่อนไขนี้
      inputA1 = 1024; // แทนค่า inputA1 ด้วย 1024 ที่ทำให้ PWM มี dutycycle 5 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '1'){ //เมื่อ กด 1 เข้าเงื่อนไขนี้
      inputA1 = 900; // แทนค่า inputA1 ด้วย 900 ที่ทำให้ PWM มี dutycycle 10 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '2'){ //เมื่อ กด 2 เข้าเงื่อนไขนี้
      inputA1 = 800; // แทนค่า inputA1 ด้วย 800 ที่ทำให้ PWM มี dutycycle 15 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '3'){ //เมื่อ กด 3 เข้าเงื่อนไขนี้
      inputA1 = 700; // แทนค่า inputA1 ด้วย 700 ที่ทำให้ PWM มี dutycycle 20 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '4'){ //เมื่อ กด 4 เข้าเงื่อนไขนี้
      inputA1 = 600; // แทนค่า inputA1 ด้วย 600 ที่ทำให้ PWM มี dutycycle 30 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '5'){ //เมื่อ กด 5 เข้าเงื่อนไขนี้
      inputA1 = 500; // แทนค่า inputA1 ด้วย 500 ที่ทำให้ PWM มี dutycycle 40 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '6'){ //เมื่อ กด 6 เข้าเงื่อนไขนี้
      inputA1 = 400; // แทนค่า inputA1 ด้วย 400 ที่ทำให้ PWM มี dutycycle 50 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '7'){ //เมื่อ กด 7 เข้าเงื่อนไขนี้
      inputA1 = 300; // แทนค่า inputA1 ด้วย 300 ที่ทำให้ PWM มี dutycycle 60 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '8'){ //เมื่อ กด 8 เข้าเงื่อนไขนี้
      inputA1 = 200; // แทนค่า inputA1 ด้วย 200 ที่ทำให้ PWM มี dutycycle 70 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '9'){ //เมื่อ กด 9 เข้าเงื่อนไขนี้
      inputA1 = 100; // แทนค่า inputA1 ด้วย 100 ที่ทำให้ PWM มี dutycycle 80 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '*'){ //เมื่อ กด * เข้าเงื่อนไขนี้
      inputA1 = 50; // แทนค่า inputA1 ด้วย 50 ที่ทำให้ PWM มี dutycycle 90 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '#'){ //เมื่อ กด # เข้าเงื่อนไขนี้
      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));
}

github.com/Permpol/EleceasyCodeS

แก้ไขต้องกดซ้ำ

committed 05:44PM - 30 Jun 20 UTC

+90 -19

1 Like

111156 (ท๊อป ไหน’น) July 1, 2020, 8:56am #49

เดี๋ยวผมลองดูครับ ขอบคุณมากครับ :pray::sparkles:

Remy_Martin (Permpol Thanapunnamas) July 1, 2020, 1:27am #50

หลักๆ คือผมย้ายตัวคำนวณและจ่าย pwm ออกมาจาก if แล้วเอามาไว้ท้ายแทน เมื่อมีการรับค่ามา ค่านั้นจะถูกคำนวณและจ่ายออกมาทันที ตามโปรแกรมแล้วมันควรจะเป็นอย่างนั้นนะครับ

image

1 Like

111156 (ท๊อป ไหน’น) July 1, 2020, 6:35am #51

ผมลองดูแล้วครับ ได้แล้วครับพี่ :pray::sparkles: กดครั้งเดียวได้เลย สุดยอดเลยคับ

Remy_Martin (Permpol Thanapunnamas) July 1, 2020, 7:59am #52

ปัญหาจริงๆ มันคือตรงนี้ เพราะว่าเงื่อนไขมันไม่เคลียร์ว่าคืออะไร แถมไม่จำเป็นต้องใส่ก็ได้ ก็เอาออกมาซะจบ

image

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

อ่อครับผม ดีใจมาก :smiling_face_with_three_hearts:

111156 (ท๊อป ไหน’น) July 1, 2020, 11:20am #54

video_25630701_181934

:grin::grin:

1 Like

111156 (ท๊อป ไหน’น) July 1, 2020, 11:35am #55

ต่อไปต้องกำหนด เป็นชุดตัวเลขครับ ต้องทำยังไงครับ

เช่น

กด 0 inputA1= 1024
กด 10 inputA1= 1000
กด 15 inputA1 = 950
กด 20 inputA1= 900
กด 25 inputA1 = 850
กด 30 inputA1= 800
กด 35 inputA1 = 750
กด 40 inputA1= 700
กด 45 inputA1 = 650
กด 50 inputA1= 600
กด 55 inputA1 = 550
กด 60 inputA1= 500
กด 65 inputA1 = 450
กด 70 inputA1= 400
กด 75 inputA1 = 350
กด 80 inputA1= 300
กด 85 inputA1 = 250
กด 90 inputA1= 200
กด 95 inputA1 = 150
กด 100 inputA1= 100
กด 105 inputA1 = 50
กด 110 inputA1= 0

ประมาณนี้ครับ :sparkles:จะทำได้ไหมครับช่วนแนะนำผมหน่อยครับ
:pray::pray::sparkles:

Remy_Martin (Permpol Thanapunnamas) July 1, 2020, 3:18pm #56

ผมขอปิดจ๊อบกระทู้นี้ก่อนนะครับ เนื่องจากเป็นคนละประเด็นกัน คำถามอื่นๆ ตั้งกระทู้ใหม่เลยครับ.

โค้ตตัวอย่าง

#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);
}
  
void loop(){  
 

  char key = keypad.getKey();// Read the key

  if(key == '0'){ //เมื่อ กด 0 เข้าเงื่อนไขนี้
      inputA1 = 1024; // แทนค่า inputA1 ด้วย 1024 ที่ทำให้ PWM มี dutycycle 5 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '1'){ //เมื่อ กด 1 เข้าเงื่อนไขนี้
      inputA1 = 900; // แทนค่า inputA1 ด้วย 900 ที่ทำให้ PWM มี dutycycle 10 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '2'){ //เมื่อ กด 2 เข้าเงื่อนไขนี้
      inputA1 = 800; // แทนค่า inputA1 ด้วย 800 ที่ทำให้ PWM มี dutycycle 15 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '3'){ //เมื่อ กด 3 เข้าเงื่อนไขนี้
      inputA1 = 700; // แทนค่า inputA1 ด้วย 700 ที่ทำให้ PWM มี dutycycle 20 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '4'){ //เมื่อ กด 4 เข้าเงื่อนไขนี้
      inputA1 = 600; // แทนค่า inputA1 ด้วย 600 ที่ทำให้ PWM มี dutycycle 30 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '5'){ //เมื่อ กด 5 เข้าเงื่อนไขนี้
      inputA1 = 500; // แทนค่า inputA1 ด้วย 500 ที่ทำให้ PWM มี dutycycle 40 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '6'){ //เมื่อ กด 6 เข้าเงื่อนไขนี้
      inputA1 = 400; // แทนค่า inputA1 ด้วย 400 ที่ทำให้ PWM มี dutycycle 50 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '7'){ //เมื่อ กด 7 เข้าเงื่อนไขนี้
      inputA1 = 300; // แทนค่า inputA1 ด้วย 300 ที่ทำให้ PWM มี dutycycle 60 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '8'){ //เมื่อ กด 8 เข้าเงื่อนไขนี้
      inputA1 = 200; // แทนค่า inputA1 ด้วย 200 ที่ทำให้ PWM มี dutycycle 70 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '9'){ //เมื่อ กด 9 เข้าเงื่อนไขนี้
      inputA1 = 100; // แทนค่า inputA1 ด้วย 100 ที่ทำให้ PWM มี dutycycle 80 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '*'){ //เมื่อ กด * เข้าเงื่อนไขนี้
      inputA1 = 50; // แทนค่า inputA1 ด้วย 50 ที่ทำให้ PWM มี dutycycle 90 %
      Serial.println(String("Read inputA1 = ")+ inputA1);
  }
  if(key == '#'){ //เมื่อ กด # เข้าเงื่อนไขนี้
      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));
}