/********* * Приёмник LORA с OLED монитором * Вывод информации на OLED дисплей * Звуковое оповещение (Sos) о вскрытии объекта * by RA3TOX - feb 2020 * http://rfanat.ru *********/ #include #include #include #include #include // задаем контакты, используемые трансивер-модулем: #define ss 10 #define rst 9 #define dio0 2 #define OLED_ADDR 0x3C // OLED-дисплей TWI-адрес // объявляем SSD1306-дисплей, подключенный к I2C (контакты SDA, SCL) без RESET: Adafruit_SSD1306 display(-1); void setup() { // параметр «SSD1306_SWITCHCAPVCC» задает, // что напряжение от дисплея будет идти // от внутренней 3.3-вольтовой сети, // а параметр «0x3C» означает «128x32»: if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); // "Инициализация SSD1306 не удалась" for(;;); // не продолжаем, оставляем этот цикл работать вечно } pinMode(3, OUTPUT); // Инициализируем пин D3 в режиме выхода (пищалка) // инициализируем и очищаем дисплей display.begin (SSD1306_SWITCHCAPVCC, OLED_ADDR); display.display(); Call(); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("RA3TOX LoRa Receiver"); // "LoRa-приёмник" display.display(); Serial.begin(9600); while (!Serial); Serial.println("RA3TOX LoRa Rx"); // "LoRa-приёмник" // настраиваем трансивер-модуль LoRa: LoRa.setPins(ss, rst, dio0); if (!LoRa.begin(433E6)) { Serial.println("Starting LoRa failed!"); // "Запуск LoRa не удался!" while (1); } Serial.println("LoRa Initializing OK!"); // "Инициализация LoRa прошла успешно!" display.setCursor(0,10); display.println("LoRa Initializing OK!"); // "Инициализация LoRa прошла успешно!" display.display(); } void loop() { // проверяем, был ли получен пакет: int packetSize = LoRa.parsePacket(); if (packetSize) { // сообщаем, что пакет получен: Serial.print("Received packet "); // "Пакет получен " display.clearDisplay(); display.setCursor(0,0); display.print("Received packet "); // "Пакет получен " display.display(); // считываем пакет: while (LoRa.available()) { String LoRaData = LoRa.readString(); // Ищем подстроку Alarm if (LoRaData.substring(0,6) == "Alarm") { Sos(); // если вскрытие - бъем тревогу! } else { Serial.print(LoRaData); display.setCursor(0,10); display.print(LoRaData); display.display(); } } // печатаем RSSI пакета: int rrsi = LoRa.packetRssi(); Serial.print(" with RSSI "); // " с RSSI" Serial.println(rrsi); display.setCursor(0,20); display.print("RSSI: "); // "RSSI: " display.setCursor(30,20); display.print(rrsi); // отображение уровня сигнала RSSI display.print("dbm "); display.print(LoRa.packetSnr()); // отображение сигнал/шум SHR display.print("db"); // включаем пищалку на 100 мс digitalWrite(3, HIGH); delay(100); digitalWrite(3, LOW); display.display(); } } void Call() { digitalWrite(3, HIGH); // передаем букву R delay(50); digitalWrite(3, LOW); delay(50); digitalWrite(3, HIGH); delay(150); digitalWrite(3, LOW); delay(50); digitalWrite(3, HIGH); delay(50); digitalWrite(3, LOW); } void Sos() { digitalWrite(14, HIGH); // передаем букву S delay(50); digitalWrite(14, LOW); delay(50); digitalWrite(14, HIGH); delay(50); digitalWrite(14, LOW); delay(50); digitalWrite(14, HIGH); delay(50); digitalWrite(14, LOW); delay(150); digitalWrite(14, HIGH); // передаем букву O delay(150); digitalWrite(14, LOW); delay(50); digitalWrite(14, HIGH); delay(150); digitalWrite(14, LOW); delay(50); digitalWrite(14, HIGH); delay(150); digitalWrite(14, LOW); delay(150); digitalWrite(14, HIGH); // передаем букву S delay(50); digitalWrite(14, LOW); delay(50); digitalWrite(14, HIGH); delay(50); digitalWrite(14, LOW); delay(50); digitalWrite(14, HIGH); delay(50); digitalWrite(14, LOW); delay(150); }