#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#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 var = 0; // ตัวแปรสำหรับทดสอบแสดงผล
float Vread;
float Vmin=20;
float Vmax=0;
float Vavg = 0;
float Vtot = 0;
int VCounter = 0;
unsigned long Time_Out;
unsigned long Time_TH = 500;
float Sread;
float Savg = 0;
float Stot = 0;
int SCounter = 0;
int DisplayMode = 0;
unsigned long T_Button_press;
unsigned long T_Debounce = 300; //Button debounce time = 500 mS.
unsigned long T_Button_ready;
#define BUTTON_PIN 10
#define PIN_TRIG 3
#define PIN_ECHO 2
//////////////////////////////////////////////////////////////////////////////////
void setup() {
OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(PIN_TRIG, OUTPUT); //Trigger
pinMode(PIN_ECHO, INPUT); //Echo
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Serial.begin(115200);
delay(2000); //delay 2sec before start recording
}
//////////////////////////////////////////////////////////////////////////////////
void loop() {
if (!digitalRead(BUTTON_PIN) && millis()>T_Button_ready)
{ T_Button_ready = millis() + T_Debounce;
DisplayMode++;
if (DisplayMode >=2) {DisplayMode = 0;}
}
switch (DisplayMode) {
case 0:
{ ModeVolt();
break;
}
case 1:
{ ModeDistance();
break;
}
}
}
///////////////////////////////////////////////////////////////////////////////////
void ModeDistance()
{
// Start a new measurement:
digitalWrite(PIN_TRIG, HIGH); //Trigger
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
// Read the result:
//int duration = pulseIn(PIN_ECHO, HIGH);
float duration = pulseIn(PIN_ECHO, HIGH); //Echo
Sread = (duration / 58 /100); //Distance in cm.
Stot += Sread;
SCounter++;
//Background running for Volt Measurement
Vread = analogRead(A0);
Vread = (Vread*20)/1023;
if (Vread > Vmax) {Vmax = Vread;}
if (Vread < Vmin) {Vmin = Vread;}
if (millis() > Time_Out)
{ Savg =Stot/SCounter;
OLED.clearDisplay(); // ลบภาพในหน้าจอทั้งหมด
OLED.setTextColor(WHITE, BLACK); //กำหนดข้อความสีขาว ฉากหลังสีดำ
OLED.setCursor(0, 0); // กำหนดตำแหน่ง x,y ที่จะแสดงผล
OLED.setTextSize(3); // กำหนดขนาดตัวอักษร
OLED.print(Savg); // แสดงผลข้อความ ALL
OLED.println (" m.");
OLED.display(); // สั่งให้จอแสดงผล
Stot = 0;
SCounter = 0;
Time_Out = millis() + Time_TH;
}
}
///////////////////////////////////////////////////////////////////////////////////
void ModeVolt()
{
Vread = analogRead(A0);
Vread = (Vread*20)/1023;
if (Vread > Vmax) {Vmax = Vread;}
if (Vread < Vmin) {Vmin = Vread;}
Vtot += Vread;
VCounter++;
if (millis() > Time_Out)
{ Vavg = Vtot/VCounter;
OLED.clearDisplay(); // ลบภาพในหน้าจอทั้งหมด
OLED.setTextColor(WHITE, BLACK); //กำหนดข้อความสีขาว ฉากหลังสีดำ
OLED.setCursor(0, 0); // กำหนดตำแหน่ง x,y ที่จะแสดงผล
OLED.setTextSize(3); // กำหนดขนาดตัวอักษร
//OLED.print(Vread); // แสดงผลข้อความ ALL
OLED.print(Vavg); // แสดงผลข้อความ ALL
OLED.println (" V");
OLED.setTextSize(2);
OLED.print("Max: ");
OLED.println(Vmax);
OLED.print("Min: ");
OLED.println(Vmin);
OLED.setTextSize(1);
String TextOut = (" Ctr:" + String(VCounter));
OLED.print (TextOut);
OLED.display(); // สั่งให้จอแสดงผล
Vtot = 0;
VCounter = 0;
Time_Out = millis() + Time_TH;
}
}
// OLED.setCursor(60, 0);
// OLED.setTextSize(2);
// OLED.println(var, DEC);
// OLED.setCursor(0, 40);
// OLED.setTextSize(2);
// OLED.println("ArduinoALL"); // แสดงผลข้อความ ALL