Skip to content

Instantly share code, notes, and snippets.

@monteslu
Created January 24, 2018 08:25
Show Gist options
  • Save monteslu/861abf12e2c5b87cd17eabcaa207b98b to your computer and use it in GitHub Desktop.
Save monteslu/861abf12e2c5b87cd17eabcaa207b98b to your computer and use it in GitHub Desktop.
lora gateway esp32
#include <Adafruit_NeoPixel.h>
#include <SPI.h>
#include <LoRa.h>
#include<Arduino.h>
// #include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
#define AUTO_PIXEL_PIN 16
#define CONTROL_PIXEL_PIN 16
Adafruit_NeoPixel autostrip = Adafruit_NeoPixel(4, AUTO_PIXEL_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel controlstrip = Adafruit_NeoPixel(4, CONTROL_PIXEL_PIN, NEO_GRB + NEO_KHZ800);
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define PIXEL_SERVICE_UUID "bada5566-e91f-1337-a49b-8675309fb069"
#define PIXEL_RGB_CHAR_UUID "e92f"
char macString[] = "abcd";
char sep[]= "|";
// GPIO5 -- SX1278's SCK
// GPIO19 -- SX1278's MISO
// GPIO27 -- SX1278's MOSI
// GPIO18 -- SX1278's CS
// GPIO14 -- SX1278's RESET
// GPIO26 -- SX1278's IRQ(Interrupt Request)
#define SS 18
#define RST 14
#define DI0 26
#define BAND 433E6 //915E6 -- 这里的模式选择中,检查一下是否可在中国实用915这个频段
SSD1306 display(0x3c, 4, 15);
byte mac[6];
int counter = 0;
BLECharacteristic *pSerialChar;
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
char val[value.length()];
if (value.length() > 0) {
Serial.println("*********");
Serial.print("New value: ");
for (int i = 0; i < value.length(); i++) {
Serial.print(value[i]);
val[i] = value[i];
}
Serial.println();
Serial.println("*********");
// send packet
LoRa.beginPacket();
char outputStr[value.length() + 5];
sprintf(outputStr,"%s|%i",macString,val);
LoRa.print(outputStr);
LoRa.endPacket();
}
}
};
class RBGPixelCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
char val[value.length()];
if (value.length() > 0) {
Serial.println("*********");
Serial.print("New value: ");
for (int i = 0; i < value.length(); i++) {
Serial.print(value[i]);
val[i] = value[i];
}
Serial.println();
Serial.println("*********");
// send packet
LoRa.beginPacket();
char outputStr[value.length() + 5];
sprintf(outputStr,"%s|%i",macString,val);
LoRa.print(outputStr);
LoRa.endPacket();
}
}
};
void writeOled(String message) {
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_10);
// TODO check if still drawing my mac
display.drawStringMaxWidth(0, 0, 128, "me: " + String(macString));
display.drawStringMaxWidth(0, 11, 128, message);
display.display();
}
void setup() {
pinMode(25, OUTPUT); //Send success, LED will bright 1 second
uint8_t chipid[6];
esp_efuse_read_mac(chipid);
sprintf(macString, "%02x%02x", chipid[4], chipid[5]);
Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x\n",chipid[0], chipid[1], chipid[2], chipid[3], chipid[4], chipid[5]);
Serial.begin(115200);
while (!Serial); //If just the the basic function, must connect to a computer
BLEDevice::init(macString);
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
pSerialChar = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pSerialChar->setCallbacks(new MyCallbacks());
pSerialChar->setValue("Hello World");
// Start the service
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
pService->start();
// Start advertising
pServer->getAdvertising()->start();
SPI.begin(5, 19, 27, 18);
LoRa.setPins(SS, RST, DI0);
// Serial.println("LoRa Sender");
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("LoRa Initial OK!");
pinMode(16, OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
display.init();
display.flipScreenVertically();
writeOled("Hello world.");
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) {
// received a packet
String payloadBuffer = "";
Serial.print("Received packet '" + packetSize);
// read packet
while (LoRa.available()) {
char thisChar = (char)LoRa.read();
payloadBuffer = payloadBuffer + thisChar;
}
Serial.println(payloadBuffer);
writeOled(payloadBuffer);
char buf[packetSize];
payloadBuffer.toCharArray(buf, packetSize);
pSerialChar->setValue((uint8_t*)buf, packetSize);
pSerialChar->notify();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment