#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//#define OLED_RESET 4
//Adafruit_SSD1306 display(OLED_RESET);
#define SCREEN_WIDTH 128 // pixel ความกว้าง
#define SCREEN_HEIGHT 64 // pixel ความสูง
// กำหนดขาต่อ I2C กับจอ OLED
#define OLED_RESET -1 //ขา reset เป็น -1 ถ้าใช้ร่วมกับขา Arduino reset
Adafruit_SSD1306 OLED(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int measurePin = A6;
int ledPower = 2;
unsigned int samplingTime = 280; //280 uS.
unsigned int deltaTime = 40; // 40 uS.
unsigned int sleepTime = 9680; // 9.68 mS.
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
void setup(){
OLED.begin(SSD1306_SWITCHCAPVCC, 0x3c); //สั่งให้จอ OLED เริ่มทำงานที่ Address 0x3C
OLED.clearDisplay(); // ลบภาพในหน้าจอทั้งหมด
Serial.begin(9600);
pinMode(ledPower,OUTPUT);
}
void loop(){
digitalWrite(ledPower,LOW);
delayMicroseconds(samplingTime);
voMeasured = analogRead(measurePin);
delayMicroseconds(deltaTime);
digitalWrite(ledPower,HIGH);
delayMicroseconds(sleepTime);
calcVoltage = voMeasured*(5.0/1024);
dustDensity = (calcVoltage-0.6)*170;
//Correction data y=mX +C
//float M = 1;
//float C = 0;
//dustDensity = (M * dustDensity) + C;
if ( dustDensity < 0)
{
dustDensity = 0.00;
}
Serial.println("Raw Signal Value (0-1023):");
Serial.println(voMeasured);
Serial.println("Voltage:");
Serial.println(calcVoltage);
Serial.println("Dust Density:");
Serial.println(dustDensity);
WriteToOLED(dustDensity);
delay(1000);
}
void WriteToOLED(int dustDensity)
{
if (true) //lay horizontal (no rotation)
{
OLED.clearDisplay(); // ลบภาพในหน้าจอทั้งหมด
OLED.setTextColor(WHITE);
OLED.setTextSize(1); // กำหนดขนาดตัวอักษร
OLED.setCursor(0,0); // กำหนดตำแหน่ง x,y ที่จะแสดงผล
OLED.println(" Dust PM 2.5 (ug/m3)");
OLED.println("");
OLED.setTextSize(4);
if (dustDensity >= 500) {OLED.println(" Over");}
else if (dustDensity >= 100) {OLED.print(" "); OLED.println(dustDensity);}
else if (dustDensity >=10) {OLED.print (" "); OLED.println(dustDensity);}
else if (dustDensity >=0) {OLED.print (" "); OLED.println(dustDensity);}
OLED.setTextSize(2);
if (dustDensity >=500) {OLED.println(" Range");}
else if (dustDensity > 55) {OLED.println(" DANGER");}
else if (dustDensity >36) {OLED.println (" High");}
else if (dustDensity >21) {OLED.println (" Low");}
else {OLED.println (" Good");}
OLED.display();
}
else //lay vertical (rotate 90) )
{
OLED.clearDisplay(); // ลบภาพในหน้าจอทั้งหมด
OLED.setRotation(1);
OLED.setTextColor(WHITE);
OLED.setTextSize(1); // กำหนดขนาดตัวอักษร
OLED.setCursor(0,0); // กำหนดตำแหน่ง x,y ที่จะแสดงผล
OLED.println("Dust PM2.5");
OLED.println(" ug/m3 ");
OLED.println("");
OLED.setTextSize(3);
if (dustDensity >= 500) {OLED.println("Ovr");}
else if (dustDensity >= 100) {OLED.print(""); OLED.println(dustDensity);}
else if (dustDensity >=10) {OLED.print (" "); OLED.println(dustDensity);}
else if (dustDensity >=0) {OLED.print (" "); OLED.println(dustDensity);}
OLED.setTextSize(2);
OLED.println ("");
if (dustDensity >=500) {OLED.println("Range");}
else if (dustDensity > 55) {OLED.println("DANGER");}
else if (dustDensity >36) {OLED.println (" High");}
else if (dustDensity >21) {OLED.println (" Low");}
else {OLED.println (" Good");}
OLED.display();
}
}