//***** LCD *******//
//*****เรียกใช้ library LCD*******//
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
//*******ตั้งค่าตัวแปรสำหรับ MultiTasking Template ที่นี่ 5 งาน*******//
//*****ประกาศเรียกใช้เวลาใน task*****///
uint32_t previousTime1;
uint32_t previousTime2;
uint32_t previousTime3;
uint32_t previousTime4;
uint32_t previousTime5;
//*****กำหนดเวลาในเเต่ละ task *****//
uint32_t time_task1 = 1000;
uint32_t time_task2 = 1000;
uint32_t time_task3 = 100;
uint32_t time_task4 = 1000;
uint32_t time_task5 = 1000;
uint32_t currentTime = 0;
//**** จบการประกาศคำสั่ง task *****//
//*****ประกาศตัวเเทนค่าเเปรที่ใช้งานเเละกำหนดขา****//
uint8_t LED1 = 16 ;
float vQ ;
float V ;
float I ;
int AnalogResolution = 12 ;
LiquidCrystal_I2C lcd(0x27, 16, 2);
//****กำหนดหารใช้ PMW ****//
uint16_t freq = 500 ; // กำหนดควา่มถี่ 500 Hz
uint8_t resolution = 10; // กำหนดความละเอียด 2^10 = 1024 ใช้งานให้ใช้ 1023
int16_t dutyCycle0 = 1023; // กำหนดขนาดรูปคลื่น
void setup() {
//***** คำสั่ง กำหนด INPUT, OUTPUT *****//
pinMode(LED1, OUTPUT);
//***** กำหนดขาจอ LCD 8 เเละ 9 *****//
Wire.setSDA(8);
Wire.setSCL(9);
Wire.begin();
lcd.begin();
analogReadResolution(AnalogResolution);
//****กำหนดหน้าจอ LCD *****//
lcd.setCursor(5, 0);
lcd.print("Hello");
lcd.setCursor(0, 1);
lcd.print("Amp/Volt Meter ");
delay(1000);
lcd.setCursor(0, 0);
lcd.print("Va(v) = ");
lcd.setCursor(0, 1);
lcd.print("Ia(A) = ");
//*******กำหนดความถี่เเสดงผล**********////
//*หมายเหตุ หากใช้คำสั้ง Serial1 ลงบอร์ดจริงให้ลบเลข 1 *//
Serial1.begin(115200);
Serial1.println("Hello, Raspberry Pi Pico W!"); // เเสดงผล Hello, Raspberry Pi Pico W!
Serial1.println(dutyCycle0) ;
}
void loop() {
//******* กำหนดเวลาให้เป็น milli sce *******/
currentTime = millis();
//****** อ่านค่า Analog จาก R *****/
// Task1 : Analog Read
if(currentTime - previousTime1 >= time_task1){
previousTime1 = currentTime;
vQ = analogRead(A0); //A0 @GPIO26, A1, A2 กำหนดขาของ R ปรับค่าได้
I = (vQ/4096)*400; //Maximum 3.3 V => 400 A แปลงหน่วยจากเเรงดัน 3.3 v เป็นค่ากระเส 400
V = (vQ/4096)*500; //Maximum 3.3 V => 500 V แปลงหน่วยจากเเรงดัน 3.3 v เป็นค่าเเรงดัน 500
}
// Task2 : LCD display
if(currentTime - previousTime2 >= time_task2){
previousTime2 = currentTime;
//**** กำหนดตัวเเสดงผล LCD *****//
lcd.setCursor(9, 0);
lcd.print(" "); //Clear display
lcd.setCursor(8, 0);
lcd.print(V,2);
lcd.setCursor(9, 1);
lcd.print(" "); //Clear display
lcd.setCursor(8, 1);
lcd.print(I,2);
}
// Task3 : fading LED1 คำสั่ง ใช้งาน LED1
if(currentTime - previousTime3 >= time_task3){
previousTime3 = currentTime;
//***คำสั้งไฟหรี่ให้ปรับความเร็ว ช้า ตรงนี้ ***//
analogWrite(LED1, dutyCycle0); // กำหนดค่าที่จะให้ LED1 เเสดงผล
Serial1.println(dutyCycle0) ; // เเสดงผล ให้ LED1 มีค่าตาม dutyCycle0
dutyCycle0 -= 50; // ลงที่ละ 50 ให้ปรับความช้า เร็ว ตรงนี้
if (dutyCycle0 <=0) { // เมื่อมีค่า น้อยกว่าหรือเท่ากับ 0
dutyCycle0 = 1023 ; // ให้ dutyCycle0 มีค่าเท่ากับ 1023
}
}
// Task4 : empty
if(currentTime - previousTime4 >= time_task4){
previousTime4 = currentTime;
}
// Task5 : empty
if(currentTime - previousTime5 >= time_task5){
previousTime5 = currentTime;
}
} //***** จบการทำงานของคำสั่ง****** //