Cara memprogram ESP01

Wiring dengan Modul Serial

Hubungkan IO0 dengan GND

Wiring dengan USB-TTL (Gunakan yang support 3,3 Volt) atau dapat juga menggunakan Board Arduino

Hubungkan IO0 dengan GND ESP ke pin GND USBTTL. Hubungkan EN dengan 3V3 ESP ke 3V3 USBTTL. TX ESP ke RX USBTTL dan RX ESP ke TX USBTTL.
(Jika mengunakan board Arduino, hubungkan RX ke RX dan TX ke TX)

Pilihan Setting Board

Board: “Generic ESP Module”
Flash Mode: “DIO” (Gunakan DOUT jika checksum error)
Flash Frequency: “40MHz”
CPU Frequency: “80 MHz”
Flash Size: “1M (64K SPIFFS)”
Debug Port: “Disabled”
Debug Level: “None”
Reset Method: “ck”
Upload Speed: “115200”

Contoh kode untuk blink (LED pada GPIO0)

/* 
 *  ESP01
 *  Upload Configuration:
 *  Generic 8266
 *  Flash Mode: DOUT (Using: DIO --> checksum Error)
 *  Debug: None
 *  Reset: ck
 *  CPU: 80Mhz
 *  Flash: 1M (64K)
 *  Debug Port: Disable
 *  Flash: 40Mhz
 *  Upload Speed: 115200
 *  
 *  Flashing ESP-01 using Esp8266 Serial Module Board
 *  Connect GPIO0 to GND
 *  
 *  Flash ESP-01 using USB to TTL 
 *  Connect GPIO0 to GND, EN to 3V3, RX-TX, TX-RX
 */

#define D3  0 //GPIO0
#define D4  2 //GPIO2
void setup() {
  //GPIO0
  pinMode(D3, OUTPUT);
  Serial.begin(74880);
}
void loop() {
  digitalWrite(D3, LOW); // turn the LED on (HIGH is the voltage level)
  delay(1000); // wait for a second
  digitalWrite(D3, HIGH); // turn the LED off by making the voltage LOW Serial.println("LOW");
  delay(1000); // wait for a second
  Serial.println("OK");
}

Untuk menjalankan hasil programming, lepas kabel IO0 terhadap GND dan lalukan reset (atau cabut pasang modul)

sumber: https://www.diyhobi.com/flash-program-esp-01-using-usb-serial-adapter/

Mengirim Date ke Banyak Board dengan ESP_NOW

Mencari alamat MAC penerima

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("ESP Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}

Pengirim Data

#include <esp_now.h>
#include <WiFi.h>

// Ganti dengan MAC address penerima
uint8_t broadcastAddress1[] = {0x3C, 0x71, 0xBF, 0xC3, 0xBF, 0xB0};
uint8_t broadcastAddress2[] = {0x24, 0x0A, 0xC4, 0xAE, 0xAE, 0x44};
uint8_t broadcastAddress3[] = {0x80, 0x7D, 0x3A, 0x58, 0xB4, 0xB0};

typedef struct test_struct {
  int x;
  int y;
} test_struct;

test_struct test1;
test_struct test2;
test_struct test3;

// callback saat pengiriman data
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  char macStr[18];
  Serial.print("Ditujukan : ");
  // Copies the sender mac address to a string
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print(macStr);
  Serial.print(" status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Sukses" : "Gagal");
}
 
void setup() {
  Serial.begin(115200);
 
  WiFi.mode(WIFI_STA);
 
  if (esp_now_init() != ESP_OK) {
    Serial.println("Gagal inisialisasi ESP-NOW");
    return;
  }
  
  esp_now_register_send_cb(OnDataSent);
   
  // pendaftaran peer
  esp_now_peer_info_t peerInfo;
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
  
  // peer  pertama
  memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Gagal menambahkan peer");
    return;
  }
  //  peer kedua 
  memcpy(peerInfo.peer_addr, broadcastAddress2, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Gagal menambahkan peer");
    return;
  }
  /// peer ketiga
  memcpy(peerInfo.peer_addr, broadcastAddress3, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Gagal menambahkan peer");
    return;
  }
}
 
void loop() {
  //masukkan data padda struktur
  test1.x = random(0,20);
  test1.y = random(0,20);
  test2.x = random(0,20);
  test2.y = random(0,20);
  test3.x = random(0,20);
  test3.y = random(0,20);
 
  //kirim paket data test1 ke semua board
  esp_err_t result = esp_now_send(0, (uint8_t *) &test1, sizeof(test_struct));

  if (result == ESP_OK) {
    Serial.println("Terkirim ke semua board");
  }
  else {
    Serial.println("Gagal mengirim");
  }

  //kirim paket data test1,test2, test3 ke maing-masing board
  result = esp_now_send(broadcastAddress1, (uint8_t *) &test1, sizeof(test_struct));
  if (result == ESP_OK) {
    Serial.println("Terkirim ke board 1");
  }
  else {
    Serial.println("Gagal mengirim board 1");
  }

  result = esp_now_send(broadcastAddress2, (uint8_t *) &test2, sizeof(test_struct));
  if (result == ESP_OK) {
    Serial.println("Terkirim ke board 2");
  }
  else {
    Serial.println("Gagal mengirim board 2");
  }

  result = esp_now_send(broadcastAddress3, (uint8_t *) &test3, sizeof(test_struct));
   
  if (result == ESP_OK) {
    Serial.println("Terkirim ke board 3");
  }
  else {
    Serial.println("Gagal mengirim board 3");
  }
  
  delay(2000);
}

Penerima Data

#include <esp_now.h>
#include <WiFi.h>

typedef struct test_struct {
  int x;
  int y;
} test_struct;

test_struct myData;

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes diterima: ");
  Serial.println(len);
  Serial.print("x: ");
  Serial.println(myData.x);
  Serial.print("y: ");
  Serial.println(myData.y);
  Serial.println();
}
 
void setup() {
  Serial.begin(115200);
  
  WiFi.mode(WIFI_STA);

  //Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Gagal inisialisasi ESP-NOW");
    return;
  }
  //daftarkan callback
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {

}

sumber: https://randomnerdtutorials.com/esp-now-one-to-many-esp32-esp8266/

Menerima Data dari Banyak Board dengan ESP_NOW

Mendapatkan informasi MAC Address ESP Penerima

//Mendapatkan MAC Address penerima
#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("ESP Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}

ESP Pengirim Data

#include <esp_now.h>
#include <WiFi.h>

// Ganti dengan MAC penerima
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// ID harus unik
const int id = 1;

// struktur untuk pengiriman data harus sama dengan struktur pada penerima
typedef struct struct_message {
    int id; 
    int x;
    int y;
} struct_message;

struct_message myData;

// callback saat data dikirim
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nStatus pengiriman sebelumnya:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Sukses" : "Gagal");
}
 
void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Gagal inisialisasi ESP-NOW");
    return;
  }

  // registrasi ke penerima dan cek status paket
  esp_now_register_send_cb(OnDataSent);
  
  // Registrasi peer
  esp_now_peer_info_t peerInfo;
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
  
  // Menambahkan diri peer        
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Gagal menambahkan diri ke peer");
    return;
  }
}
 
void loop() {
  // Nilai untuk dikirim
  myData.id = 1;
  myData.x = random(0,50);
  myData.y = random(0,50);

  // Kirim pesan
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
   
  if (result == ESP_OK) {
    Serial.println("Terkirim dengan sukses");
  }
  else {
    Serial.println("Gagal mengirim data");
  }
  delay(10000);
}

ESP Penerima data

#include <esp_now.h>
#include <WiFi.h>

// struktur untuk pengiriman data harus sama dengan struktur pada penerima
typedef struct struct_message {
  int id;
  int x;
  int y;
}struct_message;

struct_message myData;

// Membuat struktur untuk tiap board
struct_message board1;
struct_message board2;
struct_message board3;

struct_message boardsStruct[3] = {board1, board2, board3};

// callback saat data diterima
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) {
  char macStr[18];
  Serial.print("Paket diterima dari: ");
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(macStr);
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.printf("Board ID %u: %u bytes\n", myData.id, len);
  // Update the structures with the new incoming data
  boardsStruct[myData.id-1].x = myData.x;
  boardsStruct[myData.id-1].y = myData.y;
  Serial.printf("x value: %d \n", boardsStruct[myData.id-1].x);
  Serial.printf("y value: %d \n", boardsStruct[myData.id-1].y);
  Serial.println();
}
 
void setup() {
  Serial.begin(115200);
  
  WiFi.mode(WIFI_STA);

  //Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  //daftrakan callback
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {
  // Mengakses data dari setiap board
  /*
  int board1X = boardsStruct[0].x;
  int board1Y = boardsStruct[0].y;
  int board2X = boardsStruct[1].x;
  int board2Y = boardsStruct[1].y;
  int board3X = boardsStruct[2].x;
  int board3Y = boardsStruct[2].y;
  */

  delay(1000);  
}

Sumber: https://randomnerdtutorials.com/esp-now-many-to-one-esp32/

Percobaan cloud4pi dengan PHP

<!--?php
// A sample PHP Script to POST data using cURL
// Data in JSON format

$json= '&#91;{"name":"Temperature","type":"numeric"},{"name":"LEDOn","type":"bool"}&#93;';
$arr=json_decode($json, false);

echo '

<pre-->';
print_r($arr);
echo '


';

$employee_object = new stdClass;
$employee_object-&gt;name = "Temperature";
$employee_object-&gt;type = "numeric";
$employee_object1 = new stdClass;
$employee_object1-&gt;name = "LEDOn";
$employee_object1-&gt;type = "bool"; 

$data = array
  (
  $employee_object,
  $employee_object1
);

$payload = json_encode($data);
echo "==&gt;".$payload;

$token = '2HSmdfzsEAXB3puVUTi6ZoirV';

// Prepare new cURL resource
$ch = curl_init('https://cloud4rpi.io/api/devices/'.$token.'/config');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);

// Set HTTP Header for POST request
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($payload))
);

// Submit the POST request
$result = curl_exec($ch);

echo $result;
// Close cURL session handle
curl_close($ch);

$json = '{"ts":"date","payload":{"Temperature":24,"LEDOn":true}}';
$arr=json_decode($json, true);

echo '









<pre>';
print_r($arr);
echo '</pre>
';

$dt = date(DateTime::ISO8601);

$carss = array
(
"ts"=&gt;$dt,
"payload"=&gt;array("Temperature"=&gt;22,"LEDOn"=&gt;0)
);

$payload = json_encode($carss);
echo "==&gt;".$payload;

$token = '2HSmdfzsEAXB3puVUTi6ZoirV';

// Prepare new cURL resource
$ch = curl_init('https://cloud4rpi.io/api/devices/'.$token.'/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);

// Set HTTP Header for POST request
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($payload))
);

// Submit the POST request
$result = curl_exec($ch);

echo $result;
// Close cURL session handle
curl_close($ch);

?&gt;

Setting printer USB di Raspberry Pi

sudo chown www-data:www-data etc
sudo chmod 775 etc
sudo chown www-data:www-data /dev/usb/lp0

source:
https://www.howtogeek.com/169679/how-to-add-a-printer-to-your-raspberry-pi-or-other-linux-computer/
https://kernelmastery.com/enable-regular-users-to-add-printers-to-cups/
https://maker.pro/raspberry-pi/projects/how-to-turn-a-usb-printer-into-a-wireless-printer-with-raspberry-pi-zero-w

Setting printer serial di raspberry pi

sudo raspi-config

“Interfacing Options,” “Serial.” Turn OFF: login shell over serial, ENABLE: hardware serial port
“Interfacing Options,” enable SSH

sudo apt-get update
sudo apt-get install git cups wiringpi build-essential libcups2-dev libcupsimage2-dev python-serial python-pil python-unidecode

cd ~
git clone https://github.com/adafruit/zj-58
cd zj-58
make
sudo ./install

sudo usermod -a -G lp pi
sudo usermod -a -G lp www-data
reboot

sudo lpadmin -p ZJ-58 -E -v serial:/dev/serial0?baud=9600 -m zjiang/ZJ-58.ppd
sudo lpoptions -d ZJ-58

git clone https://github.com/adafruit/Python-Thermal-Printer
cd Python-Thermal-Printer
python printertest.py

sudo usermod -a -G dialout www-data
sudo usermod -a -G dialout pi
reboot

Membuat Daemon di Raspberry Pi

Buka terminal lalu ketik:

hciconfig
hcitool scan

Nama perangkat biasanya bernama: hci0
Misalkan hasilnya adalah:

66:12:13:EE:D1:76 Bluetooth Printer

Test printer dengan perintah:

sudo rfcomm bind /dev/rfcomm0 66:12:13:EE:D1:76 1
echo “Test” > /dev/rfcomm0

Jika printer berhasil mencetak maka koneksi sudah berhasil

Selanjutnya tambahkan file untuk daemon service

sudo leafpad /etc/systemd/system/rfcomm.service

Ketik kode berikut dan simpan:

[Unit]
Description=RFCOMM service
After=bluetooth.service
Requires=bluetooth.service

[Service]
ExecStart=/usr/bin/rfcomm bind hci0 66:12:13:EE:D1:76 1

[Install]
WantedBy=multi-user.target

Ganti nama hci0 dengan nama hasil hciconfig dan ganti 66:12:13:EE:D1:76 dengan hasil hcitool scan

Aktifkan daemon, ubah preferensi printer dan booting

sudo systemctl enable rfcomm
sudo systemctl start rfcomm
Sudo reboot

Menambahkan RTC pada Raspberry Pi 3

Setting antarmuka I2C

sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools
sudo raspi-config

Pilih Interfacing Option > I2C > Enable lanjutkan dengan booting. Selanjutnya test koneksi dengan perintah i2cdetect untuk antaruka I2C 1. (Cek juga antarmuka ke 0 jika perlu)

sudo i2cdetect -y 1 #isikan angka 1 bila mengunakan I2C1, isikan 0 bila menggunakan I2C 0

Setting RTC

sudo modprobe rtc-ds1307 #load rtc ke kernel
sudo bash #masuk ke super user
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device #tambahkan device ds1307 di alamat 0x68 ke I2C1
exit #keluar dari super user
sudo hwclock -r #baca waktu dari RTC
sudo hwclock -w #tulis RTC berdasarkan sistem

Set agar waktu yang digunakan menggunakan RTC

sudo nano /etc/modules #agar modul rtc-ds1307 diload
#tambahkan baris berikut:
i2c-bcm2708 
rtc-ds1307

sudo nano sudo nano /etc/rc.local #agar dijalankan saat booting
#tambahkan baris berikut sebelum exit 0:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device #tambahkan device ds1307  di alamat 0x68 ke I2C1
sudo hwclock -s #set waktu yang digunkan adalah RTC
date #baca waktu saat ini dari RTC

Sumber: