//------------------------- 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 = "Sriran";
const char* password = "b3pkp6mw";
//---------------------------------------- Google Apps Script
const char* host = "script.google.com";
const int httpsPort = 443;
WiFiClientSecure client; //--> Create a WiFiClientSecure object.
String sheets = "";
String GAS_ID = "AKfycbxmc8L1Cv-batGx-K-Xgqv00lFYipHO5ltbpFFHp5N7HBuXSKvNJd5SYuWdhrYY1P4uQw";
//---------------------------------------- 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 ; // ตัวแปร 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 ;
sendData(0, 0, Status[staNo], PCSsum, NGsum, PCS, NG, 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") ;
sendData(BDtime/1000,BDsum/1000,"Breakdown",PCSsum,NGsum,PCS,NG, 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") ;
sendData(TRtime/1000,TRsum/1000,"ToolsReplace",PCSsum,NGsum,PCS,NG, 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(4000) ;
}
if ( ir1==true && digitalRead(Inf1)==LOW ) { // --------------------------------------- งาน G เคลื่อนผ่าน Sensor
ir1=false ;
PCS++ ;
//unsigned long currentMillis = millis();
currentMillis = millis();
timeClient.update();
CT = (currentMillis - lastTime)/1000 ;
//Serial.print("ความแตกต่างของเวลา: "); Serial.println(CT);
lastTime = currentMillis;
//delay(300);
}
if ( p1==true && digitalRead(Prox1)==LOW ) { // --------------------------------------- งาน NG เคลื่อนผ่าน Sensor
p1=false ;
NG++ ;
currentMillis = millis();
timeClient.update();
CT = (currentMillis - lastTime)/1000 ;
//Serial.print("ความแตกต่างของเวลา: "); Serial.println(CT);
lastTime = currentMillis;
}
if (digitalRead(SW2)==LOW) { staNo=1 ;}
delay(50) ;
//vTaskDelay(50 / portTICK_PERIOD_MS); // check every 10ms (500)
}
}
void Time() {
timeClient.update();
secondNow = timeClient.getSeconds();
minuteNow = timeClient.getMinutes();
hourNow = timeClient.getHours();
String weekDay = weekDays[timeClient.getDay()];
lcd.setCursor(0, 0); lcd.print("[") ; //lcd.print("["+weekDay+" ") ;
if (hourNow < 10) { lcd.print("0") ; }
lcd.print(String(hourNow)+":") ;
if (minuteNow < 10) { lcd.print("0") ; }
lcd.print(String(minuteNow)+":") ;
if (secondNow < 10) { lcd.print("0") ; }
lcd.print(String(secondNow)+"]");
//lcd.setCursor(5, 1); lcd.print(PartName[Part]) ;
// if ( secondNow%2 > 0) { digitalWrite(LED_BUILTIN, HIGH); }
// else { digitalWrite(LED_BUILTIN, LOW); }
}
void sendData(float value1,float value2, String Tex, int OKsum, int NGsum, int unitOK, int unitNG, float CT) {
float timeA = value1;
float timeB = value2;
String S1 = Tex ;
S1 = filterNonAlphabetic(S1);
if (WiFi.status() == WL_CONNECTED) {
static bool flag = false;
String urlFinal = "https://script.google.com/macros/s/"+GAS_ID+"/exec?"+"timeA="+String(timeA)+"&timeB="+String(timeB)+"&S1="+S1+"&OKsum="+String(OKsum)+"&NGsum="+String(NGsum)+"&unitOK="+String(unitOK)+"&unitNG="+String(unitNG)+"&CT="+String(CT) ;
Serial.print("POST data to spreadsheet:");
Serial.println(urlFinal);
HTTPClient http;
http.begin(urlFinal.c_str());
int httpCode = http.GET();
String payload;
if (httpCode > 0) {
payload = http.getString();
}
//---------------------------------------------------------------------
http.end();
}
}
String filterNonAlphabetic(String input) {
String result = "";
for (int i = 0; i < input.length(); i++) {
if (isAlphaNumeric(input.charAt(i))) {
result += input.charAt(i);
}
}
return result;
}