ช่วยทีครับ Mini Project Arduino + keypad + DHT11 แสดงผลด้วย OLED

มินิโปรเจค เงื่อนไข

1.เมื่อกดปุ่มบน keypad สมมุติเลข 1 ให้แสดงค่า Hum %(ความชื้น)
2.เมื่อกดปุ่มบน keypad สมมุติเลข 2 ให้แสดงค่า Tem (อุณหภูมิ)
3.เมื่อกดปุ่มบน keypad สมมุติเลข 3 ให้แสดงทั้ง 2 ค่าพร้อมกัน
อุปกรณ์ที่ใช้มี Arduino+keypad+DHT11+OLED

#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Adafruit_Sensor.h>
#include "DHT.h"

 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
 
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
 
#define DHTPIN 12     // Digital pin connected to the DHT sensor
 
// Uncomment the type of sensor in use:
#define DHTTYPE    DHT11     // DHT 11
//#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)
 
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
  
}
 
void loop() {
  delay(5000);
 
  //read temperature and humidity
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    
 
  //clear display
  display.clearDisplay();
  // dispiay Name
  display.setTextSize(1);
  display.setCursor(30,20);
  display.print("Thanaphon:P");
  // display temperature
  
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Temp: ");
  display.setTextSize(1);
  display.setCursor(30,0);
  display.print(t);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(1);
  display.print("C");
  
  // display humidity
 
  display.setTextSize(1);
  display.setCursor(0,10);
  display.print("Hum: ");
  display.setTextSize(1);
  display.setCursor(30,10);
  display.print(h);
  display.print(" %"); 
  
  display.display(); 
}
}

ผลรับที่ได้

1 Like

ทำอะไรไปแล้วบ้าง

เขียนCodeให้แสดงความชื้นกับอูณหภูมิขึ้นบนจอแล้วครับ แต่ไม่รู้จะเขียนยังไงให้คีย์แพดไปสั่งงานตามเงื่อนไขครับ พอดีผมไม่มีความรู้ด้านนี้เลย

ต้องการเพิ่มkeypad เข้าไปสั่งงาน เมื่อต้องการให้ค่าใดค่านึงแสดงผลให้กดเลขครับ

เบื้องต้นศึกษาจากกระทู้นี้ครับ

ได้ครับ เดี๋ยวลองดูครับ ขอบคุณครับพี่

ได้ผลยังไง เอามาอัพเดทกันครับ

ตอนนี้แสดงผลโดยใช้keypad กดได้แล้วครับ เหลืออีกเงื่อนไขนึงคือ กด3 ให้แสดงค่าทั้ง2 พร้อมกัน ครับ

นำโค้ตที่แก้ไขเพิ่มเข้าไปมาดูหน่อยครับ

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>                         
 
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

#define DHTPIN  12                        // DHT11 data pin is connected to Arduino pin 8
#define DHTTYPE DHT11                    // DHT11 sensor is used
DHT dht(DHTPIN, DHTTYPE);                // Configure DHT library
 
char temperature[] = "00.0 C";
char humidity[]    = "00.0 %";

 #include <Keypad.h>
#include<stdio.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}; 
byte colPins[COLS] = {5,4, 3, 2}; 
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  // init done
 
  dht.begin();                // Initialize the DHT library
 
  delay(1000);
 
  // Clear the display buffer.
  display.clearDisplay();
 
  //display.drawFastHLine(0, 32, SSD1306_LCDWIDTH, WHITE);


  display.setTextColor(WHITE, BLACK);
  display.setTextSize(1);
  display.setCursor(35, 30);
  display.print("Thanaphon");
  display.setTextSize(1);
  display.setCursor(25,10);
  display.print("6203042513189"); 
  display.setTextSize(1);
  display.setCursor(20,50);
  display.print("Hello Welcome :)"); 
   
  display.display();
  delay(100);
}
 
void loop() {
  //read temperature and humidity
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
  }
 
  //clear display
  display.clearDisplay();
 
  // display temperature
 char key = kpd.getKey();
 if (key == '1'){
  display.setTextSize(1);
  display.clearDisplay();
  display.setCursor(0, 5);
  display.print("TEMP:");
  display.setCursor(30, 5);
  display.print(t);
  display.print("C");
 
 display.setTextSize(1);
  display.setCursor(0,20);
  display.print("HUMIDITY:");
  display.print(h);
  display.print("%"); 
  display.setCursor(20, 20);
  display.drawRect(68, 0, 3, 3, WHITE);     // Put degree symbol ( ° )
  display.display();
  display.clearDisplay();
 }  
if (key == '5'){
  display.setTextSize(2);
  display.setCursor(0,0);
  display.print("Temp:");
  display.setTextSize(2);
  display.setCursor(0,30);
  display.print(t);
  display.setTextSize(1);
  display.print("C");
  display.display();
  display.clearDisplay();
}
  // display humidity
   
if (key == '9'){
  display.setTextSize(2);
  display.setCursor(0,0);
  display.print("Humidity");
  display.setTextSize(2);
  display.setCursor(0,30);
  display.print(h);
  display.print(" %"); 
  display.display();
  display.clearDisplay();
  

  



}
}

เป็นไปตามเงื่อนไขที่ต้องการแล้วครับ

1 Like

เยี่ยมเลยครับ ช่วยลงโค้ตที่สำเร็จไว้ให้ศึกษาต่อด้วยนะครับ

สอบถามเพิ่มเติมครับ ถ้าผมจะใช้พวกPort 5 v ,3.3v, Gnd มาสั่งการเหมือนกับสวิตช์ต้องใช้code ประมาณไหนครับ

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