Advertisement
muezza29

kwh meter fix1

Jul 19th, 2019
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.24 KB | None | 0 0
  1. // library PZEM
  2. #include <PZEM004T.h>
  3.  
  4. #define relay (PB1)
  5. const int pinBuzzer = PB0;
  6.  
  7. // Libary OLED
  8. #include "Arduino.h"
  9. #include "Wire.h"
  10. #include "Adafruit_GFX.h"
  11. #include "Adafruit_SSD1306.h"
  12.  
  13. // library NFC
  14. #include <SPI.h>
  15. #include <Adafruit_PN532.h>
  16.  
  17. #define PN532_SCK  (PA5)
  18. #define PN532_MOSI (PA7)
  19. #define PN532_SS   (PA4)
  20. #define PN532_MISO (PA6)
  21. #define PN532_IRQ   (2)
  22. #define PN532_RESET (3)
  23.  
  24. Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
  25. #if defined(ARDUINO_ARCH_SAMD)
  26. #define Serial SerialUSB
  27. #endif
  28.  
  29. // oled pin = B6 B7 / SCL SDA
  30. // pzem pin = A9 A10 / TX RX / Serial1
  31. // nfc pin = SPI
  32. // bt pin = serial uart 2
  33.  
  34. #define OLED_RESET 4
  35. Adafruit_SSD1306 display(OLED_RESET);
  36.  
  37. PZEM004T* pzem;
  38. IPAddress ip(192, 168, 1, 1);
  39.  
  40. String str1, str3;
  41. String str2 = "0x49 0xB3 0x9E 0x2B";
  42.  
  43. //float ee = 0;
  44. //float t;    // variabel token
  45. float e;
  46. float t = t - e;
  47.  
  48. // START PZEM
  49. void setup(void)
  50. {
  51.   pinMode(relay, OUTPUT);
  52.   digitalWrite(relay, HIGH);
  53.  
  54.   pinMode(pinBuzzer, OUTPUT);
  55.  
  56.   Serial.begin(115200);   //serial untuk membaca PZEM
  57.   Serial2.begin(38400); //serial BT HC 05
  58.   Serial2.println("\nBismillah");
  59.   Serial2.println("Bluetooth Connected");
  60.  
  61.   pzem = new PZEM004T(&Serial1);
  62.   pzem->setAddress(ip);
  63.  
  64.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  65.   display.clearDisplay();
  66.  
  67. #ifndef ESP8266
  68. #endif
  69.   Serial.begin(115200);
  70.   Serial.println("Hello Arif!");
  71.  
  72.   nfc.begin();
  73.  
  74.   uint32_t versiondata = nfc.getFirmwareVersion();
  75.   if (! versiondata) {
  76.     Serial.print("Didn't find PN53x board");
  77.     while (1); // halt
  78.   }
  79.  
  80.   nfc.SAMConfig();
  81.  
  82.   Serial.println("Tempelkan kartu pelanggan");
  83.  
  84.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  85.   display.clearDisplay();
  86. }
  87.  
  88. void loop(void)
  89. {
  90.   uint8_t success;
  91.   uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
  92.   uint8_t uidLength;
  93.  
  94.   float v = pzem->voltage(ip);
  95.   if (v < 0.0) v = 0.0;
  96.   Serial.print(v);
  97.   Serial.print("V; ");
  98.  
  99.   float i = pzem->current(ip);
  100.   if (i < 0.0) i = 0.0;
  101.   {
  102.     Serial.print(i);
  103.     Serial.print("A; ");
  104.   }
  105.  
  106.   float p = pzem->power(ip);
  107.   if (p <= 0.0) p = 0.0;
  108.   {
  109.     Serial.print(p);
  110.     Serial.print("W; ");
  111.   }
  112.  
  113.   float e = pzem->energy(ip);
  114.   if (e < 0.0) e = 0.0;
  115.   {
  116.     Serial.print(e);
  117.     Serial.print("Wh; ");
  118.   }
  119.  
  120.   Serial.println(t);
  121.  
  122.   float cosphi;
  123.   float c;
  124.   if (v * i == 0)
  125.   {
  126.     c = 0;
  127.   }
  128.   else
  129.   {
  130.     c = p / (v * i);
  131.   }
  132.  
  133.     float ts = t - e;
  134.   if (ts <= 0.0) ts = 0.0;
  135.  
  136.   Serial.println();
  137.  
  138.   if (i >= 6)
  139.   {
  140.     digitalWrite(relay, LOW);
  141.   }
  142.  
  143.   if (ts <= 10)
  144.   {
  145.     tone(pinBuzzer, 750, 250);
  146.   }
  147.  
  148.   if (ts <= 0)
  149.   {
  150.     digitalWrite(relay, LOW);
  151.   }
  152.   else
  153.   {
  154.     digitalWrite(relay, HIGH);
  155.   }
  156.  
  157.   displayData(v, i, p, e, c, ts);
  158.  
  159.   success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  160.  
  161.   if (success)
  162.   {
  163.     String str22 = hexify(uid, uidLength);
  164.     results(str22);
  165.   }
  166. }
  167. // STOP
  168.  
  169. // START MONITOR PZEM BLUETOOTH & OLED
  170. void displayData(float tegangan, float arus, float daya, float energi, float cosphi, float token)
  171. {
  172.   display.clearDisplay();
  173.   display.setTextSize(1);
  174.   display.setTextColor(WHITE);
  175.  
  176.   display.setCursor(0, 0);
  177.   display.print("V:");
  178.   display.setCursor(12, 0);
  179.   display.print(tegangan);
  180.   //  display.println(" V");
  181.  
  182.   display.setCursor(0, 12);
  183.   display.print("I:");
  184.   display.setCursor(12, 12);
  185.   display.print(arus);
  186.   //  display.println(" A");
  187.  
  188.   display.setCursor(0, 24);
  189.   display.print("P:");
  190.   display.setCursor(12, 24);
  191.   display.print(daya);
  192.   //  display.println(" W");
  193.  
  194.   display.setCursor(65, 0);
  195.   display.print("E:");
  196.   display.setCursor(77, 0);
  197.   display.print(energi);
  198.   //  display.println(" Wh");
  199.  
  200.   display.setCursor(65, 12);
  201.   display.print("C:");
  202.   display.setCursor(77, 12);
  203.   display.print(cosphi);
  204.   //  display.println("");
  205.  
  206.   display.setCursor(65, 24);
  207.   display.print("T:");
  208.   display.setCursor(77, 24);
  209.   display.print(token);
  210.   //  display.println(" Wh");
  211.  
  212.   display.display();
  213.  
  214.   char buffer[1000];
  215.  
  216.   sprintf(buffer, "Tegangan  : %0.2f V\nArus           : %0.2f A\nDaya          : %0.2f W\nEnergi        : %0.2f Wh\nCos Phi       : %0.2f \nToken          : %0.2f Wh\n", tegangan, arus, daya, energi, cosphi, token);
  217.   Serial2.println(buffer);
  218. }
  219. // STOP MONITOR PZEM BLUETOOTH & OLED
  220.  
  221. String hexify(uint8_t u[], byte len)
  222. {
  223.   String out = "";
  224.   for (byte i = 0; i < len; i++)
  225.   {
  226.     String a = String(u[i], HEX);
  227.     a.toUpperCase();
  228.     if (a.length() == 1) a = "0" + a;
  229.     out += "0x" + a + " ";
  230.   }
  231.   out.trim();
  232.   return out;
  233. }
  234.  
  235. void results(String str)
  236. {
  237.   if (str == str2)
  238.   {
  239.     display.clearDisplay();
  240.     display.setTextSize(1);
  241.     display.setTextColor(WHITE);
  242.  
  243.     display.setCursor(0, 0);
  244.     display.print("Pelanggan dikenali");
  245.  
  246.     display.setCursor(0, 8);
  247.     display.print("sebagai :");
  248.  
  249.     display.setCursor(0, 16);
  250.     display.print(" > 1303167045");
  251.     display.display();
  252.     Serial.println("Pelanggan dikenali sebagai:");
  253.     Serial.println("  1303167045");
  254.     beli();
  255.   }
  256.   else
  257.   {
  258.     display.clearDisplay();
  259.     display.setTextSize(1);
  260.     display.setTextColor(WHITE);
  261.  
  262.     display.setCursor(0, 0);
  263.     display.print("Tag NFC tidak");
  264.  
  265.     display.setCursor(0, 8);
  266.     display.print("dikenali");
  267.  
  268.     display.setCursor(0, 16);
  269.     display.print(" > Bukan pelanggan");
  270.     display.display();
  271.     Serial.println("Tag NFC tidak dikenali");
  272.     Serial.println("  Bukan pelanggan");
  273.   }
  274.   Serial.println("");
  275. }
  276.  
  277. void beli()
  278. {
  279.   delay(2000);
  280.   byte pilihan = 1;
  281.   byte jumlah_pilihan = 4;
  282.   refresh_pilihan_token(pilihan);
  283.  
  284.   uint16_t interval = 3000;
  285.   uint32_t previousMillis = millis();
  286.   bool sudah_memilih_token = false;
  287.  
  288.   while (!sudah_memilih_token)
  289.   {
  290.     if (check_nfc())
  291.     {
  292.       pilihan++;
  293.       if (pilihan > jumlah_pilihan)
  294.         pilihan = 1;
  295.       refresh_pilihan_token(pilihan);
  296.       previousMillis = millis();
  297.     }
  298.     if (millis() - previousMillis >= interval)
  299.     {
  300.       sudah_memilih_token = true;
  301.     }
  302.   }
  303.   printBeli(pilihan);
  304. }
  305.  
  306. void refresh_pilihan_token(byte pilihan)
  307. {
  308.   display.clearDisplay();
  309.   display.setTextSize(1);
  310.   display.setTextColor(WHITE);
  311.  
  312.   switch (pilihan)
  313.   {
  314.     case 1:
  315.       display.setCursor(0, 0);
  316.       display.print("> 10K");
  317.       display.setCursor(0, 8);
  318.       display.print("  20K");
  319.       display.setCursor(0, 16);
  320.       display.print("  50K");
  321.       display.setCursor(0, 24);
  322.       display.print("  Batal");
  323.       Serial.println("> 10k");
  324.       Serial.println("  20k");
  325.       Serial.println("  50k");
  326.       Serial.println("  Batal");
  327.       Serial.println("");
  328.       break;
  329.  
  330.     case 2:
  331.       display.setCursor(0, 0);
  332.       display.print("  10K");
  333.       display.setCursor(0, 8);
  334.       display.print("> 20K");
  335.       display.setCursor(0, 16);
  336.       display.print("  50K");
  337.       display.setCursor(0, 24);
  338.       display.print("  Batal");
  339.       Serial.println("  10k");
  340.       Serial.println("> 20k");
  341.       Serial.println("  50k");
  342.       Serial.println("  Batal");
  343.       Serial.println("");
  344.       break;
  345.  
  346.     case 3:
  347.       display.setCursor(0, 0);
  348.       display.print("  10K");
  349.       display.setCursor(0, 8);
  350.       display.print("  20K");
  351.       display.setCursor(0, 16);
  352.       display.print("> 50K");
  353.       display.setCursor(0, 24);
  354.       display.print("  Batal");
  355.       Serial.println("  10k");
  356.       Serial.println("  20k");
  357.       Serial.println("> 50k");
  358.       Serial.println("  Batal");
  359.       Serial.println("");
  360.       break;
  361.  
  362.     case 4:
  363.       display.setCursor(0, 0);
  364.       display.print("  10K");
  365.       display.setCursor(0, 8);
  366.       display.print("  20K");
  367.       display.setCursor(0, 16);
  368.       display.print("  50K");
  369.       display.setCursor(0, 24);
  370.       display.print("> Batal");
  371.       Serial.println("  10k");
  372.       Serial.println("  20k");
  373.       Serial.println("  50k");
  374.       Serial.println("> Batal");
  375.       Serial.println("");
  376.       break;
  377.   }
  378.   display.display();
  379. }
  380.  
  381. void printBeli(byte pilih)
  382. {
  383.   switch (pilih) {
  384.     case 1:
  385.       token10k();
  386.       break;
  387.  
  388.     case 2:
  389.       token20k();
  390.       break;
  391.  
  392.     case 3:
  393.       token50k();
  394.       break;
  395.  
  396.     case 4:
  397.       batal();
  398.       break;
  399.   }
  400. }
  401.  
  402. void token10k()
  403. {
  404.   display.clearDisplay();
  405.   display.setTextSize(1);
  406.   display.setTextColor(WHITE);
  407.  
  408.   display.setCursor(0, 0);
  409.   display.print("Token telah");
  410.   display.setCursor(0, 8);
  411.   display.print("ditambahkan sebesar  ");
  412.   display.setCursor(0, 16);
  413.   display.print("5,0484 kWh");
  414.   display.display();
  415.   Serial.println("Token telah ditambahkan sebesar 5,048 kWh");
  416.   Serial.println("");
  417.   float sb = 5048.4;   // sb = saldo baru / pembelian saat ini
  418.   t = t  + sb;
  419. }
  420.  
  421. void token20k()
  422. {
  423.   display.clearDisplay();
  424.   display.setTextSize(1);
  425.   display.setTextColor(WHITE);
  426.  
  427.   display.setCursor(0, 0);
  428.   display.print("Token telah");
  429.   display.setCursor(0, 8);
  430.   display.print("ditambahkan sebesar  ");
  431.   display.setCursor(0, 16);
  432.   display.print("11,3588 kWh");
  433.   display.display();
  434.   Serial.println("Token telah ditambahkan sebesar 11,3588 kWh");
  435.   Serial.println("");
  436.   float sb = 11358.8;   // sb = saldo baru / pembelian saat ini
  437.   t = t + sb;
  438. }
  439.  
  440. void token50k()
  441. {
  442.   display.clearDisplay();
  443.   display.setTextSize(1);
  444.   display.setTextColor(WHITE);
  445.  
  446.   display.setCursor(0, 0);
  447.   display.print("Token telah");
  448.   display.setCursor(0, 8);
  449.   display.print("ditambahkan sebesar  ");
  450.   display.setCursor(0, 16);
  451.   display.print("30,29 kWh");
  452.   display.display();
  453.   Serial.println("Token telah ditambahkan sebesar 30,29 kWh");
  454.   Serial.println("");
  455.   float sb = 30290;   // sb = saldo baru / pembelian saat ini
  456.   t = t + sb;
  457. }
  458.  
  459. void batal()
  460. {
  461.   display.clearDisplay();
  462.   display.setTextSize(1);
  463.   display.setTextColor(WHITE);
  464.  
  465.   display.setCursor(0, 0);
  466.   display.print("Pembelian dibatalkan");
  467.   display.display();
  468.   Serial.println("Pembelian dibatalkan");
  469.   Serial.println("");
  470. }
  471.  
  472. bool check_nfc()
  473. {
  474.   uint8_t success;
  475.   uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
  476.   uint8_t uidLength;
  477.   success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 1000);
  478.  
  479.   if (success)
  480.   {
  481.     String str22 = hexify(uid, uidLength);
  482.     if (str22.equals(str2)) return true;
  483.   }
  484.   return false;
  485. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement