You are on page 1of 4

ESP8266:

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <ThingSpeak.h>
#include <SoftwareSerial.h>
#define RX_PIN 4 //d2
#define TX_PIN 5 //d1
SoftwareSerial mySerial(RX_PIN, TX_PIN);
WiFiClient client;
const char *apiKey = "2VLXMPKDXWOZN0B3";
const char *ssid = "FPTU_Student";
const char *pass = "12345678";
const char* server = "api.thingspeak.com";
unsigned long channelID = 2471460;

int cel, distance;


float dustDensity;

void setup() {
mySerial.begin(9600);
Serial.begin(9600);

//kết nối wifi


WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
ThingSpeak.begin(client);
//--------------
}

void loop() {
if(mySerial.available()){
//String nhận về dưới dạng nhiệt độ, khoảng cách, độ bụi
// dùng int comma và comma2 để ngăn cách dấu ',' thứ 1 và 2
// lấy dữ liệu bằng cách dùng substring rồi cast qua dạng khác (int và float)
String receivedStr = mySerial.readStringUntil('\n');
int comma = receivedStr.indexOf(',');
int comma2 = receivedStr.indexOf(',', comma+1);
cel = receivedStr.substring(0,comma).toInt();
distance = receivedStr.substring(comma+1, comma2).toInt();
dustDensity = receivedStr.substring(comma2+1).toFloat();
//giới hạn dữ liệu lại, đôi khi dữ liệu nhận về cao một cách bất thường
if(cel <= 100 && distance <= 50 && dustDensity <= 30){
ThingSpeak.setField(1, cel);
ThingSpeak.setField(2, distance);
ThingSpeak.setField(3, dustDensity);
ThingSpeak.writeFields(channelID, apiKey);
}
//--------------------------------------
delay(1000);
}
}

Arduino Uno:
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#define RX_PIN 11 //pin 11 receive data
#define TX_PIN 12 //pin 12 gửi data
//khai báo biến
SoftwareSerial mySerial(RX_PIN, TX_PIN);
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
int led_pin = 10;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int val;
int tempPin = A0;
const unsigned int TRIG_PIN=3;
const unsigned int ECHO_PIN=2;

int measurePin = A1;


int ledPower = 13;

unsigned int samplingTime = 280;


unsigned int deltaTime = 40;
unsigned int sleepTime = 9680;

float voMeasured = 0.0;


float calcVoltage = 0.0;
float dustDensity = 0.0;
//----------------------------------
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(ledPower, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(led_pin, OUTPUT);
lcd.begin(16, 2);
}

void loop() {
//tính nhiệt độ
val = analogRead(tempPin);
int mv = val * (5000/1024);
int cel = mv/10;
//----------------------------
// set the cursor to (0,0):
//xuất ra màn lcd
lcd.setCursor(0, 0);
lcd.print("ND=");
lcd.print(cel);
lcd.print((char)223);
lcd.print("C");
//--------------------------
//tính khoảng cách
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
lcd.setCursor(0,1);

const unsigned long duration= pulseIn(ECHO_PIN, HIGH);


int distance = duration * 0.0344 / 2;
//--------------------------------------

//xuất dữ liệu khoảng cách ra màn LCD


lcd.print("KC:");
lcd.print(distance);
lcd.print("cm");
//---------------------------------------

//object có khoảng cách bé hơn 10cm sẽ làm sáng đèn led


if(distance < 10)
digitalWrite(led_pin, HIGH);
else
digitalWrite(led_pin,LOW);
//-------------------------------------------
//tính mật độ bụi
digitalWrite(ledPower, LOW);
delayMicroseconds(samplingTime);
voMeasured = analogRead(measurePin);
delayMicroseconds(deltaTime);
digitalWrite(ledPower, HIGH);
delayMicroseconds(sleepTime);

calcVoltage = voMeasured * (5.0 / 1024);


dustDensity = 170 * calcVoltage - 0.1;
//----------------------------

//check mật độ bụi nếu như nhận giá trị âm


if (dustDensity < 0) {
dustDensity = 0.00;
}
//--------------------------------------

Serial.print("Dust Density = ");


Serial.println(dustDensity);
//xuất dữ liệu mật độ bụi ra màn LCD
lcd.setCursor(8,1);
lcd.print("DB:");
lcd.print(dustDensity);
//-------------------------------
//đưa dữ liệu về dạng string có dạng "nhiệt độ, khoảng cách, mật độ bụi" để đưa
qua esp8266
String msg = String(cel) + "," + String(distance) + "," + String(dustDensity);
mySerial.println(msg);
//----------------------
Serial.println(msg);
delay(1000);
}

You might also like