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());
  }
}