ผมทำ dht22 กับ pm 2.5 sensor

ถ้าได้แล้วสรุปหน่อยครับว่าแก้ไขได้อย่างไร

จากการแก้ไขเพิ่มเติม ผมได้เปลี่ยนจาก delay มาใช้เป็น millis

void loop() 
{
  static unsigned long Time1 = millis();
  if((millis()-Time1)>4700){
    Time1 = millis();
  climateRoutine();                           // Climate routine
  }
  Blynk.run();
  pm_loop();
}

ทำให้ใช้งานได้ ปกติ แต่เราจะมาติดตรงที่ จอ led ตอนที่เจอคือ เกิดการ input ค่าของ pm2.5 ทับกัน ก็แก้ได้ละ โดยสลับที่กันฟังชั่น โดยให้ฟังชั่นที่มีการใช้งานจำนวนที่กว่า(จำนวนรอบต่อครั้ง) มาไว้เป็นหลัก โดยฟังชั่น ของ pm2.5 มีช่วงเวลาแสดงบนจอ led ที่ 230millisec ถ้าจำไม่ผิด แต่จะติดปัญหาตครงที่ว่า จะมีการหน่วงของฟังชั่นในส่วนโค้ดตัวนนี้

Blynk.virtualWrite(input_sensor,Density);

แต่ไม่รู้จะแก้ยังไง

1 Like

เยี่ยมมากครับ การแก้ไขปัญหามีด้วยกันหลายวิธี วิธีที่กล่าวมาก็เป็นอีกวิธีหนึ่ง ขอบคุณที่แชร์แนวทาง เราได้แนวทางเพิ่มมาอีกหนึ่งวิธีแล้ว

แล้วสรุปว่ามันรันและใช้งานได้หรือไม่?

รันและใช้งานได้ครับ แต่มีแค่ปัญหาการแสดงผลเฉยๆ เดี๋ยวผมหาทางแก่ก่อน ไม่ได้ยังไงผมจะถามปรึกษาในนี้เอาครับ55

ขยายความหน่อย ว่ามันเป็นอย่างไร มีภาพไหม ถ้ามันตรงกับคำตอบที่ผมมีจะได้เอามาแป๊ะให้

คล้ายๆอาการแลคอะครับ

อักษรมันเพื้อนรึป่าว หรือแค่แสดงผลช้า

แค่แสดงช้าครับ แสดงไม่ตรงเวลาที่กำหนด คล้ายๆว่า 5 วิ ปกติแสดงผลต่อรอบ 15 ครั้ง เวลาเฉลี่ยเท่าๆกัน แต่นี่แสดง 15 ครั้ง 1-3 วิ แสดง 5 ครั้ง แล้ว 4-5 วิให้หลัง แสดง 10 ครั้ง ครบ 15 ครั้ง แบบนี้ครับ

ขอดูโค้ตล่าสุดหน่อย

คือผมใช้โค้ดส่วน oled ข้ามฟังชั่นเลย อาจเพราะแบบนี้

/*********
  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 = Adafruit_SSD1306(128, 64, &Wire);

#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[] = "....";
char pass[] = "...";
void setup() {
  Serial.begin(115200);

  dhtA.begin();

  display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
  Blynk.begin(auth, ssid, pass);
  pinMode(sharpLEDPin, OUTPUT);

}


int ton=0;


void loop() 
{
  static unsigned long Time1 = millis();
  if((millis()-Time1)>4700){
    Time1 = millis();
  climateRoutine();                           // Climate routine
  }
  Blynk.run();
  pm_loop();
}


void pm_loop(){
// 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;
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);
      //clear display
    display.clearDisplay();
    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");
    

  
   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"); 
   }
   
}



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
    
      


  // 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(); 

}

ตอนนี้ เรียบร้อยแล้วครับ ทำได้ดีที่สุดเท่าที่ทำได้แล้ว

สรุปผล

สามารถแสดงผลผ่านจอ oled ได้โดย แสดงผล 1 วินาที/ครั้ง
ส่วนในแอพ blynk แสดงค่าปกคิเหมือนกับที่แสดงในจอ oled

1 Like

เยี่ยมครับ มีเวลาก็พัฒนาเทคนิกต่อๆ ไปครับผม

ace GIF