Pages

SELAMAT DATANG DI BLOGGER SAYA

Labels

Video Of Day

Wednesday 13 December 2023

Upload Code Arduino dengan Web Uploader (Arduino OTA)

 Disini saya akan membagikan cara bagaimana upload code arduino dengan web upload. sebelumnya saya akan membagikan latar belakang saya membuat tutorial ini, sebelumnya saya juga masih belajar tentang microcontroler seperti arduino ini. Didasari dengan letak arduino saya tidak berada di satu tempat melainkan di berbagai lokasi Pemancar BTS tempat saya bekerja. oleh karena itu saya membuat code agar memudahkan pekerjaan tim R&D untuk mengupdate code di controler tersebut. Berikut saya sertakan topologi controler yang akan saya buat :


Sedikit penjelasan dari topologi diatas Lokasi saya di surakarta dan controler saya berada di boyolali namun saya akan melakukan update code dengan mengupload code jika saya tidak menggunakan web server uploader (OTA) saya akan memakan waktu yang banyak untuk ke lokasi controler maka dengan adanya fitur tersebut memudahkan saya untuk melakukan update code. untuk Mqtt Broker berfunsi untuk meneruskan data dari controler ke server monitoring. 

Berikut langkah langkahnya :

1. Buka Arduino IDE untuk melakukan pembuatan code program :

Berikut source codenya  :
/*
  To upload through terminal you can use: curl -F "image=@firmware.bin" esp8266-webupdate.local/update
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <PZEM004Tv30.h>
#include <PubSubClient.h>



//Mqtt Broker Setting
const char* mqtt_server = "ip server mqtt broker";
const int mqtt_port = 1883;
const char* mqtt_user = "user mqtt broker";
const char* mqtt_password = "password mqtt broker";

const char* host = "esp8266-webupdate";
// WiFi settings
const char* ssid = "SSID Wifi";
const char* password = "Password wifi";

ESP8266WebServer server(80);
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";

WiFiClient espClient;
PubSubClient client(espClient);

PZEM004Tv30 pzem(13, 12); // RX, TX


/*
 * Login page
 */

const char* loginIndex =
 "<form name='loginForm'>"
    "<table width='20%' bgcolor='A09F9F' align='center'>"
        "<tr>"
            "<td colspan=2>"
                "<center><font size=4><b>UPLOAD CODE PZEM</b></font></center>"
                "<br>"
            "</td>"
            "<br>"
            "<br>"
        "</tr>"
        "<tr>"
             "<td>Username:</td>"
             "<td><input type='text' size=25 name='userid'><br></td>"
        "</tr>"
        "<br>"
        "<br>"
        "<tr>"
            "<td>Password:</td>"
            "<td><input type='Password' size=25 name='pwd'><br></td>"
            "<br>"
            "<br>"
        "</tr>"
        "<tr>"
            "<td><input type='submit' onclick='check(this.form)' value='Login'></td>"
        "</tr>"
    "</table>"
"</form>"
"<script>"
    "function check(form)"
    "{"
    "if(form.userid.value=='user login page' && form.pwd.value=='password login page')"
    "{"
    "window.open('/server')"
    "}"
    "else"
    "{"
    " alert('Error Password or Username')/*displays error message*/"
    "}"
    "}"
"</script>";


void setup(void) {
  Serial.begin(115200);
  client.setServer(mqtt_server, mqtt_port);
  Serial.println();
  Serial.println("Booting Sketch...");
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() == WL_CONNECTED) {
    MDNS.begin(host);
   
  server.on("/", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", loginIndex);
  });
    
    server.on("/server", HTTP_GET, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/html", serverIndex);
    });
    server.on(
      "/update", HTTP_POST, []() {
        server.sendHeader("Connection", "close");
        server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
        ESP.restart();
      },
      []() {
        HTTPUpload& upload = server.upload();
        if (upload.status == UPLOAD_FILE_START) {
          Serial.setDebugOutput(true);
          WiFiUDP::stopAll();
          Serial.printf("Update: %s\n", upload.filename.c_str());
          uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
          if (!Update.begin(maxSketchSpace)) {  // start with max available size
            Update.printError(Serial);
          }
        } else if (upload.status == UPLOAD_FILE_WRITE) {
          if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
            Update.printError(Serial);
          }
        } else if (upload.status == UPLOAD_FILE_END) {
          if (Update.end(true)) {  // true to set the size to the current progress
            Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
          } else {
            Update.printError(Serial);
          }
          Serial.setDebugOutput(false);
        }
        yield();
      });
    server.begin();
    MDNS.addService("http", "tcp", 80);

    Serial.printf("Ready! Open http://%s.local in your browser\n", host);
  } else {
    Serial.println("WiFi Failed");
  }
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}


void loop(void) {
  server.handleClient();
  MDNS.update();
  if (!client.connected()) {
    reconnect();
  }

  float voltage = pzem.voltage();
  float current = pzem.current();
  float power = pzem.power();

  Serial.print("Voltage: ");
  Serial.println(voltage);
  Serial.print("Current: ");
  Serial.println(current);
  Serial.print("Power: ");
  Serial.println(power);


     Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  char msg[50];
  snprintf(msg, 50, "%.2f V", voltage);

  char msg1[50];
  snprintf(msg1, 50, "%.2f A",current);

    char msg2[50];
  snprintf(msg2, 50," %.2f W",power);

  client.publish("pzem/data_volt_plr", msg); //disesuaikan dengan topic yang akan di baca oleh mqtt broker
  client.publish("pzem/data_ampere_plr", msg1);  //disesuaikan dengan topic yang akan di baca oleh mqtt broker
  client.publish("pzem/data_watt_plr", msg2);  //disesuaikan dengan topic yang akan di baca oleh mqtt broker
  delay(5000); //delay untuk upload data ke mqtt broker

}

"PASTIKAN ANDA MENGUBAH DI BAGIAN SSID PASSWORD WIFI DAN TOPIC YANG AKAN DI UPLOAD KE MQTT BROKER"

2. Setelah selesai membuat code program kemudian save dan verify code tersebut.
3. Upload code tersebut dengan menggunakan kabel USB terlebih dahulu dikarenakan itu source code pertama atau main source codenya.
4. Pastikan laptop dan Arduino terkoneksi dengan satu jaringan dan pastikan bisa ping antara laptop dengan controler anda.
5. Buka laman pencarian dengan mengakses IP Address arduino 
Untuk default aksesnya admin|admin


6. Kemudian akan diarahkan ke halaman Upload code


7. Upload file dan pastikan dalam format .bin dengan cara export compatible sketch di Arduino IDE

8. Kemudian Upload code nya dan tunggu 2 menit untuk rebooting device arduinonya
9. Setelah 2 menit bisa anda cek di Mqtt broker apakah controler sudah terkoneksi kembali.

UNTUK TUTORIAL MQTT BROKER BAGAIMANA MENGINSTALL DAN KONFIGURASI NYA BISA ANDA LIHAT DI BLOG SAYA ......

TERIMA KASIH SUDAH MENGIKUTI BERBAGI ILMU SAYA........