Components and supplies
4 Channel DC 5V Relay Module
n-channel MOSFET -p
Potentiometer 10K
PZEM-004-t
LCD 20X4-p
Pushbutton-p
Arduino Nano
10k Ohm Resistors -p
on/off switch
Tools and machines
3D printer filament (PLA)
Apps and platforms
Arduino IDE 1.8.19
Project description
Code
Arduino Power meter
Arduino code version 280V
1/* 2 * Amir_eshaqy 3 * 4 * telegram = amir_eshaqy 5 * gmail = amir9336146433@gmail.com 6 * 7 * Schematic and tutorial files on GitHub 8 * GitHub = https://github.com/amir-eshaqy/pz 9 * 10 */ 11 12#include <PZEM004Tv30.h> 13#include <Wire.h> 14#include <LiquidCrystal.h> 15#include <EEPROM.h> 16 17PZEM004Tv30 pzem(4,5);//arduino 18float voltage; 19float current; 20float power; 21float energy; 22float frequency; 23float pf; 24//LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x3F for a 16 chars and 2 line display 25 26LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); 27 28byte R1mood=0; 29byte R2mood=0; 30byte R3mood=0; 31byte R4mood=0; 32 33 34byte mood=3; 35byte relly1=8; 36byte relly2=7; 37byte relly3=6; 38byte relly4=2; 39byte fclear=0; 40int tms_set1=1; 41int tms_set2=1; 42int tms_set3=1; 43int tms_set4=1; 44int timeroc1=0; 45int timeroc2=0; 46int timeroc3=0; 47int timeroc4=0; 48float ti1=0.00; 49float ti2=0.00; 50float ti3=0.00; 51float ti4=0.00; 52byte O_V=0; 53byte L_V=0; 54byte O_C=0; 55byte L_F=0; 56byte O_F=0; 57float L_PF1=0.90; 58float L_PF2=0.85; 59float L_PF3=0.80; 60//Input & Button Logic 61const int numOfInputs = 4; 62const int inputPins[numOfInputs] = {12,11,10,9}; 63int inputState[numOfInputs]; 64int lastInputState[numOfInputs] = {LOW,LOW,LOW,LOW}; 65bool inputFlags[numOfInputs] = {LOW,LOW,LOW,LOW}; 66long lastDebounceTime[numOfInputs] = {0,0,0,0}; 67long debounceDelay = 5; 68 69//LCD Menu Logic 70const int numOfScreens = 16; 71int currentScreen = 0; 72String screens[numOfScreens][2] = {{"Over Voltage","Volts"}, {"Low Voltage","Volts"}, 73{"Over Current","Amper"},{"Low Frequency","Hz"},{"Over Frequency","Hz"}, {"LOW POWER FACTOR 1", "CosFi"}, {"LOW POWER FACTOR 2", "CosFi"}, {"LOW POWER FACTOR 3", "CosFi"},{"TMS1 SET", " "},{"TMS2 SET", " "},{"TMS3 SET", ""},{"TMS4 SET", " "},{"R1_Mood", " "},{"R2_Mood", " "},{"R3_Mood", " "},{"R4_Mood", " "}}; 74 75float parameters[numOfScreens]; 76 77 78 79 80void setup() { 81 O_V=EEPROM.read(1); 82 L_V=EEPROM.read(2); 83 O_C=EEPROM.read(3); 84 L_F=EEPROM.read(4); 85 O_F=EEPROM.read(5); 86 EEPROM.get(10,L_PF1); 87 EEPROM.get(30,L_PF2); 88 EEPROM.get(50,L_PF3); 89 EEPROM.get(70,tms_set1); 90 EEPROM.get(100,tms_set2); 91 EEPROM.get(130,tms_set3); 92 EEPROM.get(160,tms_set4); 93 R1mood=EEPROM.read(190); 94 R2mood=EEPROM.read(191); 95 R3mood=EEPROM.read(192); 96 R4mood=EEPROM.read(193); 97 parameters[0]=float(O_V); 98 parameters[1]=float(L_V); 99 parameters[2]=float(O_C); 100 parameters[3]=float(L_F); 101 parameters[4]=float(O_F); 102 parameters[5]=L_PF1; 103 parameters[6]=L_PF2; 104 parameters[7]=L_PF3; 105 parameters[8]=tms_set1; 106 parameters[9]=tms_set2; 107 parameters[10]=tms_set3; 108 parameters[11]=tms_set4; 109 parameters[12]=R1mood; 110 parameters[13]=R2mood; 111 parameters[14]=R3mood; 112 parameters[15]=R4mood; 113 Serial.begin(115200); 114// lcd.begin(); 115 //lcd.init(); // initialize the lcd 116 117 lcd.begin(20, 4); 118 119// lcd.backlight(); 120 lcd.clear(); 121 lcd.setCursor(5, 1); 122 lcd.print("AMIR_ESHAQY"); 123 delay(2000); 124 lcd.clear(); 125 // Uncomment in order to reset the internal energy counter 126 // pzem.resetEnergy() 127 for(int i = 0; i < numOfInputs; i++) { 128 pinMode(inputPins[i], INPUT); 129 digitalWrite(inputPins[i], HIGH); // pull-up 20k 130 } 131 pinMode(mood,INPUT); 132 pinMode(relly1,OUTPUT); 133 pinMode(relly2,OUTPUT); 134 pinMode(relly3,OUTPUT); 135 pinMode(relly4,OUTPUT); 136 137 digitalWrite(relly4,HIGH); 138 digitalWrite(relly3,HIGH); 139 digitalWrite(relly2,HIGH); 140 digitalWrite(relly1,HIGH); 141} 142 143 144 145 146 147/////////////////////////////////////////////////////////////////////////////////////////////// 148void loop(){ 149 if(digitalRead(mood)==HIGH){ 150 151 save_eep(); 152 Reeding_par(); 153// rellay(); 154relay_new(); 155 // Serial.println(); 156 delay(50); 157}else{ 158 fclear=0; 159 setInputFlags(); 160 resolveInputFlags(); 161 } 162} 163 164void setInputFlags() { 165 for(int i = 0; i < numOfInputs; i++) { 166 int reading = digitalRead(inputPins[i]); 167 if (reading != lastInputState[i]) { 168 lastDebounceTime[i] = millis(); 169 } 170 if ((millis() - lastDebounceTime[i]) > debounceDelay) { 171 if (reading != inputState[i]) { 172 inputState[i] = reading; 173 if (inputState[i] == HIGH) { 174 inputFlags[i] = HIGH; 175 } 176 } 177 } 178 lastInputState[i] = reading; 179 } 180} 181 182void resolveInputFlags() { 183 for(int i = 0; i < numOfInputs; i++) { 184 if(inputFlags[i] == HIGH) { 185 inputAction(i); 186 inputFlags[i] = LOW; 187 printScreen(); 188 } 189 } 190} 191 192void inputAction(int input) { 193 if(input == 0) { 194 if (currentScreen == 0) { 195 currentScreen = numOfScreens-1; 196 }else{ 197 currentScreen--; 198 } 199 }else if(input == 1) { 200 if (currentScreen == numOfScreens-1) { 201 currentScreen = 0; 202 }else{ 203 currentScreen++; 204 } 205 }else if(input == 2) { 206 parameterChange(0); 207 }else if(input == 3) { 208 parameterChange(1); 209 } 210} 211 212void parameterChange(int key) { 213 if(key == 0 && currentScreen>=5&& currentScreen<=7) { 214 parameters[currentScreen]=parameters[currentScreen]+0.01; 215 }else if(key == 1 && currentScreen>=5&& currentScreen<=7) { 216 parameters[currentScreen]=parameters[currentScreen]-0.01; 217 }else if(key == 0 && currentScreen!=5) { 218 parameters[currentScreen]++; 219 }else if(key == 1 && currentScreen!=5) { 220 parameters[currentScreen]--;} 221O_V=byte(parameters[0]); 222L_V=byte(parameters[1]); 223O_C=byte(parameters[2]); 224L_F=byte(parameters[3]); 225O_F=byte(parameters[4]); 226L_PF1=parameters[5]; 227L_PF2=parameters[6]; 228L_PF3=parameters[7]; 229tms_set1=parameters[8]; 230tms_set2=parameters[9]; 231tms_set3=parameters[10]; 232tms_set4=parameters[11]; 233R1mood=parameters[12]; 234R2mood=parameters[13]; 235R3mood=parameters[14]; 236R4mood=parameters[15];} 237 238void printScreen() { 239 lcd.clear(); 240 lcd.print(screens[currentScreen][0]); 241 lcd.setCursor(0,1); 242 lcd.print(parameters[currentScreen]); 243 lcd.print(" "); 244 lcd.print(screens[currentScreen][1]); 245} 246////////////////////////////pzem reeding prametr 247void Reeding_par(){ 248 249 250 // Serial.print("Custom Address:"); 251 // Serial.println(pzem.readAddress(), HEX); 252 253 // Read the data from the sensor 254 voltage = pzem.voltage(); 255 current = pzem.current(); 256 power = pzem.power(); 257 energy = pzem.energy(); 258 frequency = pzem.frequency(); 259 //pf = pzem.pf(); 260 if(pzem.pf()<0.1){ 261 pf=1.00; 262 }else if(pzem.pf()>0.99){ 263 pf=0.00; 264 }else{ 265 pf=pzem.pf(); 266 } 267 268 // Check if the data is valid 269 if(isnan(voltage)){ 270 //Serial.println("Error reading voltage"); 271 lcd.clear(); 272 lcd.setCursor(0, 1); 273 lcd.print("Error readingVoltage"); 274 } else if (isnan(current)) { 275 // Serial.println("Error reading current"); 276 lcd.clear(); 277 lcd.setCursor(0, 1); 278 lcd.print("Error readingCurrent"); 279 } else if (isnan(power)) { 280 // Serial.println("Error reading power"); 281 lcd.clear(); 282 lcd.setCursor(0, 1); 283 lcd.print("Error reading Power"); 284 } else if (isnan(energy)) { 285 // Serial.println("Error reading energy"); 286 lcd.clear(); 287 lcd.setCursor(0, 1); 288 lcd.print("Error reading Energy"); 289 } else if (isnan(frequency)) { 290 // Serial.println("Error reading frequency"); 291 lcd.clear(); 292 lcd.setCursor(0, 1); 293 lcd.print("Error Read Frequency"); 294 } else if (isnan(pf)) { 295 // Serial.println("Error reading power factor"); 296 lcd.clear(); 297 lcd.setCursor(0, 1); 298 lcd.print("ErrorReadPowerFactor"); 299 } else { 300//Serial.print(x);Serial.print(","); 301 302 // Print the values to the Serial console 303 Serial.print(voltage);Serial.print(","); 304 // Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V"); 305 lcd.setCursor(0,0); lcd.print("V:"); lcd.setCursor(2,0); lcd.print(voltage); 306 // Serial.print("Current: "); Serial.print(current); Serial.println("A"); 307 Serial.print(current);Serial.print(","); 308 lcd.setCursor(10,0); lcd.print("I:"); lcd.setCursor(12,0); lcd.print(current); 309 // Serial.print("Power: "); Serial.print(power); Serial.println("W"); 310 Serial.print(power);Serial.print(","); 311 lcd.setCursor(0,1); lcd.print("W:"); lcd.setCursor(2,1); lcd.print(power); lcd.print(" "); 312 // Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh"); 313 Serial.print(energy,3);Serial.print(","); 314 lcd.setCursor(10,1); lcd.print("KWh:"); lcd.setCursor(14,1); lcd.print(energy,3); lcd.print(" "); 315 // Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz"); 316 Serial.print(frequency, 1);Serial.print(","); 317 lcd.setCursor(0,2); lcd.print("Hz:"); lcd.setCursor(3,2); lcd.print(frequency, 1); 318 // Serial.print("PF: "); Serial.println(pf); 319 320 lcd.setCursor(10,2); lcd.print("PF:"); 321 /* if(pf<0.1){ 322 323 Serial.println("1"); 324 lcd.setCursor(13,2); lcd.print(1); 325 pf=1; 326 }else{ 327 Serial.println(pf); 328 lcd.setCursor(13,2); lcd.print(pf);}*/ 329 Serial.println(pf); 330 lcd.setCursor(13,2); lcd.print(pf); 331 332 lcd.setCursor(0,3); lcd.print("TMS1="); lcd.print(tms_set1); 333} 334 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 335 336 337} 338 void save_eep(){ 339 if(fclear==0){ 340 EEPROM.update(1, O_V); 341 EEPROM.update(2, L_V); 342 EEPROM.update(3, O_C); 343 EEPROM.update(4, L_F); 344 EEPROM.update(5, O_F); 345 EEPROM.put(10, L_PF1); 346 EEPROM.put(30, L_PF2); 347 EEPROM.put(50, L_PF3); 348 EEPROM.put(70,tms_set1); 349 EEPROM.put(100,tms_set2); 350 EEPROM.put(130,tms_set3); 351 EEPROM.put(160,tms_set4); 352 EEPROM.put(190,R1mood); 353 EEPROM.put(191,R2mood); 354 EEPROM.put(192,R3mood); 355 EEPROM.put(193,R4mood); 356 357 lcd.clear(); 358 fclear=1;} 359 } 360void relay_new(){ 361switch (R1mood) { 362 case 1: 363 //tms_On 364 if(current>O_C){ 365 timeroc1++; 366 ti1=(0.14*float(tms_set1))/(pow(current/float(O_C),0.02)-1); 367 if(timeroc1>=ti1){ 368 timeroc1==ti1; 369 digitalWrite(relly1,LOW); 370 } 371 }else{ 372 digitalWrite(relly1,HIGH); 373 timeroc1=0; 374 } 375 break; 376 case 2: 377 if(current>O_C){ 378 timeroc1++; 379 if(timeroc1>=tms_set1){ 380 timeroc1==tms_set1; 381 digitalWrite(relly1,LOW); 382 } 383 }else{ 384 digitalWrite(relly1,HIGH); 385 timeroc1=0; 386 } 387 break; 388 case 3: 389 if(voltage>O_V){ 390 timeroc1++; 391 if(timeroc1>=tms_set1){ 392 timeroc1==tms_set1; 393 digitalWrite(relly1,LOW); 394 } 395 }else{ 396 digitalWrite(relly1,HIGH); 397 timeroc1=0; 398 } 399 break; 400 case 4: 401 if(voltage<L_V){ 402 timeroc1++; 403 if(timeroc1>=tms_set1){ 404 timeroc1==tms_set1; 405 digitalWrite(relly1,LOW); 406 } 407 }else{ 408 digitalWrite(relly1,HIGH); 409 timeroc1=0; 410 } 411 break; 412 case 5: 413 if(frequency<L_F){ 414 timeroc1++; 415 if(timeroc1>=tms_set1){ 416 timeroc1==tms_set1; 417 digitalWrite(relly1,LOW); 418 } 419 }else{ 420 digitalWrite(relly1,HIGH); 421 timeroc1=0; 422 } 423 break; 424 case 6: 425 if(frequency>O_F){ 426 timeroc1++; 427 if(timeroc1>=tms_set1){ 428 timeroc1==tms_set1; 429 digitalWrite(relly1,LOW); 430 } 431 }else{ 432 digitalWrite(relly1,HIGH); 433 timeroc1=0; 434 } 435 break; 436 case 7: 437 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 438 timeroc1++; 439 if(timeroc1>=tms_set1){ 440 timeroc1==tms_set1; 441 digitalWrite(relly1,LOW); 442 } 443 }else{ 444 digitalWrite(relly1,HIGH); 445 timeroc1=0; 446 } 447 break; 448 case 8: 449 if(pf<L_PF1){ 450 timeroc1++; 451 if(timeroc1>=tms_set1){ 452 timeroc1==tms_set1; 453 digitalWrite(relly1,LOW); 454 } 455 }else{ 456 digitalWrite(relly1,HIGH); 457 timeroc1=0; 458 } 459 break; 460 case 9: 461 if(pf<L_PF2){ 462 timeroc1++; 463 if(timeroc1>=tms_set1){ 464 timeroc1==tms_set1; 465 digitalWrite(relly1,LOW); 466 } 467 }else{ 468 digitalWrite(relly1,HIGH); 469 timeroc1=0; 470 } 471 break; 472 case 10: 473 if(pf<L_PF3){ 474 timeroc1++; 475 if(timeroc1>=tms_set1){ 476 timeroc1==tms_set1; 477 digitalWrite(relly1,LOW); 478 } 479 }else{ 480 digitalWrite(relly1,HIGH); 481 timeroc1=0; 482 } 483 break; 484 case 11: 485 if(voltage>O_V||voltage<L_V){ 486 timeroc1++; 487 if(timeroc1>=tms_set1){ 488 timeroc1==tms_set1; 489 digitalWrite(relly1,LOW); 490 } 491 }else{ 492 digitalWrite(relly1,HIGH); 493 timeroc1=0; 494 } 495 break; 496 case 12: 497 if(frequency<L_F||frequency>O_F){ 498 timeroc1++; 499 if(timeroc1>=tms_set1){ 500 timeroc1==tms_set1; 501 digitalWrite(relly1,LOW); 502 } 503 }else{ 504 digitalWrite(relly1,HIGH); 505 timeroc1=0; 506 } 507 break; 508 default: 509 digitalWrite(relly1,HIGH); 510 break; 511 } 512switch (R2mood) { 513 case 1: 514 //tms_On 515 if(current>O_C){ 516 timeroc2++; 517 ti2=(0.14*float(tms_set2))/(pow(current/float(O_C),0.02)-1); 518 //Serial.println(tms); 519 if(timeroc2>=ti2){ 520 timeroc2==ti2; 521 // Serial.println("on erlly"); 522 digitalWrite(relly2,LOW); 523 } 524 }else{ 525 digitalWrite(relly2,HIGH); 526 timeroc2=0; 527 } 528 break; 529 case 2: 530 if(current>O_C){ 531 timeroc2++; 532 if(timeroc2>=tms_set2){ 533 timeroc2==tms_set2; 534 digitalWrite(relly2,LOW); 535 } 536 }else{ 537 digitalWrite(relly2,HIGH); 538 timeroc2=0; 539 } 540 break; 541 case 3: 542 if(voltage>O_V){ 543 timeroc2++; 544 if(timeroc2>=tms_set2){ 545 timeroc2==tms_set2; 546 digitalWrite(relly2,LOW); 547 } 548 }else{ 549 digitalWrite(relly2,HIGH); 550 timeroc2=0; 551 } 552 break; 553 case 4: 554 if(voltage<L_V){ 555 timeroc2++; 556 if(timeroc2>=tms_set2){ 557 timeroc2==tms_set2; 558 digitalWrite(relly2,LOW); 559 } 560 }else{ 561 digitalWrite(relly2,HIGH); 562 timeroc2=0; 563 } 564 break; 565 case 5: 566 if(frequency<L_F){ 567 timeroc2++; 568 if(timeroc2>=tms_set2){ 569 timeroc2==tms_set2; 570 digitalWrite(relly2,LOW); 571 } 572 }else{ 573 digitalWrite(relly2,HIGH); 574 timeroc2=0; 575 } 576 break; 577 case 6: 578 if(frequency>O_F){ 579 timeroc2++; 580 if(timeroc2>=tms_set2){ 581 timeroc2==tms_set2; 582 digitalWrite(relly2,LOW); 583 } 584 }else{ 585 digitalWrite(relly2,HIGH); 586 timeroc2=0; 587 } 588 break; 589 case 7: 590 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 591 timeroc2++; 592 //Serial.println(tms); 593 if(timeroc2>=tms_set2){ 594 timeroc2==tms_set2; 595 // Serial.println("on erlly"); 596 digitalWrite(relly2,LOW); 597 } 598 }else{ 599 digitalWrite(relly2,HIGH); 600 timeroc2=0; 601 } 602 break; 603 case 8: 604 if(pf<L_PF1){ 605 timeroc2++; 606 if(timeroc2>=tms_set2){ 607 timeroc2==tms_set2; 608 digitalWrite(relly2,LOW); 609 } 610 }else{ 611 digitalWrite(relly2,HIGH); 612 timeroc2=0; 613 } 614 break; 615 case 9: 616 if(pf<L_PF2){ 617 timeroc2++; 618 if(timeroc2>=tms_set2){ 619 timeroc2==tms_set2; 620 digitalWrite(relly2,LOW); 621 } 622 }else{ 623 digitalWrite(relly2,HIGH); 624 timeroc2=0; 625 } 626 break; 627 case 10: 628 if(pf<L_PF3){ 629 timeroc2++; 630 if(timeroc2>=tms_set2){ 631 timeroc2==tms_set2; 632 digitalWrite(relly2,LOW); 633 } 634 }else{ 635 digitalWrite(relly2,HIGH); 636 timeroc2=0; 637 } 638 break; 639 case 11: 640 if(voltage>O_V||voltage<L_V){ 641 timeroc2++; 642 if(timeroc2>=tms_set2){ 643 timeroc2==tms_set2; 644 digitalWrite(relly2,LOW); 645 } 646 }else{ 647 digitalWrite(relly2,HIGH); 648 timeroc2=0; 649 } 650 break; 651 case 12: 652 if(frequency<L_F||frequency>O_F){ 653 timeroc2++; 654 if(timeroc2>=tms_set2){ 655 timeroc2==tms_set2; 656 digitalWrite(relly2,LOW); 657 } 658 }else{ 659 digitalWrite(relly2,HIGH); 660 timeroc2=0; 661 } 662 break; 663 default: 664 digitalWrite(relly2,HIGH); 665 break; 666 } 667 switch (R3mood) { 668 case 1: 669 //tms_On 670 if(current>O_C){ 671 timeroc3++; 672 ti3=(0.14*float(tms_set3))/(pow(current/float(O_C),0.02)-1); 673 //Serial.println(tms); 674 if(timeroc3>=ti3){ 675 timeroc3==ti3; 676 // Serial.println("on erlly"); 677 digitalWrite(relly3,LOW); 678 } 679 }else{ 680 digitalWrite(relly3,HIGH); 681 timeroc3=0; 682 } 683 break; 684 case 2: 685 if(current>O_C){ 686 timeroc3++; 687 if(timeroc3>=tms_set3){ 688 timeroc3==tms_set3; 689 digitalWrite(relly3,LOW); 690 } 691 }else{ 692 digitalWrite(relly3,HIGH); 693 timeroc3=0; 694 } 695 break; 696 case 3: 697 if(voltage>O_V){ 698 timeroc3++; 699 if(timeroc3>=tms_set3){ 700 timeroc3==tms_set3; 701 digitalWrite(relly3,LOW); 702 } 703 }else{ 704 digitalWrite(relly3,HIGH); 705 timeroc3=0; 706 } 707 break; 708 case 4: 709 if(voltage<L_V){ 710 timeroc3++; 711 if(timeroc3>=tms_set3){ 712 timeroc3==tms_set3; 713 digitalWrite(relly3,LOW); 714 } 715 }else{ 716 digitalWrite(relly3,HIGH); 717 timeroc3=0; 718 } 719 break; 720 case 5: 721 if(frequency<L_F){ 722 timeroc3++; 723 if(timeroc3>=tms_set3){ 724 timeroc3==tms_set3; 725 digitalWrite(relly3,LOW); 726 } 727 }else{ 728 digitalWrite(relly3,HIGH); 729 timeroc3=0; 730 } 731 break; 732 case 6: 733 if(frequency>O_F){ 734 timeroc3++; 735 if(timeroc3>=tms_set3){ 736 timeroc3==tms_set3; 737 digitalWrite(relly3,LOW); 738 } 739 }else{ 740 digitalWrite(relly3,HIGH); 741 timeroc3=0; 742 } 743 break; 744 case 7: 745 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 746 timeroc3++; 747 //Serial.println(tms); 748 if(timeroc3>=tms_set3){ 749 timeroc3==tms_set3; 750 // Serial.println("on erlly"); 751 digitalWrite(relly3,LOW); 752 } 753 }else{ 754 digitalWrite(relly3,HIGH); 755 timeroc3=0; 756 } 757 break; 758 case 8: 759 if(pf<L_PF1){ 760 timeroc3++; 761 if(timeroc3>=tms_set3){ 762 timeroc3==tms_set3; 763 digitalWrite(relly3,LOW); 764 } 765 }else{ 766 digitalWrite(relly3,HIGH); 767 timeroc3=0; 768 } 769 break; 770 case 9: 771 if(pf<L_PF2){ 772 timeroc3++; 773 if(timeroc3>=tms_set3){ 774 timeroc3==tms_set3; 775 digitalWrite(relly3,LOW); 776 } 777 }else{ 778 digitalWrite(relly3,HIGH); 779 timeroc3=0; 780 } 781 break; 782 case 10: 783 if(pf<L_PF3){ 784 timeroc3++; 785 if(timeroc3>=tms_set3){ 786 timeroc3==tms_set3; 787 digitalWrite(relly3,LOW); 788 } 789 }else{ 790 digitalWrite(relly3,HIGH); 791 timeroc3=0; 792 } 793 break; 794 case 11: 795 if(voltage>O_V||voltage<L_V){ 796 timeroc3++; 797 if(timeroc3>=tms_set3){ 798 timeroc3==tms_set3; 799 digitalWrite(relly3,LOW); 800 } 801 }else{ 802 digitalWrite(relly3,HIGH); 803 timeroc3=0; 804 } 805 break; 806 case 12: 807 if(frequency<L_F||frequency>O_F){ 808 timeroc3++; 809 if(timeroc3>=tms_set3){ 810 timeroc3==tms_set3; 811 digitalWrite(relly3,LOW); 812 } 813 }else{ 814 digitalWrite(relly3,HIGH); 815 timeroc3=0; 816 } 817 break; 818 default: 819 digitalWrite(relly3,HIGH); 820 break; 821 } 822switch (R4mood) { 823 case 1: 824 //tms_On 825 if(current>O_C){ 826 timeroc4++; 827 ti4=(0.14*float(tms_set4))/(pow(current/float(O_C),0.02)-1); 828 //Serial.println(tms); 829 if(timeroc4>=ti4){ 830 timeroc4==ti4; 831 // Serial.println("on erlly"); 832 digitalWrite(relly4,LOW); 833 } 834 }else{ 835 digitalWrite(relly4,HIGH); 836 timeroc4=0; 837 } 838 break; 839 case 2: 840 if(current>O_C){ 841 timeroc4++; 842 if(timeroc4>=tms_set4){ 843 timeroc4==tms_set4; 844 digitalWrite(relly4,LOW); 845 } 846 }else{ 847 digitalWrite(relly4,HIGH); 848 timeroc4=0; 849 } 850 break; 851 case 3: 852 if(voltage>O_V){ 853 timeroc4++; 854 if(timeroc4>=tms_set4){ 855 timeroc4==tms_set4; 856 digitalWrite(relly4,LOW); 857 } 858 }else{ 859 digitalWrite(relly4,HIGH); 860 timeroc4=0; 861 } 862 break; 863 case 4: 864 if(voltage<L_V){ 865 timeroc4++; 866 if(timeroc4>=tms_set4){ 867 timeroc4==tms_set4; 868 digitalWrite(relly4,LOW); 869 } 870 }else{ 871 digitalWrite(relly4,HIGH); 872 timeroc4=0; 873 } 874 break; 875 case 5: 876 if(frequency<L_F){ 877 timeroc4++; 878 if(timeroc4>=tms_set4){ 879 timeroc4==tms_set4; 880 digitalWrite(relly4,LOW); 881 } 882 }else{ 883 digitalWrite(relly4,HIGH); 884 timeroc4=0; 885 } 886 break; 887 case 6: 888 if(frequency>O_F){ 889 timeroc4++; 890 if(timeroc4>=tms_set4){ 891 timeroc4==tms_set4; 892 digitalWrite(relly4,LOW); 893 } 894 }else{ 895 digitalWrite(relly4,HIGH); 896 timeroc4=0; 897 } 898 break; 899 case 7: 900 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 901 timeroc4++; 902 //Serial.println(tms); 903 if(timeroc4>=tms_set4){ 904 timeroc4==tms_set4; 905 // Serial.println("on erlly"); 906 digitalWrite(relly4,LOW); 907 } 908 }else{ 909 digitalWrite(relly4,HIGH); 910 timeroc4=0; 911 } 912 break; 913 case 8: 914 if(pf<L_PF1){ 915 timeroc4++; 916 if(timeroc4>=tms_set4){ 917 timeroc4==tms_set4; 918 digitalWrite(relly4,LOW); 919 } 920 }else{ 921 digitalWrite(relly4,HIGH); 922 timeroc4=0; 923 } 924 break; 925 case 9: 926 if(pf<L_PF2){ 927 timeroc4++; 928 if(timeroc4>=tms_set4){ 929 timeroc4==tms_set4; 930 digitalWrite(relly4,LOW); 931 } 932 }else{ 933 digitalWrite(relly4,HIGH); 934 timeroc4=0; 935 } 936 break; 937 case 10: 938 if(pf<L_PF3){ 939 timeroc4++; 940 if(timeroc4>=tms_set4){ 941 timeroc4==tms_set4; 942 digitalWrite(relly4,LOW); 943 } 944 }else{ 945 digitalWrite(relly4,HIGH); 946 timeroc4=0; 947 } 948 break; 949 case 11: 950 if(voltage>O_V||voltage<L_V){ 951 timeroc4++; 952 if(timeroc4>=tms_set4){ 953 timeroc4==tms_set4; 954 digitalWrite(relly4,LOW); 955 } 956 }else{ 957 digitalWrite(relly4,HIGH); 958 timeroc4=0; 959 } 960 break; 961 case 12: 962 if(frequency<L_F||frequency>O_F){ 963 timeroc4++; 964 if(timeroc4>=tms_set4){ 965 timeroc4==tms_set4; 966 digitalWrite(relly4,LOW); 967 } 968 }else{ 969 digitalWrite(relly4,HIGH); 970 timeroc4=0; 971 } 972 break; 973 default: 974 digitalWrite(relly4,HIGH); 975 break; 976 } 977}
Arduino code version 500V
Ability to measure up to 500 volts
1/* 500v cod 2 * Amir_eshaqy 3 * 4 * telegram = amir_eshaqy 5 * gmail = amir9336146433@gmail.com 6 * 7 * Schematic and tutorial files on GitHub 8 * GitHub = https://github.com/amir-eshaqy/pz 9 * 10 */ 11 12#include <PZEM004Tv30.h> 13#include <Wire.h> 14#include <LiquidCrystal.h> 15#include <EEPROM.h> 16 17PZEM004Tv30 pzem(4,5);//arduino 18float voltage; 19float current; 20float power; 21float energy; 22float frequency; 23float pf; 24//LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x3F for a 16 chars and 2 line display 25 26LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); 27 28byte R1mood=0; 29byte R2mood=0; 30byte R3mood=0; 31byte R4mood=0; 32 33 34byte mood=3; 35byte relly1=8; 36byte relly2=7; 37byte relly3=6; 38byte relly4=2; 39byte fclear=0; 40int tms_set1=1; 41int tms_set2=1; 42int tms_set3=1; 43int tms_set4=1; 44int timeroc1=0; 45int timeroc2=0; 46int timeroc3=0; 47int timeroc4=0; 48float ti1=0.00; 49float ti2=0.00; 50float ti3=0.00; 51float ti4=0.00; 52byte O_V=0; 53byte L_V=0; 54byte O_C=0; 55byte L_F=0; 56byte O_F=0; 57float L_PF1=0.90; 58float L_PF2=0.85; 59float L_PF3=0.80; 60//Input & Button Logic 61const int numOfInputs = 4; 62const int inputPins[numOfInputs] = {12,11,10,9}; 63int inputState[numOfInputs]; 64int lastInputState[numOfInputs] = {LOW,LOW,LOW,LOW}; 65bool inputFlags[numOfInputs] = {LOW,LOW,LOW,LOW}; 66long lastDebounceTime[numOfInputs] = {0,0,0,0}; 67long debounceDelay = 5; 68 69//LCD Menu Logic 70const int numOfScreens = 16; 71int currentScreen = 0; 72String screens[numOfScreens][2] = {{"Over Voltage","Volts"}, {"Low Voltage","Volts"}, 73{"Over Current","Amper"},{"Low Frequency","Hz"},{"Over Frequency","Hz"}, {"LOW POWER FACTOR 1", "CosFi"}, {"LOW POWER FACTOR 2", "CosFi"}, {"LOW POWER FACTOR 3", "CosFi"},{"TMS1 SET", " "},{"TMS2 SET", " "},{"TMS3 SET", ""},{"TMS4 SET", " "},{"R1_Mood", " "},{"R2_Mood", " "},{"R3_Mood", " "},{"R4_Mood", " "}}; 74 75float parameters[numOfScreens]; 76 77 78 79 80void setup() { 81 O_V=EEPROM.read(1); 82 L_V=EEPROM.read(2); 83 O_C=EEPROM.read(3); 84 L_F=EEPROM.read(4); 85 O_F=EEPROM.read(5); 86 EEPROM.get(10,L_PF1); 87 EEPROM.get(30,L_PF2); 88 EEPROM.get(50,L_PF3); 89 EEPROM.get(70,tms_set1); 90 EEPROM.get(100,tms_set2); 91 EEPROM.get(130,tms_set3); 92 EEPROM.get(160,tms_set4); 93 R1mood=EEPROM.read(190); 94 R2mood=EEPROM.read(191); 95 R3mood=EEPROM.read(192); 96 R4mood=EEPROM.read(193); 97 parameters[0]=float(O_V); 98 parameters[1]=float(L_V); 99 parameters[2]=float(O_C); 100 parameters[3]=float(L_F); 101 parameters[4]=float(O_F); 102 parameters[5]=L_PF1; 103 parameters[6]=L_PF2; 104 parameters[7]=L_PF3; 105 parameters[8]=tms_set1; 106 parameters[9]=tms_set2; 107 parameters[10]=tms_set3; 108 parameters[11]=tms_set4; 109 parameters[12]=R1mood; 110 parameters[13]=R2mood; 111 parameters[14]=R3mood; 112 parameters[15]=R4mood; 113 Serial.begin(115200); 114// lcd.begin(); 115 //lcd.init(); // initialize the lcd 116 117 lcd.begin(20, 4); 118 119// lcd.backlight(); 120 lcd.clear(); 121 lcd.setCursor(5, 1); 122 lcd.print("AMIR_ESHAQY"); 123 delay(2000); 124 lcd.clear(); 125 // Uncomment in order to reset the internal energy counter 126 // pzem.resetEnergy() 127 for(int i = 0; i < numOfInputs; i++) { 128 pinMode(inputPins[i], INPUT); 129 digitalWrite(inputPins[i], HIGH); // pull-up 20k 130 } 131 pinMode(mood,INPUT); 132 pinMode(relly1,OUTPUT); 133 pinMode(relly2,OUTPUT); 134 pinMode(relly3,OUTPUT); 135 pinMode(relly4,OUTPUT); 136 137 digitalWrite(relly4,HIGH); 138 digitalWrite(relly3,HIGH); 139 digitalWrite(relly2,HIGH); 140 digitalWrite(relly1,HIGH); 141} 142 143 144 145 146 147/////////////////////////////////////////////////////////////////////////////////////////////// 148void loop(){ 149 if(digitalRead(mood)==HIGH){ 150 151 save_eep(); 152 Reeding_par(); 153// rellay(); 154relay_new(); 155 // Serial.println(); 156 delay(100); 157}else{ 158 fclear=0; 159 setInputFlags(); 160 resolveInputFlags(); 161 } 162} 163 164void setInputFlags() { 165 for(int i = 0; i < numOfInputs; i++) { 166 int reading = digitalRead(inputPins[i]); 167 if (reading != lastInputState[i]) { 168 lastDebounceTime[i] = millis(); 169 } 170 if ((millis() - lastDebounceTime[i]) > debounceDelay) { 171 if (reading != inputState[i]) { 172 inputState[i] = reading; 173 if (inputState[i] == HIGH) { 174 inputFlags[i] = HIGH; 175 } 176 } 177 } 178 lastInputState[i] = reading; 179 } 180} 181 182void resolveInputFlags() { 183 for(int i = 0; i < numOfInputs; i++) { 184 if(inputFlags[i] == HIGH) { 185 inputAction(i); 186 inputFlags[i] = LOW; 187 printScreen(); 188 } 189 } 190} 191 192void inputAction(int input) { 193 if(input == 0) { 194 if (currentScreen == 0) { 195 currentScreen = numOfScreens-1; 196 }else{ 197 currentScreen--; 198 } 199 }else if(input == 1) { 200 if (currentScreen == numOfScreens-1) { 201 currentScreen = 0; 202 }else{ 203 currentScreen++; 204 } 205 }else if(input == 2) { 206 parameterChange(0); 207 }else if(input == 3) { 208 parameterChange(1); 209 } 210} 211 212void parameterChange(int key) { 213 if(key == 0 && currentScreen>=5&& currentScreen<=7) { 214 parameters[currentScreen]=parameters[currentScreen]+0.01; 215 }else if(key == 1 && currentScreen>=5&& currentScreen<=7) { 216 parameters[currentScreen]=parameters[currentScreen]-0.01; 217 }else if(key == 0 && currentScreen!=5) { 218 parameters[currentScreen]++; 219 }else if(key == 1 && currentScreen!=5) { 220 parameters[currentScreen]--;} 221O_V=byte(parameters[0]); 222L_V=byte(parameters[1]); 223O_C=byte(parameters[2]); 224L_F=byte(parameters[3]); 225O_F=byte(parameters[4]); 226L_PF1=parameters[5]; 227L_PF2=parameters[6]; 228L_PF3=parameters[7]; 229tms_set1=parameters[8]; 230tms_set2=parameters[9]; 231tms_set3=parameters[10]; 232tms_set4=parameters[11]; 233R1mood=parameters[12]; 234R2mood=parameters[13]; 235R3mood=parameters[14]; 236R4mood=parameters[15];} 237 238void printScreen() { 239 lcd.clear(); 240 lcd.print(screens[currentScreen][0]); 241 lcd.setCursor(0,1); 242 lcd.print(parameters[currentScreen]); 243 lcd.print(" "); 244 lcd.print(screens[currentScreen][1]); 245} 246////////////////////////////pzem reeding prametr 247void Reeding_par(){ 248 249 250 // Serial.print("Custom Address:"); 251 // Serial.println(pzem.readAddress(), HEX); 252 253 // Read the data from the sensor 254 ////////////////////////////V500/////////////////////// 255 256/* 257According to the resistive voltage division circuit coefficient. These values must be set 2581.75 2591.7701 2601.767 2611.763 2621.76 263 264*/ 265 266 float x34=pzem.voltage(); 267 // Serial.println(x34); 268 if(x34<57){ 269 voltage= pzem.voltage()*1.75;} 270 if(x34<114&&x34>57){ 271 voltage= pzem.voltage()*1.7701;} 272 if(x34<170&&x34>114){ 273 voltage= pzem.voltage()*1.767;} 274 if(x34<227&&x34>170){ 275 voltage= pzem.voltage()*1.763;} 276 if(x34<285&&x34>227){ 277 voltage= pzem.voltage()*1.76;} 278 /////////////////////////////V500////////////////////////////// 279 280 current = pzem.current(); 281 power = pzem.power(); 282 energy = pzem.energy(); 283 frequency = pzem.frequency(); 284 //pf = pzem.pf(); 285 if(pzem.pf()<0.1){ 286 pf=1.00; 287 }else if(pzem.pf()>0.99){ 288 pf=0.00; 289 }else{ 290 pf=pzem.pf(); 291 } 292 293 // Check if the data is valid 294 if(isnan(voltage)){ 295 //Serial.println("Error reading voltage"); 296 lcd.clear(); 297 lcd.setCursor(0, 1); 298 lcd.print("Error readingVoltage"); 299 } else if (isnan(current)) { 300 // Serial.println("Error reading current"); 301 lcd.clear(); 302 lcd.setCursor(0, 1); 303 lcd.print("Error readingCurrent"); 304 } else if (isnan(power)) { 305 // Serial.println("Error reading power"); 306 lcd.clear(); 307 lcd.setCursor(0, 1); 308 lcd.print("Error reading Power"); 309 } else if (isnan(energy)) { 310 // Serial.println("Error reading energy"); 311 lcd.clear(); 312 lcd.setCursor(0, 1); 313 lcd.print("Error reading Energy"); 314 } else if (isnan(frequency)) { 315 // Serial.println("Error reading frequency"); 316 lcd.clear(); 317 lcd.setCursor(0, 1); 318 lcd.print("Error Read Frequency"); 319 } else if (isnan(pf)) { 320 // Serial.println("Error reading power factor"); 321 lcd.clear(); 322 lcd.setCursor(0, 1); 323 lcd.print("ErrorReadPowerFactor"); 324 } else { 325//Serial.print(x);Serial.print(","); 326 327 // Print the values to the Serial console 328 Serial.print(voltage);Serial.print(","); 329 // Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V"); 330 lcd.setCursor(0,0); lcd.print("V:"); lcd.setCursor(2,0); lcd.print(voltage); 331 // Serial.print("Current: "); Serial.print(current); Serial.println("A"); 332 Serial.print(current);Serial.print(","); 333 lcd.setCursor(10,0); lcd.print("I:"); lcd.setCursor(12,0); lcd.print(current); 334 // Serial.print("Power: "); Serial.print(power); Serial.println("W"); 335 Serial.print(power);Serial.print(","); 336 lcd.setCursor(0,1); lcd.print("W:"); lcd.setCursor(2,1); lcd.print(power); lcd.print(" "); 337 // Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh"); 338 Serial.print(energy,3);Serial.print(","); 339 lcd.setCursor(10,1); lcd.print("KWh:"); lcd.setCursor(14,1); lcd.print(energy,3); lcd.print(" "); 340 // Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz"); 341 Serial.print(frequency, 1);Serial.print(","); 342 lcd.setCursor(0,2); lcd.print("Hz:"); lcd.setCursor(3,2); lcd.print(frequency, 1); 343 //Serial.print("PF: "); Serial.println(pf); 344 345 lcd.setCursor(10,2); lcd.print("PF:"); 346 /* if(pf<0.1){ 347 348 Serial.println("1"); 349 lcd.setCursor(13,2); lcd.print(1); 350 pf=1; 351 }else{ 352 Serial.println(pf); 353 lcd.setCursor(13,2); lcd.print(pf);}*/ 354 Serial.println(pf); 355 lcd.setCursor(13,2); lcd.print(pf); 356 357 lcd.setCursor(0,3); lcd.print("TMS1="); lcd.print(tms_set1); 358} 359 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 360 361 362} 363 void save_eep(){ 364 if(fclear==0){ 365 EEPROM.update(1, O_V); 366 EEPROM.update(2, L_V); 367 EEPROM.update(3, O_C); 368 EEPROM.update(4, L_F); 369 EEPROM.update(5, O_F); 370 EEPROM.put(10, L_PF1); 371 EEPROM.put(30, L_PF2); 372 EEPROM.put(50, L_PF3); 373 EEPROM.put(70,tms_set1); 374 EEPROM.put(100,tms_set2); 375 EEPROM.put(130,tms_set3); 376 EEPROM.put(160,tms_set4); 377 EEPROM.put(190,R1mood); 378 EEPROM.put(191,R2mood); 379 EEPROM.put(192,R3mood); 380 EEPROM.put(193,R4mood); 381 382 lcd.clear(); 383 fclear=1;} 384 } 385void relay_new(){ 386switch (R1mood) { 387 case 1: 388 //tms_On 389 if(current>O_C){ 390 timeroc1++; 391 ti1=(0.14*float(tms_set1))/(pow(current/float(O_C),0.02)-1); 392 if(timeroc1>=ti1){ 393 timeroc1==ti1; 394 digitalWrite(relly1,LOW); 395 } 396 }else{ 397 digitalWrite(relly1,HIGH); 398 timeroc1=0; 399 } 400 break; 401 case 2: 402 if(current>O_C){ 403 timeroc1++; 404 if(timeroc1>=tms_set1){ 405 timeroc1==tms_set1; 406 digitalWrite(relly1,LOW); 407 } 408 }else{ 409 digitalWrite(relly1,HIGH); 410 timeroc1=0; 411 } 412 break; 413 case 3: 414 if(voltage>O_V){ 415 timeroc1++; 416 if(timeroc1>=tms_set1){ 417 timeroc1==tms_set1; 418 digitalWrite(relly1,LOW); 419 } 420 }else{ 421 digitalWrite(relly1,HIGH); 422 timeroc1=0; 423 } 424 break; 425 case 4: 426 if(voltage<L_V){ 427 timeroc1++; 428 if(timeroc1>=tms_set1){ 429 timeroc1==tms_set1; 430 digitalWrite(relly1,LOW); 431 } 432 }else{ 433 digitalWrite(relly1,HIGH); 434 timeroc1=0; 435 } 436 break; 437 case 5: 438 if(frequency<L_F){ 439 timeroc1++; 440 if(timeroc1>=tms_set1){ 441 timeroc1==tms_set1; 442 digitalWrite(relly1,LOW); 443 } 444 }else{ 445 digitalWrite(relly1,HIGH); 446 timeroc1=0; 447 } 448 break; 449 case 6: 450 if(frequency>O_F){ 451 timeroc1++; 452 if(timeroc1>=tms_set1){ 453 timeroc1==tms_set1; 454 digitalWrite(relly1,LOW); 455 } 456 }else{ 457 digitalWrite(relly1,HIGH); 458 timeroc1=0; 459 } 460 break; 461 case 7: 462 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 463 timeroc1++; 464 if(timeroc1>=tms_set1){ 465 timeroc1==tms_set1; 466 digitalWrite(relly1,LOW); 467 } 468 }else{ 469 digitalWrite(relly1,HIGH); 470 timeroc1=0; 471 } 472 break; 473 case 8: 474 if(pf<L_PF1){ 475 timeroc1++; 476 if(timeroc1>=tms_set1){ 477 timeroc1==tms_set1; 478 digitalWrite(relly1,LOW); 479 } 480 }else{ 481 digitalWrite(relly1,HIGH); 482 timeroc1=0; 483 } 484 break; 485 case 9: 486 if(pf<L_PF2){ 487 timeroc1++; 488 if(timeroc1>=tms_set1){ 489 timeroc1==tms_set1; 490 digitalWrite(relly1,LOW); 491 } 492 }else{ 493 digitalWrite(relly1,HIGH); 494 timeroc1=0; 495 } 496 break; 497 case 10: 498 if(pf<L_PF3){ 499 timeroc1++; 500 if(timeroc1>=tms_set1){ 501 timeroc1==tms_set1; 502 digitalWrite(relly1,LOW); 503 } 504 }else{ 505 digitalWrite(relly1,HIGH); 506 timeroc1=0; 507 } 508 break; 509 case 11: 510 if(voltage>O_V||voltage<L_V){ 511 timeroc1++; 512 if(timeroc1>=tms_set1){ 513 timeroc1==tms_set1; 514 digitalWrite(relly1,LOW); 515 } 516 }else{ 517 digitalWrite(relly1,HIGH); 518 timeroc1=0; 519 } 520 break; 521 case 12: 522 if(frequency<L_F||frequency>O_F){ 523 timeroc1++; 524 if(timeroc1>=tms_set1){ 525 timeroc1==tms_set1; 526 digitalWrite(relly1,LOW); 527 } 528 }else{ 529 digitalWrite(relly1,HIGH); 530 timeroc1=0; 531 } 532 break; 533 default: 534 digitalWrite(relly1,HIGH); 535 break; 536 } 537switch (R2mood) { 538 case 1: 539 //tms_On 540 if(current>O_C){ 541 timeroc2++; 542 ti2=(0.14*float(tms_set2))/(pow(current/float(O_C),0.02)-1); 543 //Serial.println(tms); 544 if(timeroc2>=ti2){ 545 timeroc2==ti2; 546 // Serial.println("on erlly"); 547 digitalWrite(relly2,LOW); 548 } 549 }else{ 550 digitalWrite(relly2,HIGH); 551 timeroc2=0; 552 } 553 break; 554 case 2: 555 if(current>O_C){ 556 timeroc2++; 557 if(timeroc2>=tms_set2){ 558 timeroc2==tms_set2; 559 digitalWrite(relly2,LOW); 560 } 561 }else{ 562 digitalWrite(relly2,HIGH); 563 timeroc2=0; 564 } 565 break; 566 case 3: 567 if(voltage>O_V){ 568 timeroc2++; 569 if(timeroc2>=tms_set2){ 570 timeroc2==tms_set2; 571 digitalWrite(relly2,LOW); 572 } 573 }else{ 574 digitalWrite(relly2,HIGH); 575 timeroc2=0; 576 } 577 break; 578 case 4: 579 if(voltage<L_V){ 580 timeroc2++; 581 if(timeroc2>=tms_set2){ 582 timeroc2==tms_set2; 583 digitalWrite(relly2,LOW); 584 } 585 }else{ 586 digitalWrite(relly2,HIGH); 587 timeroc2=0; 588 } 589 break; 590 case 5: 591 if(frequency<L_F){ 592 timeroc2++; 593 if(timeroc2>=tms_set2){ 594 timeroc2==tms_set2; 595 digitalWrite(relly2,LOW); 596 } 597 }else{ 598 digitalWrite(relly2,HIGH); 599 timeroc2=0; 600 } 601 break; 602 case 6: 603 if(frequency>O_F){ 604 timeroc2++; 605 if(timeroc2>=tms_set2){ 606 timeroc2==tms_set2; 607 digitalWrite(relly2,LOW); 608 } 609 }else{ 610 digitalWrite(relly2,HIGH); 611 timeroc2=0; 612 } 613 break; 614 case 7: 615 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 616 timeroc2++; 617 //Serial.println(tms); 618 if(timeroc2>=tms_set2){ 619 timeroc2==tms_set2; 620 // Serial.println("on erlly"); 621 digitalWrite(relly2,LOW); 622 } 623 }else{ 624 digitalWrite(relly2,HIGH); 625 timeroc2=0; 626 } 627 break; 628 case 8: 629 if(pf<L_PF1){ 630 timeroc2++; 631 if(timeroc2>=tms_set2){ 632 timeroc2==tms_set2; 633 digitalWrite(relly2,LOW); 634 } 635 }else{ 636 digitalWrite(relly2,HIGH); 637 timeroc2=0; 638 } 639 break; 640 case 9: 641 if(pf<L_PF2){ 642 timeroc2++; 643 if(timeroc2>=tms_set2){ 644 timeroc2==tms_set2; 645 digitalWrite(relly2,LOW); 646 } 647 }else{ 648 digitalWrite(relly2,HIGH); 649 timeroc2=0; 650 } 651 break; 652 case 10: 653 if(pf<L_PF3){ 654 timeroc2++; 655 if(timeroc2>=tms_set2){ 656 timeroc2==tms_set2; 657 digitalWrite(relly2,LOW); 658 } 659 }else{ 660 digitalWrite(relly2,HIGH); 661 timeroc2=0; 662 } 663 break; 664 case 11: 665 if(voltage>O_V||voltage<L_V){ 666 timeroc2++; 667 if(timeroc2>=tms_set2){ 668 timeroc2==tms_set2; 669 digitalWrite(relly2,LOW); 670 } 671 }else{ 672 digitalWrite(relly2,HIGH); 673 timeroc2=0; 674 } 675 break; 676 case 12: 677 if(frequency<L_F||frequency>O_F){ 678 timeroc2++; 679 if(timeroc2>=tms_set2){ 680 timeroc2==tms_set2; 681 digitalWrite(relly2,LOW); 682 } 683 }else{ 684 digitalWrite(relly2,HIGH); 685 timeroc2=0; 686 } 687 break; 688 default: 689 digitalWrite(relly2,HIGH); 690 break; 691 } 692 switch (R3mood) { 693 case 1: 694 //tms_On 695 if(current>O_C){ 696 timeroc3++; 697 ti3=(0.14*float(tms_set3))/(pow(current/float(O_C),0.02)-1); 698 //Serial.println(tms); 699 if(timeroc3>=ti3){ 700 timeroc3==ti3; 701 // Serial.println("on erlly"); 702 digitalWrite(relly3,LOW); 703 } 704 }else{ 705 digitalWrite(relly3,HIGH); 706 timeroc3=0; 707 } 708 break; 709 case 2: 710 if(current>O_C){ 711 timeroc3++; 712 if(timeroc3>=tms_set3){ 713 timeroc3==tms_set3; 714 digitalWrite(relly3,LOW); 715 } 716 }else{ 717 digitalWrite(relly3,HIGH); 718 timeroc3=0; 719 } 720 break; 721 case 3: 722 if(voltage>O_V){ 723 timeroc3++; 724 if(timeroc3>=tms_set3){ 725 timeroc3==tms_set3; 726 digitalWrite(relly3,LOW); 727 } 728 }else{ 729 digitalWrite(relly3,HIGH); 730 timeroc3=0; 731 } 732 break; 733 case 4: 734 if(voltage<L_V){ 735 timeroc3++; 736 if(timeroc3>=tms_set3){ 737 timeroc3==tms_set3; 738 digitalWrite(relly3,LOW); 739 } 740 }else{ 741 digitalWrite(relly3,HIGH); 742 timeroc3=0; 743 } 744 break; 745 case 5: 746 if(frequency<L_F){ 747 timeroc3++; 748 if(timeroc3>=tms_set3){ 749 timeroc3==tms_set3; 750 digitalWrite(relly3,LOW); 751 } 752 }else{ 753 digitalWrite(relly3,HIGH); 754 timeroc3=0; 755 } 756 break; 757 case 6: 758 if(frequency>O_F){ 759 timeroc3++; 760 if(timeroc3>=tms_set3){ 761 timeroc3==tms_set3; 762 digitalWrite(relly3,LOW); 763 } 764 }else{ 765 digitalWrite(relly3,HIGH); 766 timeroc3=0; 767 } 768 break; 769 case 7: 770 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 771 timeroc3++; 772 //Serial.println(tms); 773 if(timeroc3>=tms_set3){ 774 timeroc3==tms_set3; 775 // Serial.println("on erlly"); 776 digitalWrite(relly3,LOW); 777 } 778 }else{ 779 digitalWrite(relly3,HIGH); 780 timeroc3=0; 781 } 782 break; 783 case 8: 784 if(pf<L_PF1){ 785 timeroc3++; 786 if(timeroc3>=tms_set3){ 787 timeroc3==tms_set3; 788 digitalWrite(relly3,LOW); 789 } 790 }else{ 791 digitalWrite(relly3,HIGH); 792 timeroc3=0; 793 } 794 break; 795 case 9: 796 if(pf<L_PF2){ 797 timeroc3++; 798 if(timeroc3>=tms_set3){ 799 timeroc3==tms_set3; 800 digitalWrite(relly3,LOW); 801 } 802 }else{ 803 digitalWrite(relly3,HIGH); 804 timeroc3=0; 805 } 806 break; 807 case 10: 808 if(pf<L_PF3){ 809 timeroc3++; 810 if(timeroc3>=tms_set3){ 811 timeroc3==tms_set3; 812 digitalWrite(relly3,LOW); 813 } 814 }else{ 815 digitalWrite(relly3,HIGH); 816 timeroc3=0; 817 } 818 break; 819 case 11: 820 if(voltage>O_V||voltage<L_V){ 821 timeroc3++; 822 if(timeroc3>=tms_set3){ 823 timeroc3==tms_set3; 824 digitalWrite(relly3,LOW); 825 } 826 }else{ 827 digitalWrite(relly3,HIGH); 828 timeroc3=0; 829 } 830 break; 831 case 12: 832 if(frequency<L_F||frequency>O_F){ 833 timeroc3++; 834 if(timeroc3>=tms_set3){ 835 timeroc3==tms_set3; 836 digitalWrite(relly3,LOW); 837 } 838 }else{ 839 digitalWrite(relly3,HIGH); 840 timeroc3=0; 841 } 842 break; 843 default: 844 digitalWrite(relly3,HIGH); 845 break; 846 } 847switch (R4mood) { 848 case 1: 849 //tms_On 850 if(current>O_C){ 851 timeroc4++; 852 ti4=(0.14*float(tms_set4))/(pow(current/float(O_C),0.02)-1); 853 //Serial.println(tms); 854 if(timeroc4>=ti4){ 855 timeroc4==ti4; 856 // Serial.println("on erlly"); 857 digitalWrite(relly4,LOW); 858 } 859 }else{ 860 digitalWrite(relly4,HIGH); 861 timeroc4=0; 862 } 863 break; 864 case 2: 865 if(current>O_C){ 866 timeroc4++; 867 if(timeroc4>=tms_set4){ 868 timeroc4==tms_set4; 869 digitalWrite(relly4,LOW); 870 } 871 }else{ 872 digitalWrite(relly4,HIGH); 873 timeroc4=0; 874 } 875 break; 876 case 3: 877 if(voltage>O_V){ 878 timeroc4++; 879 if(timeroc4>=tms_set4){ 880 timeroc4==tms_set4; 881 digitalWrite(relly4,LOW); 882 } 883 }else{ 884 digitalWrite(relly4,HIGH); 885 timeroc4=0; 886 } 887 break; 888 case 4: 889 if(voltage<L_V){ 890 timeroc4++; 891 if(timeroc4>=tms_set4){ 892 timeroc4==tms_set4; 893 digitalWrite(relly4,LOW); 894 } 895 }else{ 896 digitalWrite(relly4,HIGH); 897 timeroc4=0; 898 } 899 break; 900 case 5: 901 if(frequency<L_F){ 902 timeroc4++; 903 if(timeroc4>=tms_set4){ 904 timeroc4==tms_set4; 905 digitalWrite(relly4,LOW); 906 } 907 }else{ 908 digitalWrite(relly4,HIGH); 909 timeroc4=0; 910 } 911 break; 912 case 6: 913 if(frequency>O_F){ 914 timeroc4++; 915 if(timeroc4>=tms_set4){ 916 timeroc4==tms_set4; 917 digitalWrite(relly4,LOW); 918 } 919 }else{ 920 digitalWrite(relly4,HIGH); 921 timeroc4=0; 922 } 923 break; 924 case 7: 925 if(voltage>O_V||voltage<L_V||current>O_C||frequency<L_F||frequency>O_F){ 926 timeroc4++; 927 //Serial.println(tms); 928 if(timeroc4>=tms_set4){ 929 timeroc4==tms_set4; 930 // Serial.println("on erlly"); 931 digitalWrite(relly4,LOW); 932 } 933 }else{ 934 digitalWrite(relly4,HIGH); 935 timeroc4=0; 936 } 937 break; 938 case 8: 939 if(pf<L_PF1){ 940 timeroc4++; 941 if(timeroc4>=tms_set4){ 942 timeroc4==tms_set4; 943 digitalWrite(relly4,LOW); 944 } 945 }else{ 946 digitalWrite(relly4,HIGH); 947 timeroc4=0; 948 } 949 break; 950 case 9: 951 if(pf<L_PF2){ 952 timeroc4++; 953 if(timeroc4>=tms_set4){ 954 timeroc4==tms_set4; 955 digitalWrite(relly4,LOW); 956 } 957 }else{ 958 digitalWrite(relly4,HIGH); 959 timeroc4=0; 960 } 961 break; 962 case 10: 963 if(pf<L_PF3){ 964 timeroc4++; 965 if(timeroc4>=tms_set4){ 966 timeroc4==tms_set4; 967 digitalWrite(relly4,LOW); 968 } 969 }else{ 970 digitalWrite(relly4,HIGH); 971 timeroc4=0; 972 } 973 break; 974 case 11: 975 if(voltage>O_V||voltage<L_V){ 976 timeroc4++; 977 if(timeroc4>=tms_set4){ 978 timeroc4==tms_set4; 979 digitalWrite(relly4,LOW); 980 } 981 }else{ 982 digitalWrite(relly4,HIGH); 983 timeroc4=0; 984 } 985 break; 986 case 12: 987 if(frequency<L_F||frequency>O_F){ 988 timeroc4++; 989 if(timeroc4>=tms_set4){ 990 timeroc4==tms_set4; 991 digitalWrite(relly4,LOW); 992 } 993 }else{ 994 digitalWrite(relly4,HIGH); 995 timeroc4=0; 996 } 997 break; 998 default: 999 digitalWrite(relly4,HIGH); 1000 break; 1001 } 1002}
MATLAB code
js
MATLAB code to connect to Arduino
1%* Amir_eshaqy 2 3% telegram = amir_eshaqy 4%* gmail = amir9336146433@gmail.com 5 6% MATLAB code to connect to Arduino 7% 8% Set these values according to your Arduino's COM port and BaudRate 9% 10 11%* Schematic and tutorial files on GitHub 12% GitHub = https://github.com/amir-eshaqy/pz 13 14clear all 15close all 16clc 17delete(instrfind); 18arduino=serial('COM12'); %COM % Set these values according to your Arduino's COM port and BaudRate 19set(arduino,'BaudRate',115200);% BaudRate % Set these values according to your Arduino's COM port and BaudRate 20fopen(arduino); 21 for j=1:99999 %tkrar 22 output = ''; 23 output = fscanf(arduino); 24 disp(output) 25 data = fscanf(arduino); 26 commas = strfind(data,','); 27 voltage(j) = str2num(data(1:commas(1)-1)); 28 current(j) = str2num(data(commas(1)+1:commas(2)-1)); 29 power(j) = str2num(data(commas(2)+1:commas(3)-1)); 30 KWh(j) = str2num(data(commas(3)+1:commas(4)-1)); 31 frequency(j) = str2num(data(commas(4)+1:commas(5)-1)); 32 power_factor(j) = str2num(data(commas(5)+1:end)); 33 34 %plot 35 subplot(1,2,1);plot(voltage,'LineWidth',2) 36 ylim([150 450]) 37 xlim([j-50 j+50]) 38 title("VOLTAGE = :"+voltage(1,j)) 39 subplot(1,2,2);plot(current,'LineWidth',2,'Color','r') 40 ylim([0 60]) 41 xlim([j-50 j+50]) 42 title("CURRENT = "+current(1,j)) 43 disp('Measured for this trial'); 44 % move on to other trial 45 pause(0.1) 46 end 47% Close serial port 48fclose(arduino); 49delete(arduino); 50clear arduino;
Downloadable files
Case_Top
STL 3D file for 3d printer
OSPi_Case_Bottom.stl
Case_Bottom
STL 3D file for 3d printer
OSPi_Case_Bottom.stl
Documentation
dissertation-amirEshaqy-In Persian language
پاین نامه من به زبان فارسی
dissertation-amirEshaqy.pdf
Flyer-In Persian language
بروش محصول نحوه استفاد از محصول و اتصال به متلب
Flyer .pdf
my github link
Check the term for more information and updates
https://github.com/amir-eshaqy/pz
Comments
Only logged in users can leave comments
amir_eshaqy
0 Followers
•0 Projects
Table of contents
Intro
0
0