PZEM วัดไฟฟ้ากับ Controllino
วันนี้มาทดสอบ PZEM วัดค่าไฟฟ้าร่วมกับ Controllino
การต่อสาย
- 5V ต่อกับ 5V บน X2
- GND ต่อกับ GND บน X2
- TX ต่อกับ RX2 บน X2
- RX ต่อกับ TX2 บน X2
PZEM Serial ใช้ Serial2
…………………………
- //// energy meter setup ///
- PZEM004T pzem(&Serial2); // Serial Rx3,TX3 on ATMega energy meter
- //change from serial3 to serial 2 17 Sep 2019
- IPAddress ip(192,168,1,175); // ip for pzem unit 192,168,1,175
/*Revision note * Controllino MEGA with Ethernet-Core with Realtime * Version 1.0 Date July 17,2019 * Paipat Samanchuen * */ #include <SPI.h> // must include SPI.h before Controllino.h #include <Controllino.h> #include <SD.h> // Datalogger on Ehthernet Shield 10/8/2018 Paipat #include <Ethernet.h> #include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> #include <LiquidCrystal.h> #include "DHT.h" // temperature sensor #include <PZEM004T.h> // Energy meter Through Serial 3 on Mega #include <SoftwareSerial.h> // #include <ArduinoJson.h> #include <NTPClient.h> #include <Arduino.h> #include "RTClib.h" #include <Adafruit_GFX.h> float flowfactor; /// Pin for Manual Auto Raspberry Pi and cooling fan // #define FanPin 25 // #define RaspberryPin 23 #define ManualModePin 38 #define AutoModePin 39 #define DHTPIN 36 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); ////// ////////// Auto Manual Mode //////// int AutoMode = 0; ///// Set time for posting tp server /// int New_post_time = 0; int post_time = 0; int Time_check = 0; int post_duration = 5; // posting interval every 5 minutes int pzemtime= 1000; ///// /////////// Ethernet Shield ////////////////////////////////////// // Enter a MAC address for your controller below. // Newer Ethernet shields have a MAC address printed on a sticker on the shield byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // fill in an available IP address on your network here, // for manual configuration: IPAddress ip2(192, 168, 1, 176); // set ip2 192,168,1,176 for Ethernet shield // fill in your Domain Name Server address here: IPAddress myDns(1, 1, 1, 1); // initialize the library instance: // with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP): EthernetClient client; /*const char* host = "praekha.innogreentech.net";*/ const char* host = "otrixiot.com"; const char* code = "xxxxxxxxx"; /////////////////////// end ethernet shield ///// //// next LCD initial ///// LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); float LCDDisplayPeriod = 2000; float LastLCDDisplay; float ThisLCDDisplay; //// energy meter setup /// PZEM004T pzem(&Serial2); // Serial Rx3,TX3 on ATMega energy meter //change from serial3 to serial 2 17 Sep 2019 IPAddress ip(192,168,1,175); // ip for pzem unit 192,168,1,175 bool pzemrdy = false; /// end PZEM //// /// prepare host url //// String url; // ใช้สำหรับ โปรแกรมส่วนการส่ง int count = 0; int httpPort = 80; float flow55 = 0; //// const int chipSelect = 4; /// control panel condition //// String panelstate = "OFF"; float vHumidity = 0; float vTemperature = 0; float data1=59; float data2=33; float data3=33; float data4=33; float data5=33; float data6=33; float data7=33; float data8=33; float data9=33; float data10=33; float data11=33; float data12=33; float data13=33; float data14=33; float data15=33; float data16=33; float data17=33; float data18=33; float data19=33; float data20=33; float vPower=0; float vVolt=0; float iamp=0; float vEnergy=0; /////////////////////////////////////////////////////////////////////////// void setup() { String BCS = "On"; setup_Controllino_RTC(); setup_Display(); setup_PinMode(); setup_SerialCommunication(); setup_NetworkConnection(); setup_DataLogger(); setup_Sensor_Box_Temperature(); } void setup_Controllino_RTC() { Controllino_RTC_init(); /* set time and date by separate values values to the RTC chip */ /* Day, WeekDay, Month, Year, Hour, Minute, Second); */ Controllino_SetTimeDate(12,4,1,17,15,41,23); /* or use another possibility and define the time and date by strings, e.g. "Nov 15 2018", "11:41:02" */ /* following example uses predefined C macros __DATE__ and __TIME__ which represent compilation time */ Controllino_SetTimeDateStrings(__DATE__, __TIME__); /* set compilation time to the RTC chip */ } //////////////////////////////////////// End SETUP /////////////////////////// void(* resetFunc) (void) = 0; void setup_Display() { lcd.begin(20,4); lcd.setCursor(0,0); lcd.print("IOT by "); lcd.setCursor(0,2); lcd.print("Samong Thailand"); lcd.setCursor(0,3); lcd.print("Tel. 091-6982616"); delay(1000); } void setup_PinMode() { pinMode(FanPin,OUTPUT); pinMode(RaspberryPin,OUTPUT); // pin 23 pinMode(ManualModePin,INPUT); // ขาวัดโหมด manual pin 38 pinMode(AutoModePin,INPUT); // ขาวัดโหมด Auto pin 39 } void setup_SerialCommunication() { // Open serial communications and wait for port to open: Serial.begin(115200); // mySerial.begin(115200); } void setup_NetworkConnection() { // give the ethernet module time to boot up: delay(1000); // start the Ethernet connection using a fixed IP address and DNS server: Ethernet.begin(mac, ip2, myDns); // print the Ethernet board/shield's IP address: Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); EthernetClient Client; } void setup_DataLogger() { } void setup_Sensor_Box_Temperature() { dht.begin(); } void scanSensor_Energy() { Serial.begin(115200); // while (!pzemrdy) { Serial.println("Connecting to PZEM..."); pzemrdy = pzem.setAddress(ip); delay(pzemtime); // for pzem connection time //} delay(1000); vVolt = pzem.voltage(ip); if (vVolt < 0.0) vVolt = 0.0; Serial.print(vVolt);Serial.print("V; "); iamp = pzem.current(ip); if(iamp >= 0.0){ Serial.print(iamp);Serial.print("A; "); } vPower = pzem.power(ip); if(vPower >= 0.0){ Serial.print(vPower);Serial.print("W; "); } vEnergy = pzem.energy(ip)/1000; // devide by 1000 to convert to kWhr if(vEnergy >= 0.0){ Serial.print(vEnergy);Serial.print("kWhr; "); } } void scanSensor_Flowrate() { //ใช้เป็น Interrupt แทน } void scanSensor_Box_Temperature() { } void scanAllSensor() { // scanSensor_Energy(); scanSensor_Box_Temperature(); } //แสดงสถานะการทำงานของระบบ void displayToLCD_Title() { } void displayToLCD_WorkMode() { lcd.clear(); lcd.begin(20,4); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Control Panel check"); lcd.setCursor(0,2); lcd.print("Mode :"); lcd.setCursor(10,2); // lcd.print(Modeselect); lcd.setCursor(0,3); lcd.print("Temp 'c :"); lcd.setCursor(10,3); // lcd.print(vTemperature1); } void displayToLCD_Energy() { lcd.clear(); lcd.setCursor(0,0); lcd.print(" Energy Meter"); lcd.setCursor(0,1); lcd.print("Power : W"); lcd.setCursor(0,2); lcd.print("Amp : A"); lcd.setCursor(0,3); lcd.print("Energy : kWhr"); lcd.setCursor(8,1); lcd.print(vPower); lcd.setCursor(8,2); lcd.print(iamp); lcd.setCursor(8,3); lcd.print(vEnergy); } void displayToLCD_All_PumpStatus() { lcd.clear(); lcd.begin(20,4); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Pump Status"); } void displayToLCD_Flowrate() { lcd.clear(); lcd.begin(20,4); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Flow rate L/MIN"); lcd.setCursor(0,3); lcd.print("Total Flow : "); lcd.setCursor(14,3); } void displayToLCD_Flowrate5() { } void displayToLCD_pH_EC_A() { lcd.clear(); lcd.setCursor(0,0); lcd.print("Tamod Station"); lcd.setCursor(0,1); lcd.print(" pH : "); lcd.setCursor(0,2); lcd.print(" EC us/cm : "); lcd.setCursor(0,3); lcd.print(" Temp 'c : "); lcd.setCursor(14,1); lcd.setCursor(14,3); // lcd.print(temperature); } void displayToLCD_pH_EC_B() { } void displayToLCD_Inlet_Outlet() { lcd.clear(); lcd.setCursor(0,0); lcd.print(" inlet outlet"); lcd.setCursor(0,1); lcd.print("pH : "); lcd.setCursor(0,2); lcd.print("EC : "); lcd.setCursor(0,3); lcd.print("Flow : "); lcd.setCursor(9,1); lcd.print("#na"); lcd.setCursor(9,2); lcd.print("#na"); lcd.setCursor(9,3); lcd.print("#na"); } void displayToLCD_TankLevel() { lcd.clear(); lcd.begin(20,4); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Tank Level"); lcd.setCursor(0,1); lcd.print("T#0:"); } void displayToLCD_All_aNodeVoltage() { lcd.clear(); lcd.setCursor(0,0); lcd.print(" Cell Voltage (mV)"); lcd.setCursor(0,1); lcd.print("R1 : "); lcd.setCursor(0,2); lcd.print("R2 : "); lcd.setCursor(0,3); lcd.print("R3 : "); lcd.setCursor(11,1); lcd.print("R4 : "); lcd.setCursor(11,2); lcd.print("R5 : "); } void displayToSerial_Title() { } void display_LCD_data() { lcd.clear(); lcd.setCursor(0,0); lcd.print(" inlet outlet"); lcd.setCursor(0,1); lcd.print("Temp. : "); lcd.setCursor(0,2); lcd.print("EC : "); lcd.setCursor(0,3); lcd.print("Flow : "); lcd.setCursor(9,1); lcd.print(data6); lcd.setCursor(9,2); lcd.print(data7); lcd.setCursor(9,3); lcd.print(data9); } void displayToSerial_WorkMode() { Serial.println(" Mode check : "); Serial.print("Manual mode switch :"); // Serial.println(ManualModePinValue); Serial.print("Automode switch : "); // Serial.println(AutoModePinValue); Serial.print("Mode Select "); // Serial.println(Modeselect); } void displayToSerial_Energy() { } void displayToSerial_Flowrate() { } void displayToSerial_pH_EC_A() { } void displayToSerial_pH_EC_B() { } void displayToSerial_Inlet_Outlet() { } void displayToSerial_CalculateFlow() { } void displayToSerial_PumpStatus() { } void displayToSerial_TankLevel() { } void displayAllSystemStatus() { displayAllSystemStatusToLCD(); displayAllSystemStatusToSerial(); } void displayAllSystemStatusToLCD() { int timeA = 4000; displayToLCD_Title(); delay(timeA); displayToLCD_Energy(); delay(timeA); displayToLCD_All_PumpStatus(); delay(timeA); displayToLCD_Flowrate(); delay(timeA); displayToLCD_Flowrate5(); delay(timeA); displayToLCD_pH_EC_A(); delay(timeA); // displayToLCD_pH_EC_B(); displayToLCD_Inlet_Outlet(); displayToLCD_TankLevel(); delay(timeA); displayToLCD_All_aNodeVoltage(); delay(timeA); } void displayAllSystemStatusToSerial() { } void saveSystemStatusToServer() { ///// prepare variable of data for upload to server ////// String url = "/api/insertData?device_id=" + String(xxx)+"&code="+String(code)+"&data1=" +String(data1) +"&data2=" + String(data2)+"&data3=" +String(data3)+"&data4=" +String(data4)+"&data5=" +String(data5) +"&data6=" +String(data6)+"&data7=" +String(data7)+"&data8=" +String(data8)+"&data9=" +String(data9) +"&data10=" +String(data10)+"&data11=" +String(data11)+"&data12=" +String(data12)+"&data13=" +String(data13) +"&data14=" +String(data14)+"&data15=" +String(data15)+"&data16=" +String(data16)+"&data17=" +String(data17) +"&data18=" +String(data18)+"&data19=" +String(data19)+"&data20=" +String(data20); /* String url = "/api/weather/insert.php?phinlet=" + String(0) + "&AlarmMessage0=" + String(0); */ Serial.print("Resquesting URL: "); Serial.println(url); delay(1000); // if there's a successful connection: //EthernetClient client; delay(1000); /*if (millis() - lastConnectionTime > postingInterval) { */ if (client.connect(host, 80)) { Serial.println("Data submitting to server ... waiting..."); client.println(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); //client.println("Connection: close"); Serial.println("Data saved completed.."); } else { // if you couldn't make a connection: Serial.println("connection failed 2 "); } while(client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } /* } */ client.stop(); Serial.println("closing connection"); } /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// void printdata_Serial() { Serial.print("Data6 : "); Serial.print(data6); Serial.print("Data7 : "); Serial.print(data7); Serial.print("Data8 : "); Serial.print(data8); Serial.print("Data9 : "); Serial.print(data9); Serial.print("Data10 : "); Serial.print(data10); } void loop() { runSystem(); //ระบบเริ่มทำงาน /// get time Serial.print("Minute: "); New_post_time = Controllino_GetMinute(); Serial.println(New_post_time); Time_check = New_post_time - post_time; if(Time_check < 0) { Time_check = New_post_time+60; // add 60 minutes to get positive value Time_check = Time_check - New_post_time; } Serial.print("Minute: "); Serial.println(Time_check); // if (Time_check < post_duration) { Serial.println("No posting...."); delay(1000); //resetFunc(); } else { Serial.println("Continue millis()..."); getdata(); saveSystemStatusToServer(); post_time = Controllino_GetMinute(); } printdata_Serial(); display_LCD_data(); resetdata(); } ////////////////////////////////////// end loop ///////// /////////////////////////////////////////////////////////// void getdata() { data6 = data6 + Time_check; data7 = 120; data8 = data8 + Time_check; data9 = data9 + Time_check; data10 = data10 - Time_check; } void resetdata() { data7 = 35; data8 = 32; data9 = 35; data10 = 33; data6 = 30; } void runSystem() { scanSensor_Energy(); displayToLCD_Energy(); } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// void initializeAllSensorStatus() { initializeSensorStatus_Energy(); initializeSensorStatus_Flowrate(); initializeSensorStatus_pH(); initializeSensorStatus_EC(); } void initializeSensorStatus_Energy() { } void initializeSensorStatus_Flowrate() { } void initializeSensorStatus_pH() { } void initializeSensorStatus_EC() { } void runMode_Auto() { doModeAuto_Start(); doModeAuto_Operate(); doModeAuto_Complete(); } void doModeAuto_Start() { initializeAllSensorStatus(); } void doModeAuto_Operate() { // readControlCommandFromServer(); scanAllSensor(); displayAllSystemStatus(); // saveSystemStatusToDataLogger(); saveSystemStatusToServer(); // resetAlarmMessage(); } void doModeAuto_Complete() { } void doModeManual_Start() { initializeAllSensorStatus(); } void doModeManual_Operate() { scanAllSensor(); displayAllSystemStatus(); // saveSystemStatusToDataLogger(); saveSystemStatusToServer(); } void doModeManual_Complete() { } void runMode_Manual() { doModeManual_Start(); doModeManual_Operate(); doModeManual_Complete(); } void runMode_Off() { doModeOff_Start(); doModeOff_Operate(); doModeOff_Complete(); } void doModeOff_Start() { initializeAllSensorStatus(); } void doModeOff_Operate() { scanAllSensor(); displayAllSystemStatus(); // saveSystemStatusToDataLogger(); saveSystemStatusToServer(); } void doModeOff_Complete() { displayAllSystemStatus(); } /////////////////////////// end ///////////// void SwitchOnRaspberryPi() { digitalWrite(RaspberryPin,LOW); }
แรงดันไฟฟ้าตกบ่อยๆ เลย ต้องจับค่าส่งไปที่แพลตฟอร์มตามเคย http://otrixiot.com/#/system/login/