อยากขอคำปรึกษา PCF8591 ต่อกับ esp8266 เพื่อขยายขาอนาล็อกครับ พอดีกำลังทำโปรเจคจบ โดยใช้ Sensor 2 ตัว ใน 1 บอร์ด แต่ติดปัญหาขา Analog ไม่พอเลยซื้อตัว PCF8591 มาเพื่อขยายขาเพิ่ม แต่ติดปัญหาคือไม่แสดงค่าเลยครับ อาทิตย์หน้าเสนอแล้วด้วย ตอนนี้เครียดมากครับ เลยอยากรบกวนพี่ๆ ขอคำปรึกษาหน่อยครับ ตอนนี้เจอทางตันแล้วจริงๆ ครับ แป๊ะCode ให้เลยครับ ปล. Sensor 2 ตัวคือ เซนเซอร์วัดค่าฝุ่น และค่าความชื้นในดินครับ ขออนุญาตแปะ id line: 22052245 ครับ ขอบพระคุณเป็นอย่างสูงล่วงหน้าครับ
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include "PM_Sensor.h"
#include <TridentTD_LineNotify.h>
#include "Wire.h"
#define PCF8591 (0x48)
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 16 //LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
#define relay1 D2
#define relay2 D4
#define relay3 D1
#define relay4 D3
#define LINE_TOKEN "B6W46tCzFZ4ZDRT1OZp1hEya9C7ydwVGrFovHo8imHL"
#define input_sensor V5
// Arduino pin numbers.
const int sharpLEDPin = D3;
const int sharpVoPin = A0;
int SR = 0; // ประกาศตัวแปร SR มีค่าเท่ากับ 0
int temp = 0; // ประกาศตัวแปร temp มีค่าเท่ากับ 0
int sensorValue = 0; // ตัวแปรค่า Analog
int outputValue = 0; // ตัวแปรสำหรับ Map เพื่อคิด %
char auth[] = "b6U8yQyr9w82arrummwJ9n1cQY7XRxZR";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "oppo1";
char pass[] = "12345678";
BlynkTimer timer;
BLYNK_READ(V0)
{
Blynk.virtualWrite(V0, temp); // แสดงค่า Temp ออกช่องทาง V0
}
void setup()
{
// Debug console
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
Blynk.begin(auth, ssid, pass);
pinMode(sharpLEDPin, OUTPUT);
LINE.setToken(LINE_TOKEN);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
}
int ton=0;
void loop()
{
Blynk.run();
PM_loop();
//----------------------------------------
SR = analogRead(A0); // ให้ตัวแปล SR อ่านค่าจาก Pin A0
temp = map(SR, 0, 1023, 0, 100); // ตัวแปล Temp คือ แปลงค่าของตัวแปร SR จาก 1023 ถึง 0 เป็น 0 ถึง 100
Serial.print("Soil Moisture = ");
Serial.print(temp);
Serial.println(" %");
if (temp <= 60) { //ตั้งค่า % ที่ต้องการจะรดน้ำต้นไม้
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
}
if (temp >=70) {
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
}
delay(50);
//--------------------------------------------
timer.run();
}
void PM_loop(){
digitalWrite(sharpLEDPin, LOW);
delayMicroseconds(280);
int VoRaw = analogRead(sharpVoPin);
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);
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,16);
display.println(Density);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(85,0);
display.println("ug/m3");
display.display();
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 Sensor()
{
int temp = analogRead(A0);
if (isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
delay(5000);
return;
}
if (temp<=60) {
Serial.print("ค่าควาามชื้นในดิน : ");
Serial.println(temp, 1);
LINE.notify(String(temp));
}
}
อยากขอคำปรึกษา PCF8591 ต่อกับ esp8266 เพื่อขยายขาอนาล็อกครับ
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include "PM_Sensor.h"
#include <TridentTD_LineNotify.h>
#include "Wire.h"
#define PCF8591 (0x48)
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 16 //LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
#define relay1 D2
#define relay2 D4
#define relay3 D1
#define relay4 D3
#define LINE_TOKEN "B6W46tCzFZ4ZDRT1OZp1hEya9C7ydwVGrFovHo8imHL"
#define input_sensor V5
// Arduino pin numbers.
const int sharpLEDPin = D3;
const int sharpVoPin = A0;
int SR = 0; // ประกาศตัวแปร SR มีค่าเท่ากับ 0
int temp = 0; // ประกาศตัวแปร temp มีค่าเท่ากับ 0
int sensorValue = 0; // ตัวแปรค่า Analog
int outputValue = 0; // ตัวแปรสำหรับ Map เพื่อคิด %
char auth[] = "b6U8yQyr9w82arrummwJ9n1cQY7XRxZR";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "oppo1";
char pass[] = "12345678";
BlynkTimer timer;
BLYNK_READ(V0)
{
Blynk.virtualWrite(V0, temp); // แสดงค่า Temp ออกช่องทาง V0
}
void setup()
{
// Debug console
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
Blynk.begin(auth, ssid, pass);
pinMode(sharpLEDPin, OUTPUT);
LINE.setToken(LINE_TOKEN);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
}
int ton=0;
void loop()
{
Blynk.run();
PM_loop();
//----------------------------------------
SR = analogRead(A0); // ให้ตัวแปล SR อ่านค่าจาก Pin A0
temp = map(SR, 0, 1023, 0, 100); // ตัวแปล Temp คือ แปลงค่าของตัวแปร SR จาก 1023 ถึง 0 เป็น 0 ถึง 100
Serial.print("Soil Moisture = ");
Serial.print(temp);
Serial.println(" %");
if (temp <= 60) { //ตั้งค่า % ที่ต้องการจะรดน้ำต้นไม้
digitalWrite(relay3, HIGH);
digitalWrite(relay4, HIGH);
}
if (temp >=70) {
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
}
delay(50);
//--------------------------------------------
timer.run();
}
void PM_loop(){
digitalWrite(sharpLEDPin, LOW);
delayMicroseconds(280);
int VoRaw = analogRead(sharpVoPin);
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);
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,16);
display.println(Density);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(85,0);
display.println("ug/m3");
display.display();
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 Sensor()
{
int temp = analogRead(A0);
if (isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
delay(5000);
return;
}
if (temp<=60) {
Serial.print("ค่าควาามชื้นในดิน : ");
Serial.println(temp, 1);
LINE.notify(String(temp));
}
}