ผมทำ dht22 กับ pm 2.5 sensor

พอดีอยากมันขึ้นยังงี้ ควรจะเพิ่มยัง

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "DHT.h"
#include "PM_Sensor.h"     
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define input_sensor V5 
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

#define DHTPIN 2     // 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 dhtA(12, DHT22);                           // DHT instance named dhtA, D1 and sensor type

const int sharpLEDPin = D3; // Arduino digital pin D3 connect to sensor LED.
const int sharpVoPin = A0; // Arduino analog pin A0 connect to sensor Vo.

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "rc61xiWu4TM08ct8Q8sNlwy8Ok8wrULd";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Nologo_2.4G";
char pass[] = "0810669333";
void setup() {
  Serial.begin(115200);

  dhtA.begin();

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  Blynk.begin(auth, ssid, pass);
  pinMode(sharpLEDPin, OUTPUT);
  delay(1000);
  display.clearDisplay();
  display.setTextColor(WHITE);
}
int ton=0;
void loop() {

  climateRoutine();                           // Climate routine
  delay(1000);                                // 1 sec between routines
}

void climateRoutine() {
    byte h1 = dhtA.readHumidity();            // f1 and h1 are celsius and humidity readings
    // byte t1 = dhtA.readTemperature(true);  // for temperature in farenheits
    byte t1 = dhtA.readTemperature();         // from DHT/A
    Blynk.virtualWrite(V0, t1);               //  Set Virtual Pin 0 frequency to PUSH in Blynk app
    Blynk.virtualWrite(V1, h1);               //  Set Virtual Pin 1 frequency to PUSH in Blynk app
  
// Turn on the dust sensor LED by setting digital pin LOW.
digitalWrite(sharpLEDPin, LOW);
// Wait 0.28ms before taking a reading of the output voltage as per spec.
delayMicroseconds(280);
// Record the output voltage. This operation takes around 100 microseconds.
int VoRaw = analogRead(sharpVoPin);
// Turn the dust sensor LED off by setting digital pin HIGH.
digitalWrite(sharpLEDPin, HIGH);
// Wait for remainder of the 10ms cycle = 10000 - 280 - 100 microseconds.
delayMicroseconds(280);
// Print raw voltage value (number from 0 to 1023).
#ifdef PRINT_RAW_DATA
//printValue("VoRaw", VoRaw, true);
Serial.println("");
#endif // PRINT_RAW_DATA
 
// Use averaging if needed.
float Vo = VoRaw;

#ifdef USE_AVG
VoRawTotal += VoRaw;
VoRawCount++;
if ( VoRawCount >= N ) {
Vo = 1.0 * VoRawTotal / N;
VoRawCount = 0;
VoRawTotal = 0;
} else {
return;
}
#endif // USE_AVG
 
// Compute the output voltage in Volts.
Vo = Vo / 1024.0 * 3.3;
//printFValue("Vo", Vo, "V");
 
// Convert to Dust Density in units of ug/m3.
float dV = Vo - Voc;
if ( dV < 0 ) {
dV = 0;
Voc = Vo;
}

float dustDensity = dV / K * 100.0;
t1 = dhtA.readTemperature(); 
send_blynk(dustDensity);
  if(ton == 0){tone(D5, 0, 50);}
  if(ton == 1){tone(D5, 1000, 50);delay(50);tone(D5, 0, 50);delay(50);}
  if(ton == 2){tone(D5, 2500, 50);delay(50);tone(D5, 0, 50);delay(50);}
}
void send_blynk(float Density){
   Blynk.virtualWrite(input_sensor,Density);
 
   if(Density > 0.0 && Density < 26.0){ ton=0;
   Blynk.setProperty(input_sensor,"label","AQI อากาศดีมาก"); 
    Blynk.setProperty(input_sensor,"color","#50c9f4");  }
   if(Density > 25 && Density < 51.0){ ton=0;
   Blynk.setProperty(input_sensor,"label","AQI อากาศดี"); 
    Blynk.setProperty(input_sensor,"color","#78c150"); } 
   if(Density > 50 && Density < 101.0){ ton=0;
   Blynk.setProperty(input_sensor,"label","AQI อากาศปานกลาง"); 
    Blynk.setProperty(input_sensor,"color","#fff46b");   }
   if(Density > 100 && Density < 201.0){ ton=1;
   Blynk.setProperty(input_sensor,"label","AQI อากาศเริ่มมีผลกระทบต่อสุขภาพ"); 
   Blynk.setProperty(input_sensor,"color","#f89836"); 
    }
   if(Density > 200){ ton=2;
   Blynk.setProperty(input_sensor,"label","AQI อากาศมีผลกระทบต่อสุขภาพ"); 
   Blynk.setProperty(input_sensor,"color","#ec363a"); 
   }
   
  




























  
  //clear display
  display.clearDisplay();

  // display temperature
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Temperature: ");
  display.setTextSize(1);
  display.setCursor(0,10);
  display.print(t1);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(248);
  display.setTextSize(1);
  display.print("C");
  
  // display humidity
  display.setTextSize(1);
  display.setCursor(0, 20);
  display.print("Humidity: ");
  display.setTextSize(1);
  display.setCursor(0, 30);
  display.print(h1);
  display.print(" %"); 
  
  display.display(); 
}

ภาพ

ภาพ

ขอบคุณครับ :smile: :smiling_face_with_three_hearts: :joy:
ผมนี่ลองใส่แต่ send_blynk(dustDensity),(t1),(h1)
นึกไม่ถึงว่าจะเป็น send_blynk(dustDensity,t1,h1)
55555555555555555555 :joy:

สรุปปัญหาคือ โยนตัวแปรเข้าไปไม่ครบ ฟังก์ชัน send_blynk ผ่านตัวแปรได้แค่ตัวเดียว แต่ข้างใน มีการใช้ ตัวแปรอื่นนอกฟังก์ชันด้วยคือ t1

วิธีแก้ไขคือ ผ่านค่าตัวแปรที่ต้องการให้ครบ เวลาส่งตัวแปรเข้าไปก็ส่งให้ครบด้วย

เจอปัญหาครับ พออัพโหลดลงบอร์ด ตัว sensor pm 2.5 ไม่ทำงาน แต่ตัวอื่นปกติ

คนละประเด็นครับ อ้นนี้ต้อง ดีบัคดูว่า แต่ละเงื่อนไขทำงานถูกต้องหรือไม่ และไปติดตรงไหน

จะให้ง่ายกว่านั้น prinf ออกมาดูเลยว่า เงื่อนไขที่เราจะดูแต่ละตัวแปรมีค่าเป็นอะไรบ้าง มันทำงานถูกต้องไหม

ดูยังไงครับ ผมมือใหม่จริงๆ พึ่งมาแตะตอนทำโปรเจคนี่แหละ

กดออกมาดูครับ

ภาพ

มันขึ้นแบบนี้ครับ

ถ้าแยกโค้ดใช้ได้ปกติ ผมย้าย digitalpin ไม่ให้ซ้ำกันแล้ว

เลือก baudrate ให้ตรงกับโค้ตตัวเองใช้ด้วยครับ

นี่ครับ

ปัญหาคือ มีการทำงานใน void loop นานเกินไปทำให้ บอร์ดดึง wifi ไม่ได้ เลยรีเซต น่าจะช้า เนื่องจาก มีคำสั่ง lcd อยู่ด้วย

วิธีแก้ปัญหา ให้ศึกษาการตั้งเวลาการทำงานออกเป็นส่วนๆ. มันจะไม่กวนกัน

ถ้าอยากรู้ว่ามันแก้ปัญหายังไง ดูจากคนที่เขาเคยแก้แล้วด้านล่างนี้

wifi ใช้ได้ครับ dht22 ใช้ได้ จะใช้ไม่ได้แต่ pm2.5 sensor วิธีเหมือนกันกับที่บอกข้างต้นใช้ไหมครับ

ต้องดูว่ามันขึ้นวนๆ แบบเดิมหรือไม่ ถ้าขึ้นก็ต้องแก้ไขตามที่บอก ถ้าไม่ขึ้น ก็ต้องเอาข้อมูลหลังจากภาพที่ รีเซตมาดู ว่ามันขึ้นอะไรบ้าง

เอาภาพนี้มา ผมตีเป็นรีเซตได้อย่างเดียว

มันได้ค่าอะไรเอามาดูด้วย

ผมเข้าใจละ เหมือนว่า sensor pm2.5 จะทำงาน แต่ทำงานช้า เพราะผมรวมฟังชั่นมันเข้ากับ dht22 แล้วผมสามารถ แยกสองตัวนี้ เป็นฟังชั่นต่างกันได้ยังไง แล้วตอนสุดท้าย ผมอยากให้ มันมาแสดงในจอ oled (ssd1306)


void send_blynk(float Density,float t1,float h1){
 
 
   if(Density > 0.0 && Density < 26.0){ ton=0;
   Blynk.setProperty(input_sensor,"label","AQI อากาศดีมาก"); 
    Blynk.setProperty(input_sensor,"color","#50c9f4");  }
   if(Density > 25 && Density < 51.0){ ton=0;
   Blynk.setProperty(input_sensor,"label","AQI อากาศดี"); 
    Blynk.setProperty(input_sensor,"color","#78c150"); } 
   if(Density > 50 && Density < 101.0){ ton=0;
   Blynk.setProperty(input_sensor,"label","AQI อากาศปานกลาง"); 
    Blynk.setProperty(input_sensor,"color","#fff46b");   }
   if(Density > 100 && Density < 201.0){ ton=1;
   Blynk.setProperty(input_sensor,"label","AQI อากาศเริ่มมีผลกระทบต่อสุขภาพ"); 
   Blynk.setProperty(input_sensor,"color","#f89836"); 
    }
   if(Density > 200){ ton=2;
   Blynk.setProperty(input_sensor,"label","AQI อากาศมีผลกระทบต่อสุขภาพ"); 
   Blynk.setProperty(input_sensor,"color","#ec363a"); 
   }
   
  //clear display
  display.clearDisplay();

Blynk.virtualWrite(input_sensor,Density);
     display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0,10);
    display.println(Density);
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(85,0);
    display.println("ug/m3");


  // display temperature
  display.setTextSize(1);
  display.setCursor(0,20);
  display.print("Temperature: ");
  display.setTextSize(1);
  display.setCursor(0,30);
  display.print(t1);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(248);
  display.setTextSize(1);
  display.print("C");
  
  // display humidity
  display.setTextSize(1);
  display.setCursor(0, 40);
  display.print("Humidity: ");
  display.setTextSize(1);
  display.setCursor(0, 50);
  display.print(h1);
  display.print(" %"); 
  
  display.display(); 
}



ให้รันแบบส่วนท้ายโค้ดแบบ ข้างบนตัวอย่างได้ปกติ

สรุป แยกการทำงานขอบฟังชั่น dht22 and pm sensor2.5 แล้วน้ำมาแสดงบนจอได้ปกติ ทั้ง 3 ค่า ส่วนแสดงบนแอพ คงไม่ยากอะไร

งั้นก็ตามนี้ครับ

ผมแก้ไขละ ด้านบนๆครับ 555