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/

Mencetak dengan printer 3D

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

Catatan Penting:

  1. 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.
  2. Diameter lingkaran terkecil adalah 0,8 mm (2 x ukuran nozel)
  3. 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
  4. ABS melengkung saat suhu filamen mendingin, maka gunakan raft dengan jarak filament 3 mm sehingga hasil permukaan awal tidak melengkung.
  5. Jika mencetak ABS, taruh permukaan terkecil dibawah, dengan bantuan support diaktifkan, Jarak support minimal 20 %
  6. 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

  1. Extra margin: jarak terluar raft dengan objek 3D
  2. Line spacing: jarak antar filament rart
  3. Base thicknes: Ketebalan (tinggi) bantalan filamen layer 1
  4. Base line width: Ketebalan (lebar) bantalan filamen layer 1
  5. 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.
  6. Interface line width: Ketebalan (lebar) bantalan filamen layer 2
  7. Airgap: Jarak layer 2 terhadap dasar objek 3D
  8. Surface layer: jumlah layer bantalan untuk surface

Fitur EagleCAD

Berikut fitur EagleCAD yang dapat digunakan:

Multiple Airwire Bus Routing
Differential Pair Routing
Assign 3D models on Layout and Schematic
Change or modify group selection using object Inspector
Selection Filter by layer and types
Copy Devices, Symbols, Footprints, and Packages from a design file straight into a library
Quickroute Fanout
Digital Sim
Pin & SMD Array
Paint Roller
Quick Route Air Wire
Quick Route Signal
Quick Route Multiple Signals
Smooth Signal
Bus Breakout
Signal Breakout
Connect Pins to Bus
Design Manager

Speaker berbahan dasar kayu

Para peneliti telah menciptakan speaker audio menggunakan film kayu ultra-tipis. Bahan baru ini menunjukkan kekuatan tarik tinggi dan modulus Young yang meningkat, serta sifat akustik yang berkontribusi terhadap frekuensi resonansi yang lebih tinggi dan amplitudo perpindahan yang lebih besar dibandingkan dengan diafragma polipropilen komersial dalam speaker audio.

Biasanya, membran akustik harus tetap sangat tipis (pada skala mikron) dan kuat untuk memungkinkan respons frekuensi yang sangat sensitif dan amplitudo getaran. Bahan yang terbuat dari plastik, logam, keramik, dan karbon telah digunakan oleh para insinyur dan fisikawan dalam upaya meningkatkan kualitas suara. Sementara film tipis plastik paling sering dibuat, mereka memiliki dampak yang sangat buruk terhadap lingkungan. Sementara itu, bahan berbasis logam, keramik, dan karbon lebih mahal dan kurang menarik bagi produsen.

Bahan berbasis selulosa telah menjadi pintu masuk dalam penelitian akustik dengan sifatnya yang ramah lingkungan dan struktur kayu alami. Bahan-bahan seperti ampas tebu, serat kayu, kitin, kapas, selulosa bakteri, dan lignoselulosa semuanya merupakan pesaing bagi alternatif efektif untuk bagian-bagian yang saat ini diproduksi dari plastik.

Proses untuk membangun film ultra-tipis melibatkan menghilangkan lignin dan hemiselulosa dari kayu balsa, menghasilkan bahan yang sangat berpori. Hasilnya ditekan panas untuk pengurangan ketebalan 97%. Serat nano selulosa tetap berorientasi tetapi lebih padat dibandingkan dengan kayu alami. Selain itu, serat-serat tersebut membutuhkan energi yang lebih tinggi untuk dicabut sementara tetap fleksibel dan dapat dilipat.

Sumber: https://www.nature.com/articles/s41467-019-13053-0

Hence, this, therefore

Therefore is used in introducing a conclusion that follows from what has been said previously.

You are drunk, and that makes you incapable of operating machinery. Therefore you shouldn’t fly a plane.

Thus means in this way. For example:

He waved his arms around thus. (speaker waves arms around in demonstration)

Extending that meaning, it can be used to introduce the intended consequences of an action:

I intend to eat less, and thus lose weight.

And stretching that meaning further it can, like therefore, indicate the conclusion of an argument:

Trees are plants, and plants are living. Thus we can see that trees are living.

To me at least, in the cases where they have the same basic meaning, the effect of therefore and thus is slightly different: therefore emphasises that the conclusion is an inescapable logical consequence of what goes immediately before; thus puts more focus on the argument as a whole and the way it leads towards the conclusion.

https://jakubmarian.com/so-thus-therefore-and-hence-in-english/