//------------------------- 2 core
TaskHandle_t Task1, Task2;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x27, 16, 2);
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---------------------------------------- WiFi
#include "WiFi.h" // for ESP 32
#include <HTTPClient.h>
//#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char* ssid = "Xiaomi 11T";
const char* password = "88888888";
//---------------------------------------- Google Apps Script
const char* host = "script.google.com";
const int httpsPort = 443;
WiFiClientSecure client; //--> Create a WiFiClientSecure object.
String sheets = "";
String GAS_ID = "AKfycbwIWpzQFU5hIo4B_Milxg1dAeSZ4aJ8vr1_I6fDmqwJZ4YoRXPNXBI0pEaESQy4SaEx2w";
//---------------------------------------- Time
#include <NTPClient.h>
//#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//#include <RTCZero.h>
const long offsetTime = 25200;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", offsetTime);
//RTCZero rtc;
int dayNow, hourNow, minuteNow, secondNow=59, secondBefore;
String weekDays[7]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
const int Inf1 = 13 ; // ir1
const int Prox1 = 14 ; // p1
const int SW1 = 26 ; // s1
const int SW2 = 27 ; // s2
const int R = 5 ;
const int Y = 17 ;
const int G = 16 ;
int n=0 ;
int SumPart=5 ; // จำนวน parts
String PartName[5]={"A", "B", "C", "D", "E"}; // Part Name display on LCD
String PartNameG[5]={"AS233", "Bravo", "Charl", "Delta", "Echo "}; // Part Name sent to Google Sheet
volatile int Part=0 ;
String Status[8]={" Breakdowns ", "Tools Replace", " Setup ", " Minor Stop ", " Part OK ", " Part NG ", " Sending Msg." ,"Sending data"} ;
volatile int staNo=3 ;
volatile int PCS=0, NG=0, PCSsum=0, NGsum=0, PCSsend, NGsend ; // ตัวแปร Quality Rate
volatile float ms=0 ;
boolean s1, s2, p1=false, ir1=false, rw=false, sendGG=false ;
//unsigned long lastTime = 0;
float currentMillis, lastTime = 0;
float CT = 0;
float BDtime=0, BDsum=0, TRtime=0, TRsum=0 ; // ตัวแปร Breakdown time
float MnSsum=0, MnStime=0;
float t0=0,t1=0, t2=0, t3=0 ; //t0 - Breakdown t1 - Tools replac t2 - Setup t3 - Waiting t4 - Part OK t5 - Part NG
void setup() {
lcd.begin();
lcd.print("Initializing...");
Serial.begin(9600);
pinMode(Inf1, INPUT_PULLUP);
pinMode(Prox1, INPUT_PULLUP);
pinMode(SW1, INPUT_PULLUP); // Breakdown
pinMode(SW2, INPUT_PULLUP); // Tool replace
pinMode(R, OUTPUT); digitalWrite(R,HIGH) ;
pinMode(Y, OUTPUT); digitalWrite(Y,HIGH) ;
pinMode(G, OUTPUT); digitalWrite(G,HIGH) ;
// Connect to WiFi
WiFi.begin(ssid, password);
lcd.setCursor(0, 0); lcd.print("Connecting to ") ;
lcd.setCursor(0, 1) ; lcd.print(String(ssid)) ;
while(WiFi.status() != WL_CONNECTED){
delay(500); n++ ;
Serial.print(".");
if (n==12) { ESP.restart(); }
}
Serial.println(""); Serial.println("Wi-Fi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP());
//client.setInsecure();
timeClient.begin();
// ติดตั้ง RTC
//rtc.begin();
lcd.clear() ;
lcd.setCursor(0, 0); lcd.print(String(ssid)) ;
lcd.setCursor(0, 1); lcd.print("Connected") ;
lcd.setCursor(0, 2); lcd.print("Signal strength= "+String(WiFi.RSSI())) ;
delay(3000) ;
lcd.clear() ;
lcd.setCursor(11, 0); lcd.print("CT=") ;
lcd.setCursor(12, 1); lcd.print("NGs= ") ; lcd.setCursor(16, 1); lcd.print(NGsum) ;
lcd.setCursor(2, 2); lcd.print("OK= ") ; lcd.setCursor(6, 2); lcd.print(PCS) ;
lcd.setCursor(13, 2); lcd.print("NG= ") ; lcd.setCursor(16, 1); lcd.print(NG) ;
lcd.setCursor(0, 3); lcd.print("Status: ") ;
lcd.setCursor(0, 1); lcd.print("Unit= ") ; lcd.setCursor(6, 1); lcd.print(PCSsum) ;
digitalWrite(R,LOW);
delay(200);
digitalWrite(Y,LOW);
delay(200);
digitalWrite(G,LOW);
delay(200);
digitalWrite(R, HIGH); digitalWrite(Y, HIGH); digitalWrite(G, HIGH);
// สร้างงาน task1 บน Core 0
xTaskCreatePinnedToCore(
task1, // ชื่อฟังก์ชันงาน
"Task1", // ชื่องาน
10000, // ขนาดสแต็ก 10000
NULL, // พารามิเตอร์ให้กับงาน (ไม่มีในที่นี้)
1, // ลำดับความสำคัญของงาน
&Task1, // ตัวแปรเก็บ Handle ของงาน
1 // ระบุให้ทำงานบน Core 0
);
// สร้างงาน task2 บน Core 1
xTaskCreatePinnedToCore(
task2, // ชื่อฟังก์ชันงาน
"Task2", // ชื่องาน
10000, // ขนาดสแต็ก 100000
NULL, // พารามิเตอร์ให้กับงาน (ไม่มีในที่นี้)
1, // ลำดับความสำคัญของงาน
&Task2, // ตัวแปรเก็บ Handle ของงาน
0 // ระบุให้ทำงานบน Core 1
);
}
void loop() {
// Nothing here. We're doing everything in tasks now.
}
void task1(void * parameter) { // **************************************************** Internet CPU
sendData(0, 0, "SystemStarted", 0, 0, 0, 0, 0) ;
while (1) {
if (staNo==0) {digitalWrite(R, LOW); digitalWrite(Y, HIGH); digitalWrite(G, HIGH);} // Breakdown
if (staNo==1) {digitalWrite(R, HIGH); digitalWrite(Y, LOW); digitalWrite(G, HIGH);} // ToolsReplace
//if (staNo==2) {digitalWrite(R, HIGH); digitalWrite(Y, LOW); digitalWrite(G, HIGH);} // -
if (staNo==3) {digitalWrite(R, HIGH); digitalWrite(Y, LOW); digitalWrite(G, HIGH);} // Minor Stop
if (staNo==4) {digitalWrite(R, HIGH); digitalWrite(Y, HIGH); digitalWrite(G, LOW);} // PartOK
if (staNo==5) {digitalWrite(R, HIGH); digitalWrite(Y, HIGH); digitalWrite(G, LOW);} // PartNG
Time() ;
if (secondNow==0 && staNo!=0 && staNo!=1 ) { // send Data by Interval
lcd.setCursor(7,3); lcd.print("Sending Data") ;
PCSsum = PCSsum+PCS, NGsum=NGsum+NG ;
PCSsend = PCS ; PCS=0; NGsend = NG; NG=0;
sendData(0, 0, Status[staNo], PCSsum, NGsum, PCSsend, NGsend, CT) ;
//PCS=0, NG=0 ;
}
if (rw==true && staNo==0 ) { // send Data when Breakdown
PCSsum = PCSsum+PCS, NGsum=NGsum+NG ;
lcd.setCursor(7,3); lcd.print("Sending Data") ;
PCSsend = PCS ; PCS=0; NGsend = NG; NG=0;
sendData(BDtime/1000,BDsum/1000,"Breakdown",PCSsum,NGsum,PCSsend,NGsend, CT) ;
//PCS=0, NG=0 ;
rw=false ; //staNo=3 ;
}
if (rw==true && staNo==1 ) { // send Data when ToolsReplace
PCSsum = PCSsum+PCS, NGsum=NGsum+NG ;
lcd.setCursor(7,3); lcd.print("Sending Data") ;
PCSsend = PCS ; PCS=0; NGsend = NG; NG=0;
sendData(TRtime/1000,TRsum/1000,"ToolsReplace",PCSsum,NGsum,PCSsend,NGsend, CT) ;
//PCS=0, NG=0 ;
rw=false ; //staNo=3 ;
}
lcd.setCursor(14, 0); lcd.print(" ") ; lcd.setCursor(14, 0); lcd.print(CT) ;
lcd.setCursor(6, 1); lcd.print(PCSsum) ; lcd.setCursor(16,1); lcd.print(NGsum) ;
lcd.setCursor(6, 2); lcd.print(" ") ; lcd.setCursor(16,2); lcd.print(" ") ;
lcd.setCursor(6, 2); lcd.print(PCS) ; lcd.setCursor(16,2); lcd.print(NG) ;
lcd.setCursor(7,3); lcd.print(Status[staNo]) ;
delay(500) ;
//vTaskDelay(500 / portTICK_PERIOD_MS); // delay for a second
}
}
void task2(void * parameter) { // **************************************************** Sensor CPU
delay(5000) ;
while (1) {
/*
if (staNo==3) { // --------------------------------------- Minor Stop
currentMillis = millis();
MnStime=0 ;
Serial.print("Minor Stop:") ; Serial.print(MnStime) ; Serial.println(MnSsum) ;
sendData(MnStime/1000,MnSsum/1000,"03-MinorStop") ; delay(4000) ;
//while ( SW1==HIGH && SW2==HIGH && digitalRead(Inf1)==LOW && digitalRead(Prox1)==LOW ){
while ( digitalRead(SW1)==HIGH && digitalRead(SW2)==HIGH && digitalRead(Inf1)==LOW && digitalRead(Prox1)==LOW ) {
lastTime=millis();
delay(500) ;
}
lastTime = millis();
MnStime = lastTime-currentMillis ;
MnSsum = MnSsum+MnStime ;
Serial.print("End Tools Replace:") ; Serial.print(TRtime) ; Serial.println(TRsum) ;
sendData(MnStime/1000,MnSsum/1000,"03-MinorStop") ; delay(4000) ;
}*/
if (digitalRead(Inf1)==HIGH) { ir1=true ; staNo=4 ;} // งานเคลื่อนเข้า Sensor
if (digitalRead(Prox1)==HIGH) { p1=true ; staNo=5 ;} // งานเคลื่อนออก Sensor
if (digitalRead(SW1)==LOW) { // --------------------------------------------------- 00-Breakdown On
currentMillis = millis();
rw=true ; // สั่ง write data
staNo=0 ; // Breakdown
BDtime=0;
Serial.print("Begin:") ; Serial.print(BDtime) ; Serial.println(BDsum) ; delay(4000) ;
//sendData(BDtime/1000,BDsum/1000,"BreakdownStart",PCSsum,NGsum,PCS,NG) ;
while (digitalRead(SW1)==LOW) { lastTime=millis(); delay(1000) ; }
rw=true ;
staNo=0 ;
lastTime = millis();
BDtime = lastTime-currentMillis ;
BDsum = BDsum+BDtime ;
Serial.print("End:") ; Serial.print(BDtime) ; Serial.println(BDsum) ;
//sendData(BDtime/1000,BDsum/1000,"BreakdownStop",PCSsum,NGsum,PCS,NG) ; delay(4000) ;
}
if (digitalRead(SW2)==LOW) { // --------------------------------------------------- 01-SW Tools Replace On
currentMillis = millis();
staNo=1 ; TRtime=0; rw=true ; // สั่ง write data
Serial.print("Begin Tools Replace:") ; Serial.print(TRtime) ; Serial.println(TRsum) ; delay(4000) ;
//sendData(TRtime/1000,TRsum/1000,"01-Tools Replace start",PCSsum,NGsum,PCS,NG) ; delay(4000) ;
while (digitalRead(SW2)==LOW) { lastTime=millis(); delay(1000) ; }
staNo=1 ; rw=true ;
lastTime = millis();
TRtime = lastTime-currentMillis ;
TRsum = TRsum+TRtime ;
Serial.print("End Tools Replace:") ; Serial.print(TRtime) ; Serial.println(TRsum) ;
//sendData(TRtime/1000,TRsum/1000,"01-Tools Replace Finish",PCSsum,NGsum,PCS,NG) ; delay(40