LoRa Custome ESP32
Mikroavr.com baru-baru ini mendapatkan tawaran untuk membuat ESP32 LoRa node dengan fiture sebagai berikut,
- Kontroller Utama ESP32
- RTC DS3231 on board
- SD Card On board untuk penyimpanan data / Logger
- ADC 10bit 8 channel ( di baca oleh atmega328 / Arduino Uno)
- LoRa 923Mhz dengan chip SX1276
Kontroller ini agan di gunakan untuk membaca data-data sensor yang memiliki data output. Photonya sebagai berikut,
Contoh Pemrograman
Untuk Memudahkan user menggunakan ESP32 LoRa Node ini, maka kami menyertakan contoh-contoh pemrograman nya. Berikut contoh pemrograman nya.
Akses LoRa SX1276
Ada pun Configurasi ESP32 LoRa node nya sebagai berikut,
LoRa Pin | ESP32 Pin |
MOSI | 23 |
MISO | 19 |
SCK | 18 |
NSS | 5 |
NRST | 26 |
DIO0 | 13 |
DIO1 | 16 |
DIO2 | 17 |
Untuk Akses ESP32 LoRa node ini, download library nya di link berikut ini, cukup tekan tombol merah di bawah ini
Untuk Program nya sebagai berikut,
#include "SPI.h" #include "LoRa.h" int counter = 0; const int csPin = 5; // LoRa radio chip select const int resetPin = 26; // LoRa radio reset const int irqPin = 13; // change for your board; must be a hardware interrupt pin void setup() { Serial.begin(115200); while (!Serial); Serial.println("LoRa Sender"); LoRa.setPins(csPin, resetPin, irqPin); // set config pin LoRa ESP32 if (!LoRa.begin(915E6)) { Serial.println("Starting LoRa failed!"); while (1); } } void loop() { Serial.print("Sending packet: "); Serial.println(counter); // send packet LoRa.beginPacket(); LoRa.print("hello "); LoRa.print(counter); LoRa.endPacket(); counter++; delay(2000); }
point penting pada program di atas ada configurasi pin pada arduino LoRa dan Frequency. Salah dalam pengaturan pin config dan freq akan mengakibabkan kegagalan dalam koneksi sesama LoRa. Setting nya bisa di lihat pada penggalan program ini
const int csPin = 5; // pin CS
const int resetPin = 26; // pin RST
const int irqPin = 13; // pin DIO0
Untuk Setting nilai Freq nya ada penggalan program berikut ini,
if (!LoRa.begin(923E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Akses SD Card
SD Card dan LoRa sama-sama mengguanakan jalur SPI. Karena ESP32 memiliki 3 SPI maka SD Card kita hubungkan ke PIN HSPI. Ada pun configurasi PIN nya sebagai Berikut.
SD Card PIN | ESP32 Pin |
MISO | 2 |
MOSI | 15 |
SCK | 14 |
SS | 27 |
Untuk Program nya Sebagai Berikut,
#include "SPI.h" #include "SD.h" File root; SPIClass spiSD(HSPI); // init clas HSPI #define SD_CS 27 #define SDSPEED 27000000 void setup() { // Open serial communications and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.print("Initializing SD card..."); spiSD.begin(14,2,15,27); if(!SD.begin( SD_CS, spiSD, SDSPEED)){ // if(!SD.begin()){ Serial.println("Card Mount Failed"); return; } Serial.println("initialization done."); root = SD.open("/"); printDirectory(root, 0); Serial.println("done!"); } void loop() { // nothing happens after setup finishes. } void printDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (! entry) { // no more files break; } for (uint8_t i = 0; i < numTabs; i++) { Serial.print('\t'); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { // files have sizes, directories do not Serial.print("\t\t"); Serial.println(entry.size(), DEC); } entry.close(); } }
Pengujian RTC DS3231
Untuk Pengujian RTC DS3231 ini cukup mudah. Cukup add library RTClib dan open example. Library RTClib ini bisa teman-teman download dengan cukup tekan tombol merah di bawah ini,
Program nya sebagai berikut,
#include "RTClib.h" RTC_DS3231 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; void setup () { Serial.begin(9600); delay(3000); // wait for console opening if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } if (rtc.lostPower()) { Serial.println("RTC lost power, lets set the time!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } } void loop () { DateTime now = rtc.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.print("Temperature: "); Serial.print(rtc.getTemperature()); Serial.println(" C"); Serial.println(); delay(3000); }
Semua Program di atas menggunakan board ESP32. Untuk membaca data ADC kita menggunakan Arduino UNO dengan komunikasi serial ke ESP32. Gambar komunikasi nya bisa dilihat pada gambar di atas.
Membaca ADC di Uno
Seperti yang DI terangkan di atas, pembacaan data ADC ini cukup mudah, seperti yang ada pada program di bawah ini
String strADC; int adc0,adc1,adc2,adc3; int adc4,adc5,adc6,adc7; void setup(){ Serial.begin(115200); } void loop(){ adc0 = analogRead(A0); adc1 = analogRead(A1); adc2 = analogRead(A2); adc3 = analogRead(A3); adc4 = analogRead(A4); adc5 = analogRead(A5); adc6 = analogRead(A6); adc7 = analogRead(A7); strADC = String(adc0)+ ","; strADC += String(adc1)+ ","; strADC += String(adc2)+ ","; strADC += String(adc3)+ ","; strADC += String(adc4)+ ","; strADC += String(adc5)+ ","; strADC += String(adc6)+ ","; strADC += String(adc7)+ ","; Serial.println(strADC); delay(250); }
Kirim ADC Ke ESP32
Komunikasi ESP32 dengan Arduino UNO menggunakan komunikasi serial. di ESP32 menggunakan hardware Serial1 sendangkan pada UNO menggunakan SoftwareSerial.
Untuk mendapatkan data ADC dari Arduino Uno maka ESP32 akan request dengan mengirim karakter O kepada UNO, sehinga jika UNO mendapatkan karateker O maka Uno akan mengirim balik berupa data ADC. Setelah mengirim data ADC, maka UNO akan berada pada posisi RST ( tidak hidup). Yuk bagaimana kah program nya.
Program Pada Uno
#include "SoftwareSerial.h" SoftwareSerial mySerial(2, 3); String strADC; int adc0,adc1,adc2,adc3; int adc4,adc5,adc6,adc7; char data; void setup(){ Serial.begin(115200); mySerial.begin(9600); Serial.println("mulai adc"); } void loop(){ //delay(1000); //baca_adc(); while(mySerial.available()){ data = mySerial.read(); if(data == 'O'){ baca_adc(); mySerial.print(strADC); } } } void baca_adc(){ adc0 = analogRead(A0); adc1 = analogRead(A1); adc2 = analogRead(A2); adc3 = analogRead(A3); adc4 = analogRead(A4); adc5 = analogRead(A5); adc6 = analogRead(A6); adc7 = analogRead(A7); strADC = String(adc0)+ ","; strADC += String(adc1)+ ","; strADC += String(adc2)+ ","; strADC += String(adc3)+ ","; strADC += String(adc4)+ ","; strADC += String(adc5)+ ","; strADC += String(adc6)+ ","; strADC += String(adc7)+ ","; //Serial.println(strADC); }
Program Pada ESP32
#define RXD1 33 #define TXD1 32 unsigned long cur_time_wait, old_time_wait; unsigned long cur_time, old_time; String str_data; const byte pinRST = 25; void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial1.begin(9600, SERIAL_8N1, RXD1, TXD1); pinMode(pinRST, OUTPUT); digitalWrite(pinRST, HIGH); delay(1000); } void loop() { // put your main code here, to run repeatedly: cur_time = millis(); if(cur_time - old_time >= 2000){ Serial.println("request adc"); Serial1.write('O'); tunggu_data(1000); Serial.println(str_data); old_time = cur_time; } } void tunggu_data(unsigned long wkt){ Serial.println("on uno"); digitalWrite(pinRST, HIGH); cur_time_wait = millis(); old_time_wait = cur_time_wait; while(cur_time_wait - old_time_wait < wkt){ cur_time_wait = millis(); while(Serial1.available()){ str_data = Serial1.readString(); } } Serial.println("off uno"); digitalWrite(pinRST, LOW); }
Oke teman-teman mikroavr, sekian dulu artikel ESP32 Node LoRa kita, Untuk video pengujian bisa dilihat pada video di bawah ini,
Thanks