
ขอสอบถามครับ ใช้โค๊ดนี้
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to row pinouts
byte colPins[COLS] = {5,4,3,2}; //connect to column pinouts
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(9600);
}
void loop(){
void setup(){
Serial.begin(9600);
}
void loop(){
char key = keypad.getKey();
if (key != NO_KEY){
Serial.print(" num = "); ตรงนี้ครับ
Serial.println(key);
}
}
อยากให้ แสดงผลโดยการกดคีแพดหลายๆครั้งแบบไม่ต้องขั้นบรรทัดใหม่ ให้แสดงผลเช่น num =123 โดยไม่ให้ num แสดงผลซ้ำ ผมต้องเพิ่มเติมโค๊ดยังไงบ้างครับ รบกวนด้วยครับ ขอบคุณครัยบ
ง่าย ๆ ครับ โฟกัสที่คำสั่ง Serial.print มี 2 แบบ
Serial.print(); // แบบนี้ไม่ขึ้นบรรทัดใหม่
Serial.println(); // มี ln ต่อท้าย แปลว่าขึ้นบรรทัดใหม่ ( ln = line new = บรรทัดใหม่ คำนี้ผมตั้งจำใช้เอง)
ถ้าตามโคดจุดนี้ครับ
Serial.print(" num = "); ตรงนี้ครับ
Serial.print(key);
ดูตามนี้ครับ https://www.arduino.cc/en/Serial/Print
หมายถึงว่าจะให้คำว่า num แสดงครั้งเดียว แล้วตัวเลขที่เรากดจากคีแพดอยู่บรรทัดเดียวกันแต่เรียงลำดับจาดการกดอะครับ เช่น กดเลข 1 ครั้งแรกจะได้ num1 กดเลข3 ครั้งที่สองจะได้ num 13 แบบนี้อ่ะครับ
เขียนเก็บใส่ตัวแปรแล้วแสดงผล ลองฝึกดูนะครับไม่ยาก ตามตัวอย่างนี้
https://www.arduino.cc/en/Tutorial/StringAppendOperator
#include <Keypad.h>
#include <SPI.h>
#include <nRF24L01p.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27 // <
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7);
nRF24L01p receiver(7, 8); //CSN,CE
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to row pinouts
byte colPins[COLS] = {5, 4, 3, 2}; //connect to column pinouts
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
boolean valOnePresent = false;
String num1;
int numLength;
void setup() {
Wire.begin();
delay(150);
Serial.begin(115200);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
lcd.begin (20, 4);
receiver.channel(90); // ตั้งช่องความถี่ให้ตรงกัน
receiver.RXaddress("ALL"); // ตั้งชื่อตำแห่นงให้ตรงกัน ชื่อตั้งได้สูงสุด 5 ตัวอักษร
receiver.init();
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home (); // ไปที่ตัวอักษรที่ 0 แถวที่ 1
}
String message;
void loop(){
if(receiver.available()){
receiver.read(); // สั่งให้เริ่มอ่าน
receiver.rxPL(message); // สั่งใหอ่านเก็บไว้ที่ตัวแปร
Serial.println(message);
lcd.setCursor(1,0); // ไปทตัวอักษรที่ 1 แถวที่ 1
lcd.print(" Current(A)=");
lcd.setCursor(14,0); // ไปที่ตัวอักษรที่ 5 แถวที่ 2
lcd.print(message);
message="";
}
if (receiver.available()){
receiver.read(); // สั่งให้เริ่มอ่าน
receiver.rxPL(message); // สั่งใหอ่านเก็บไว้ที่ตัวแปร
Serial.println(message);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
lcd.home (); // ไปที่ตัวอักษรที่ 0 แถวที่ 1
lcd.setCursor(1,1); // ไปทตัวอักษรที่ 1 แถวที่ 1
lcd.print(" Voltage(V)=");
lcd.setCursor(14,1); // ไปที่ตัวอักษรที่ 5 แถวที่ 2
lcd.print(message);
message="";
}
void key(){
char key = keypad.getKey();
if (key != NO_KEY &&
(key == '0' ||key == '1' || key == '2' || key == '3' || key == '4' || key == '5' || key == '6' || key == '7' || key == '8' || key == '9' || key == 'A'||key == 'B' || key == 'C' || key == 'D' || key == '#' || key == '*' ))
{
if (valOnePresent != true)
{
num1 = num1 + key;
numLength = num1.length();
lcd.setCursor(0, 2);
lcd.print("TR-PEA:");
lcd.print(num1);
}
}
}
รบกวนช่วยตรวจสอบโค๊ดให้ผมหน่อยได้ไหมครับ ตอนเขียนแยกไม่มีปัญหา แต่พอเอามาเขียนรวมกับไม่แสดงผล(ภาครับค่า กับ keypad) จะแสดงผลเฉพาะลูปที่อยู่ข้างบน แบบนี้ผมต้องแก้ไขต้องไหนอ่ะครับ รบกวนด้วยนะครับ ขอบคุณครับ
แก้ไขตรงนี้ครับ
if (receiver.available())
ให้ค่าเป็น false ตลอดจึงไม่มาในเงื่อนไขนี้ เพราะถ้าใช้ receiver.read(); แล้ว คำสั่ง receiver.avaliable() จะเป็น false เช็คดูอีกทีครับ
1 |