Unduh file berikut, taruh script header .nsh di folder include, dan library .dll di folder plugins (atau plugins/x86_ansi) jika menggunakan Windows 64bit
!include WinMessages.nsh
System::Call "GDI32::AddFontResourceA(t) i ('SR.ttf') .s"
Pop $0
# $0 is zero if the function failed
SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
Mencari lokasi MyDocument
Function "GetMyDocs"
ReadRegStr $0 HKCU \
"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" \
Personal
FunctionEnd
Call "GetMyDocs"
$MyDocs = $0
Konfigurasi ESP-01S Relay, GPIO0 di Pull-up, dan Enable dihubungkan ke 3V3. Sedangkan untuk memprogram, tambahkan jumper GPIO0 dan GND pada USB-SERIAL. Hubungkan jumper ini untuk memprogram ESP01
#ifdef ESP32
#include <esp_now.h>
#include <WiFi.h>
#else
#include <espnow.h>
#include <ESP8266WiFi.h>
#define ESP_OK 0
#endif
#define lampPin 0
bool lampON = false;
bool lock = false;
// struktur untuk pengiriman data harus sama dengan struktur pada penerima
typedef struct struct_message {
int id; //id pengirim, lock counter
int x; //on interval counter
int y; //motion (>0)
} struct_message;
struct_message myData;
// Membuat struktur untuk tiap board
struct_message board1;
struct_message boardsStruct[3] = {board1};
volatile int counter = 0;
int max_counter = 0;
int lock_counter = 1;
// callback saat data diterima
#ifdef ESP32
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len)
#else
void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len)
#endif
{
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();
if (!lock) counter = 0;
}
void setup() {
Serial.begin(74880);
Serial.println();
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress());
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);
pinMode(lampPin, OUTPUT);
Serial.println("Turn Off lamp");
digitalWrite(lampPin, LOW);
lampON = false;
}
void loop() {
// Mengakses data dari setiap board
//Serial.println(boardsStruct[0].x,DEC);
//delay(1000);
//update counter
if (boardsStruct[0].x > 0)
max_counter = boardsStruct[0].x;
if (boardsStruct[0].id > 0)
lock_counter = boardsStruct[0].id;
//get motion information and restart counter?
if (boardsStruct[0].y > 0 && counter == 0) {
if (!lampON) {
Serial.println("Turn On lamp");
digitalWrite(lampPin, HIGH);
lampON = true;
}
}
//stop counter turn off lamp
if (counter >= max_counter && lampON) {
Serial.println("Turn Off lamp");
digitalWrite(lampPin, LOW);
lampON = false;
lock = true;
Serial.println("Lock");
delay(lock_counter * 1000);
Serial.println("Release");
lock = false;
}
if (lampON) {
counter++;
Serial.print(max_counter - counter);
delay(1000);
}
}
Pengiriman dilakukan oleh LOLIN32 dengan MCU ESP32 sedangkan penerimaan dilakukan oleh ESP01 dengan MCU ESP8266. Potokol pengiriman menggunakan ESP-NOW. ESP-NOW adalah salah satu protokol hibungan WiFi yang dibesut oleh Espressif.
Skrip Pengiriman yang dibenamkan di LOLIN32
#ifdef ESP32
#include <esp_now.h>
#include <WiFi.h>
#else
#include <espnow.h>
#include <ESP8266WiFi.h>
typedef enum {ESP_NOW_SEND_SUCCESS = 0, ESP_NOW_SEND_FAIL};
typedef enum {ESP_OK = 0} esp_err_t;
#endif
// Ganti dengan MAC penerima
uint8_t broadcastAddress[] = {0x50, 0x02, 0x91, 0xFE, 0x4C, 0x01};
// 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
#ifdef ESP32
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
#else
void OnDataSent(uint8_t *mac_addr, uint8_t status)
#endif
{
Serial.print("Status pengiriman:\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;
}
#ifdef ESP32
#else
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
#endif
// registrasi ke penerima dan cek status paket
esp_now_register_send_cb(OnDataSent);
// Registrasi peer
#ifdef ESP32
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 peer");
return;
}
#else
if (esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0) != ESP_OK) {
Serial.println("Gagal menambahkan peer");
return;
}
#endif
}
void loop() {
// Nilai untuk dikirim
myData.id = 1;
myData.x = random(0, 50);
myData.y = random(0, 50);
Serial.print("x:"); Serial.println(myData.x, DEC);
Serial.print("y:"); Serial.println(myData.y, DEC);
// Kirim pesan
#ifdef ESP32
esp_err_t result;
#else
int result;
#endif
result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Permintaan pengiriman berhasil");
}
else {
Serial.println("Gagal mengirim data");
}
delay(10000);
}
Skrip penerima yang dibenamkan di ESP01
#ifdef ESP32
#include <esp_now.h>
#include <WiFi.h>
#else
#include <espnow.h>
#include <ESP8266WiFi.h>
#define ESP_OK 0
#endif
// 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 boardsStruct[3] = {board1};
// callback saat data diterima
#ifdef ESP32
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len)
#else
void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len)
#endif
{
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(74880);
Serial.println();
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress());
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
//Serial.println(boardsStruct[0].x,DEC);
delay(1000);
}
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)
/*
* 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)
#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);
}
Model dapat dicari di situs Thingiverse dengan alamat
https://www.thingiverse.com/thing:291270
Ini yang akan kita buat, sumber: thingiverse.com
Printer yang digunakan adalah Anet A8, printer yang cukup murah, namun harus dirangkai sendiri dan harus melakukan beberapa tweaking agar hasilnya bagus. Sedangkan filamen yang digunakan adalah jenis PLA warna putih, diameter 1.75 mm. Saat membeli printer ini, biasana diberikan bonus filament secara cuma-cuma
Software yang digunakan adalah Cura. Pada saat membeli printer 3D Anet A8 akan dibekali SDCard yang berisi Cura versi 14.07. Sudah dicuba upgrade, namun hasil malah jelek. Hmm.. atau saya yang kurang paham cara setting Cura versi baru ya…..
Setelah file dari thingiverse diunduh, lalu diextract, maka akan ada directory files berisi beberapa file .stl yang merupakan file model 3 dimensi. Buka file tersebut dengan Cura (File->Load Model), arahkan ke file .stl
Ketelitiannya adalah 0,3 mm, dengan lebar extruder (nozel) 0,4 mm. JAdi untuk lingkaran, sisi ada 2 (kanan+kiri) dihitung 0,3mm x 2 = 0,4 mm. Sehingga untuk dapat masuk lubang 3,0mm, model yang dibuat haruslah 3,0 mm – 0,4 mm = 2,6 mm. Spacer hole untuk baut 3 mm, gunakan diameter 2,4 mm agar dapat masuk lubang diameter 3mm.
Diameter lingkaran terkecil adalah 0,8 mm (2 x ukuran nozel)
Matikan kipas jika mencetak menggunakan filamen ABS, atau cabut konektor kipas extrudernya. Kipas otomatis aktif saat ketinggian layer ke-2. Gunakan raft dan pasang pereket kertas setelah raft selesai dibentuk dengan menenda sementara (pause) pada menu SD Card
ABS melengkung saat suhu filamen mendingin, maka gunakan raft dengan jarak filament 3 mm sehingga hasil permukaan awal tidak melengkung.
Jika mencetak ABS, taruh permukaan terkecil dibawah, dengan bantuan support diaktifkan, Jarak support minimal 20 %
Jika mencetak TPU, pasang Anet_Extruder_Filament_Guide dan jangan mencetak terlalu cepat. Filamen TPU sangat lentur, sehingga bisa JAM saat pendorongan filament pada extruder terlalu cepat.
Bagian Expert Setting
Setting Raft
Extra margin: jarak terluar raft dengan objek 3D
Line spacing: jarak antar filament rart
Base thicknes: Ketebalan (tinggi) bantalan filamen layer 1
Base line width: Ketebalan (lebar) bantalan filamen layer 1
Interface thicknes: Ketebalan (tinggi) bantalan filamen layer 2, sebagai pemisah base dengan objek 3D. Digunakan untuk memudahkan memisahkan bantalan base layer 1 dengan objek 3D. Gunakan tipis saja.
Interface line width: Ketebalan (lebar) bantalan filamen layer 2
Airgap: Jarak layer 2 terhadap dasar objek 3D
Surface layer: jumlah layer bantalan untuk surface