ESP8266 & LoRa SX1278 Transmitter Receiver with DHT11
วันนี้มาลองสร้าง LoRa กันจาก พื้นฐานเลยละกันนะครับ
ต้องขอบคุณ เวบต่างประเทศ ตามลิงก์นี้ https://how2electronics.com/lora-sx1278-esp8266-transmitter-receiver/
แต่การต่อขา MISO , MOSI เขาสลับกันอยู่ต้องต่อใหม่ตามตารางนี้ครับ
NodeMCU Pins GPIO-Pin SX1278 Pins
- GND GND GND
- D8 15 NSS
- D7 13 MOSI
- D6 12 MISO
- D5 14 SCK
- D0 16 RST
เรื่อง PIN ดูตามนี้ https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/
วงจรตัวส่ง ลำดับขาถูกต้องแล้ว
NodeMCU Pins GPIO-Pin SX1278 Pins
- GND GND GND
- D8 15 NSS
- D7 13 MOSI
- D6 12 MISO
- D5 14 SCK
- D2 4 DIOO
- D0 16 RST
ส่วนฝั่งรับ ต้องสลับขา MOSI, MISO
คราวนี้มาดูโค่ดกัน
#include <SPI.h> #include <LoRa.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <DHT.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET LED_BUILTIN // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define DHTPIN 0 //pin where the dht11 is connected #define ss 15 // ตั้งค่า GOIO15 #define rst 16 // ตั้งค่า GPIO16 #define dio0 4 // D2 ตั้งค่า GPIO4 int counter = 0; DHT dht(DHTPIN, DHT11); void setup() { Serial.begin(9600); dht.begin(); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } while (!Serial); Serial.println("LoRa Sender"); LoRa.setPins(ss, rst, dio0); if (!LoRa.begin(433E6)) { Serial.println("Starting LoRa failed!"); delay(100); while (1); } display.display(); delay(2); display.clearDisplay(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); /* if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } */ Serial.print("Temperature: "); Serial.print(t); Serial.print(" degrees Celcius, Humidity: "); Serial.println(h); Serial.println(); Serial.print("Sending packet: "); Serial.println(counter); delay(2000); display.clearDisplay(); display.setTextSize(2); // Normal 1:1 pixel scale display.setTextColor(WHITE); // Draw white text display.setCursor(0,0); // Start at top-left corner display.print(F("Pkt No:")); display.print(counter); display.setCursor(0,20); display.print("Tem:"); display.print(t); display.print("C"); display.setCursor(0,40); display.print("Hum:"); display.print(h); display.print("%"); display.display(); // send packet LoRa.beginPacket(); LoRa.print(F("Pkt No:")); LoRa.println(counter); LoRa.print("Temp: "); LoRa.print(t); LoRa.println("°C"); LoRa.print("Hum: "); LoRa.print(h); LoRa.print("%"); LoRa.println(""); LoRa.endPacket(); counter++; delay(3000); }
สำหรับฝั่งตัวรับ
#include <SPI.h> #include <LoRa.h> #define ss 15 // ตั้งค่า GOIO15 #define rst 16 // ตั้งค่า GPIO16 #define dio0 4 // D2 ตั้งค่า GPIO4 void setup() { Serial.begin(9600); while (!Serial); Serial.println("LoRa Receiver Callback"); LoRa.setPins(ss, rst, dio0); if (!LoRa.begin(433E6)) { Serial.println("Starting LoRa failed!"); while (1); } // register the receive callback LoRa.onReceive(onReceive); // put the radio into receive mode LoRa.receive(); } void loop() { // do nothing } void onReceive(int packetSize) { // received a packet Serial.println("Received packet '"); // read packet for (int i = 0; i < packetSize; i++) { Serial.print((char)LoRa.read()); } }