Не работает SoftwareSerial
- Войдите на сайт для отправки комментариев
Добрый день, форумчане. Проблема такова - есть Arduino Uno и модуль ESP8266. На модуле ESP я создал WEB сервер. И по переходе по спец. ссылке пишу в Serial информацию. Информация со стороны ESP пишется точно (проверено). Теперь к самой проблеме. Откуда же я знаю что ESP отсылает данные? При прошивке ESP я использую пины 0 и 1 RX и TX соответственно. Когда я прошил ESP, меняю провода местами (RX->TX , TX->RX) - инфа до ESP доходит. Но если я использую SoftwareSerial и создаю Serial на пинах 2,3 (для Uno это рабочие пины создания Serial (у меня там раньше стоял Radio модуль и тоже по SoftwareSerial)), то извините - с ESP инфа уже не приходит. Танцуя с бубном мне все-таки удалось "Обмануть" ESP, но только раз - включив ESP в порты 0,1 (На старом месте (пин 2,3) у меня стоял тот самый Radio модуль). Не выключая ESP - я вынул провода Radio и ESP и воткнул провода ESP в пины 2,3 и о чудо - заработало ! Но только 1 раз :D. Единственное что я нарыл на других форумах - это то, что ESP имеет 2 UART портов и вроде-бы причина именно в этом (но по своей глупости и малому опыту с Arduino - не могу понять в чем причина такого поведения ESP). Повторяю - что на пинах 0,1 все отрабатывает всегда корректно. Код ниже. P.S извиняюсь за такой огромный код Arduino - думал сначала его обрезать, но потому решил скинуть как есть
ESP
#include <ESP8266WiFi.h> // Подключаем библиотеку ESP8266WiFi #include <ESP8266WebServer.h> // Подключаем библиотеку Wire const char* ssid = "MyESP"; // Название Моей создаваемой WiFi сети ESP8266WebServer HTTP(80); // Указываем порт Web-сервера (80) по дефолту String command; String commandAdd="AddPhoneNumber"; String commandDelete="DeletePhoneNumber"; int telnum=520534351; int flag=1; void setup() { Serial.begin(9600); // Скорость передачи 9600 (дефолт) delay(10); WiFi.softAP(ssid); // Создание точки WiFi с названием ssid HTTP.begin(); // Создание веб сервера на 80 порту Serial.println("My ip adress"); //Вывод ip адреса для подключения по федолту (192.168.4.1) Serial.println(WiFi.softAPIP()); HTTP.on("/changeDiodStatus",[](){ if(flag==1){ command=commandAdd + telnum; flag=2; }else{ command=commandDelete + telnum; flag=1; } Serial.print(command); HTTP.send(200,"text/plain","Status changed"); }); } void loop() { HTTP.handleClient(); }
Arduino
// ЭТО СКЕТЧ ПРИЁМНИКА (БАЗА)!!! //--------------------- НАСТРОЙКИ ---------------------- #define CH_NUM 0x60 // номер канала, должен совпадать с передатчиком (датчик) // УРОВЕНЬ МОЩНОСТИ ПЕРЕДАТЧИКА #define SIG_POWER RF24_PA_MAX // СКОРОСТЬ ОБМЕНА ДАННЫМИ // должна быть одинакова на приёмнике и передатчике! #define SIG_SPEED RF24_1MBPS //--------------------- НАСТРОЙКИ ---------------------- //--------------------- БИБЛИОТЕКИ --------------------- #include "nRF24L01.h" // библиотеки для радио модуля #include "RF24.h" RF24 radio(9, 10); // создать радио модуль на пинах 9 и 10 #include "SoftwareSerial.h" //библиотека для создания сериал порта на любом пине SoftwareSerial SIM800(4,5); //создать сериал порт для прослушки на пинах 2,3 SoftwareSerial WIFI(2,3); //TX желтый RX зеленый //--------------------- БИБЛИОТЕКИ --------------------- //--------------------- ПЕРЕМЕННЫЕ ---------------------- byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte callbackData[3]; // массив принятых данных (id от кого, type тип датчика, data что передал) byte Data[4]; //массив отправляемых данных (id кому , type кому , id новый , type новый) byte pipeNo; //Байтовая переменная хранения номера трубы для отправки struct Sensor { //Переменная типа struct для хранения данных о датчике byte id; byte type; byte data; }; Sensor cashDataToSend; // кешевая переменная для отправки данных String _response = ""; // Переменная для хранения ответа модуля sim800L //--------------------- ПЕРЕМЕННЫЕ ---------------------- void setup() { WIFI.begin(9600); Serial.begin(9600); //открываем порт для связи с ПК radioSetup(); //ф-я настройки радио модуля simSetup(); //ф-я настройки модуля sim800L // sendSMS("+79520534351","hi"); // for(int i =0; i<200; i++){ //// writeNewSensorSettings(0,1,mySensor); // clearSensorById(i); //// delay(200); // Serial.print("Info "); Serial.println(eeprom_read_byte(i)); // delay(5); // } } int bustatus; void loop() { if(radio.available()){ Serial.println("Что-то пришло ,читаю"); radio.read(&callbackData, sizeof(callbackData)); if(callbackData[0]==0 && callbackData[1]!= 0){ registerNewSensor(); } } if(WIFI.available()){ Serial.println("Есть инфа с wifi"); Serial.println(WIFI.readString()); } // // if(Serial.available()){ // bustatus=Serial.parseInt(); // Serial.print(bustatus); // switch(bustatus){ // case 2: // Serial.print("Я на лоу"); // break; // case 1: // Serial.print("Я на хай"); // break; // } // } } void radioSetup() { // настройка радио модуля radio.begin(); // активировать модуль radio.setAutoAck(1); // режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); // (время между попыткой достучаться, число попыток) radio.setPayloadSize(32); // размер пакета, байт radio.openReadingPipe(1, address[0]); // хотим слушать трубу 0 radio.openWritingPipe(address[1]); // хотим писать на трубу по первому адресу radio.setChannel(CH_NUM); // выбираем канал radio.setPALevel(SIG_POWER); // задаем уровень мощности передатчика radio.setDataRate(SIG_SPEED); // задаем скорость обмена // должна быть одинакова на приёмнике и передатчике! // при самой низкой скорости имеем самую высокую чувствительность и дальность!! (логично) radio.powerUp(); // начать работу radio.startListening(); // начинаем слушать эфир, мы приёмный модуль } void simSetup(){ SIM800.begin(9600); //Скорость порта для связи Arduino с GSM модемом delay(100); sendATCommand("AT", true); //Настраиваем Sim модуль для общения (скорость) sendATCommand("AT+CMGF=1", true); //Включаем функцию отправки сообщений } void sendSMS(String phone, String message) //ф-я отправки sms { sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z } void registerNewSensor(){ Serial.println("Новенький"); radio.stopListening(); Serial.println("Перестал читать"); writeNewSensorSettings(callbackData[1],callbackData[2],cashDataToSend); Data[0]= callbackData[0]; Data[1]= callbackData[1]; Data[2]= cashDataToSend.id; Data[3]= cashDataToSend.type; Serial.print("Новый id"); Serial.println(Data[2]); Serial.print("Новый type"); Serial.println( Data[3]); if (waitRadioResponse()){ Serial.println("Отправил, удачная регистрация"); radio.startListening(); Serial.println("Начинаю слушать"); }else{ clearSensorById(Data[2]); Serial.println("Нет ответа, освободил id"); radio.startListening(); Serial.println("Начинаю слушать"); } } bool waitRadioResponse(){ bool _resp=false; long _timeout = millis() + 2000; // Переменная для отслеживания таймаута (10 секунд) while (!_resp && millis() < _timeout) { _resp = radio.write(Data, sizeof(Data)); }; // Ждем ответа или выжидаем таймаут в 2 секунды if (_resp) { // Если есть, что считывать... return true; // ... считываем и запоминаем } else { // Если пришел таймаут, то... return false; // ... оповещаем об этом и... } } bool isItFreeCell(int num) { //ф-я проверки клетки eeprom на пустоту Serial.print("isItFreeCell() <-"); Serial.println(num) ; byte cash = eeprom_read_byte((uint8_t*)num); Serial.print("Что находится в ячейке num"); Serial.println(cash) ; delay(15); Serial.print(cash); Serial.print(" = "); Serial.print(cash); Serial.println(" ?") ; if (cash == 255) { Serial.println(" Да") ; return true; } else { Serial.println(" Нет") ; return false; } } void clearSensorById(int id) { //ф-я очистки клеток памяти eeprom от сенсора по его id for (int i = 10; i < 1000; i= i + 3) { if (eeprom_read_byte((uint8_t*)i) == id) { delay(10); eeprom_write_byte((byte*)i, 255); delay(10); eeprom_write_byte((byte*)i + 1, 255); delay(10); eeprom_write_byte((byte*)i + 2, 255); delay(10); break; } } } void writeNewSensorSettings(byte type, byte data, Sensor& CallbackData) { //ф-я записи нового датчика в память eeprom (дывается id) Sensor mySensor; mySensor.type = type; mySensor.data = data; for (int i = 10; i < 1000; i = i + 3) { Serial.print("i= "); Serial.println(i) ; if (isItFreeCell(i) == true) { delay(500); if (i==10){ mySensor.id=1; }else { mySensor.id = eeprom_read_byte((uint8_t*)i-3)+1; //Чтение из eeprom } Serial.print("Старый id = "); Serial.println(mySensor.id); Serial.print("Новый id = "); Serial.println(eeprom_read_byte((uint8_t*)i-3)) ; eeprom_write_block((void*)&mySensor, (int*)i, sizeof(mySensor)); eeprom_read_block((void*)&CallbackData, (int*)i, sizeof(CallbackData)); break; } } } void readSensorSettingsById(int id,Sensor& callbackData){ //ф-я вывода данных о сенсое по id for (int i =10;i<1000;i= i+3){ if (eeprom_read_byte((uint8_t*)i) == id) { eeprom_read_block((void*)&callbackData, (int*)i, sizeof(callbackData)); } } } void writeMainPhone(long phomeNumber){ //ф-я записи основонго номера телефона long поскольку int(16 бит) -32768 до 32767 и по этим причинам не подходит для номера телефона int n=0; for(int i=5;i>0;i--){ // Serial.println(i-n); // Serial.println(phomeNumber%100); delay(50); eeprom_write_byte(n, phomeNumber%100); delay(50); n++; phomeNumber/=100; // Serial.println(n); // Serial.println(phomeNumber); } } void writeAddPhone(long phomeNumber){ //ф-я записи вторичного номера телефона long поскольку int(16 бит) -32768 до 32767 и по этим причинам не подходит для номера телефона int n=0; for(int i=5;i>0;i--){ // Serial.println(i-n); // Serial.println(phomeNumber%100); delay(50); eeprom_write_byte(n+5, phomeNumber%100); delay(50); n++; phomeNumber/=100; // Serial.println(n); // Serial.println(phomeNumber); } } String waitResponse() { // Функция ожидания ответа и возврата полученного результата String _resp = ""; // Переменная для хранения результата long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа или выжидаем таймаут в 10 секунд if (SIM800.available()) { // Если есть, что считывать... _resp = SIM800.readString(); // ... считываем и запоминаем } else { // Если пришел таймаут, то... Serial.println("Timeout..."); // ... оповещаем об этом и... } return _resp; // ... возвращаем результат. Пусто, если проблема } String sendATCommand(String cmd, bool waiting) { String _resp = ""; // Переменная для хранения результата Serial.println(cmd); // Дублируем команду в монитор порта SIM800.println(cmd); // Отправляем команду модулю if (waiting) { // Если необходимо дождаться ответа... _resp = waitResponse(); // ... ждем, когда будет передан ответ if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2); } Serial.println(_resp); // Дублируем ответ в монитор порта } return _resp; // Возвращаем результат. Пусто, если проблема }
Даже один софтсериал - это испытание для программиста, а два уж подавно. Мега под рукой есть? Если да - зарытайте с ней, на хардварных сериалах.
Фото 1. RX->RX TX->TX RST->GND (Для отслеживания - что же нам пишет ESP в свой сериал) Дергаю спец.ссылку 2 раза
AddPhoneNumber520534351
DeletePhoneNumber520534351
Фото 2. TX->RX RX->TX Дергаю спец.ссылку 2 раза
P.S код pool Arduino
Фото 3. RX->2 TX->3 Дергаю спец.ссылку 2 раза
P.S код pool Arduino + SoftwareSerial WIFI(2,3); так никуда из кода и не уходил
ПУСТО
К сожалению - меги нет, есть только Uno (я думаю что ее "Потенциала" вполне хватит для моего проекта) - не хотелось бы брать избыточно мощный мк из-за проблемы с Serial (на крайний буду использовать 0,1 пины, но перетыкать их постоянно для прошивки мк и ESP - не очень хочется)
+ Я уже использую 2 софтсериал - думаю еще 1 не проблема :D
Также могу отметить, что создавать сериал на других пинах я пробовал - все тщетно.
+ Я уже использую 2 софтсериал - думаю еще 1 не проблема :D
Любители никогда не сомневаются в успехе там, куда профессионал предпочитает не соваться.
https://doc.arduino.ua/ru/prog/SoftwareSerialListen
Может это поможет заставить работать софтовый сериал?
Хм, да, спасибо , заработало . Осталось решить проблему с переключением на другие Serial (ведь у меня их 3) как думаете - как решить проблему?
+ Я уже использую 2 софтсериал - думаю еще 1 не проблема :D
а чего не 4 ?
Если вы так уверены, что "потенциала Уно хватит" - то странно, что вы пришли об этом спрашивать. решайте проблему сами. вы же точно знаете, что надо делать.
Если все же захотите чуть научиться - библиотека SOftSerial не может работать больше чем с одним портом за раз. Об этом написано в описании библиотеки - как вы думаете, авторы в куорсе или нет?
Проводка соплями прямо над антенной - шикарное конструкторское решение.
Хм, да, спасибо , заработало . Осталось решить проблему с переключением на другие Serial (ведь у меня их 3) как думаете - как решить проблему?
точно так же.
Только прочитайте внимательно первую строчку по этой ссылке.
Мне кажется вы делаете бредятину. Лучше возьмите Мегу, отговорка "у меня ее нет" - не катит, на свете существуют магазины. Даже если вам придется ждать ее с Али месяц - это будет эффективнее, чем тратить время на решение НЕРЕШАЕМЫХ проблем с кучей СОФТсериалов
Тогда, возможно сможете предложить иную альтернативу SoftSerial для прослушивания 2 -х и более sERIAL одновременно ?
Тогда, возможно сможете предложить иную альтернативу SoftSerial для прослушивания 2 -х и более sERIAL одновременно ?
Элементарно, Ватсон! - HardwareSerial.
Тогда, возможно сможете предложить иную альтернативу SoftSerial для прослушивания 2 -х и более sERIAL одновременно ?
несколько аппаратных сериалов
И я бы, для начала. вообще задумался. нафига мне столько сериалов. У вас в конструкции, насколько я вижу - одновременно WiFi, радио NRF и GPRS SIM800. Нафига столько? - если есть инет, значит не нужен модем. И если есть Вайфай - то не нужен NRF
Не пытайтесь изготовить комбайн, который будет "уметь все". Когда кто-то берется одновременно подметать улицы и выпекать булочки - в тесте песок на зубах хрустеть будет...
Спасибо, попробую. Раньше его не использовал )
Это дипломная работа. Что-то по типу умного дома с экономическим обоснованием итд ) Я бы сам рад использовать везде Wifi, но он и стоит в 3-4 раза дороже. В серийном производстве ( до которого дипломной работе как на коленях до китая) - конечно далеко, но я там в общем сложил одно и другое - как итог- дорого выходит + система для слабослышащих. Мне поставили задачу по типу - А знаешь какие телефоны у глухих? - Такие, что дробят кости при звонке, если лежат в кармане штанов (намек на Nokia) и что операционки у них нет - соответcnвенно чтобы их оповещать - нужен GSM модуль коим и является Sim800. Radio - ля общения с датчиками. WIFI - для настройки "Базы" с помощью WEB интерфейса (помогите, меня мучают тут в вузе)
Ну и естественно WIFI использует TCP, что намного упростило бы "общение" (все-таки) не по радио передавать.
Мегу бери
Полностью с вами согласен (про булочки и песок), но мы с вами - люди подневольные. Если заказчик желает - желания надо исполнять в корпусе 1 устройства и без всякие "если" и за пару сотен деревянных
Мега длиннее uno + я уже все спаял ( Так не хочется все делать заново + ее еще покупать надо (а мы студенты - люди бедные) + деньжата никто не вернет. Ах, да, еще и покупать макетку и паяться заново на нее. Но спасибо , я помучаюсь еще с Hardware serial - если не получится - перейду . (Надеюсь все получится)
Хвхавхах ) Спасибо, что есть то есть - разработка Сколково
Забавно, конечно. У нас в пригороде интернат для глухонемых, так периодически я вижу в автобусе их стайками. Никаких 3310 у них давно уж нет, все нормально в Вайбере керогазят.
Вибробраслеты, полагаю, тоже не что-то из ряда вон выходящее. Ещё первые Pebble вполне удачно беззвучной вибрацией будили меня по утрам.
я помучаюсь еще с Hardware serial - если не получится - перейду .
Ты что-то не въезжаешь. Hardware serial - это тот Сериал, что у Уно на пинах 0 и 1. Он по определению на Уно один и подключить 4 девайса одновременно ты через него никак не сможешь.
Hardware serial тебе советовали использовать на тех платах, где таких портов несколько - из распространенных это Мега и СТМ32
Они естественно про пожилых людей ( для молодежи - есть telegram) в который тоже можно отправлять пуш уведомления с ESP
я помучаюсь еще с Hardware serial - если не получится - перейду .
Ты что-то не въезжаешь. Hardware serial - это тот Сериал, что у Уно на пинах 0 и 1. Он по определению на Уно один и подключить 4 девайса одновременно ты через него никак не сможешь.
Hardware serial тебе советовали использовать на тех платах, где таких портов несколько - из распространенных это Мега и СТМ32
Теперь въехал. Епона мать. Ну что ж за мир то такой. Единственная надежда осталась, попробую ее реализовать - если не сбудется - перехожу, но сами понимаете мою попоболь
Спрошу у вас, чтобы долго самому не копаться (возможно вы знаете). Библиотека RF24 создает serial на портах ? Или же это что-то другое ?
И пожилая родственница у меня есть. СМС-ки раз в месяц смотрит и то, если напомнить.Какие там оповещения от мониторинга...
Вобщем, тут что-то с "эргономикой" и целевой аудиторией не проработано. Понятно, что в ВКР необходимо просто показать, что ты умеешь. Но в реальном устройстве софтсериалы с гитхаба в доме устроят пожар и потоп одновременно. Экономический эффект покажет отрицательную динамику.
) Я понял. Ну, как я написал выше - я человек подневольный - мне сказали "Выжми все и потом последнюю каплю - стряхни туда же" - стараемся исполнять ) Кстати, я тут товарищу задал вопрос, возможно вы в курсе дел - RF24 использует сериал порты ?
NRF работает по SPI. Там своя кухня, с сериалами не пересекающаяся.
возможно вы в курсе дел - RF24 использует сериал порты ?
выше вы спрашивали "создает ли НРФ24 порты", а тут - использует ли?
Не очень понимаю, что вы вообще имеете в виду, но думаю, что на оба вопроса ответ "нет".
НРФ24 и Сериал никак не связаны.
Уффф, спасибо большое ) Сидел только что читал форумы в таком напряжении) Тогда все просто. Можно использовать 2 Serial в моем случае ( управления по GSM - не наклевывается ( и надеюсь что не будет)). Так что - можно - переключаться на sim800 serial, отправлять смс и уходить обратно на прослушку wifi. Спасибо )
Спасибо большое ) Выше ( в предыдущем комментарии) описал мой умственный релакс после сказанных вами (и не только) слов
Потом , как устройство будет готово - красиво все "Упакую". Сейчас устройство находится на стадии "Разработки", соответственно провода - наше все (т.к что-то надо постоянно переткнуть, добавить, убрать итд).
iconini13ya - когда вы участвуете в активной переписке, пишите в начале ник собеседника, а то приходится догадыватся, кому вы отвечаете
Может так статься, что Uno тут вообще не нужно. На ESP вроде как два сериала, SPI имеется ...
И WiFi своё, с сериалом не связанное - ещё сериал освобождается.
iconini13ya - когда вы участвуете в активной переписке, пишите в начале ник собеседника, а то приходится догадыватся, кому вы отвечаете
Спасибо большое, обязательно учту)
Возможно .... (если это ирония, то над глупыми смеяться - грешно :D)
И WiFi своё, с сериалом не связанное - ещё сериал освобождается.
Мне нужно с него инфу прокидывать на ардуино для принятия управленческих решений так сказать ) Так что думаю сериал тут понадобится (если конечно можно прокидывать данные не через сериал - расскажите как, буду рад узнать что-то новое)
Мне нужно с него инфу прокидывать на ардуино для принятия управленческих решений так сказать )
зачем решения принимать на ардуине? На ЕСП контроллер значительно мощнее и памяти больше
Мне нужно с него инфу прокидывать на ардуино для принятия управленческих решений так сказать )
зачем решения принимать на ардуине? На ЕСП контроллер значительно мощнее и памяти больше
Был бы рад принять ваши технические решения и реализовать проект с ними, но до сдачи дипломной (чтобы она была готова не считая документов) - остался месяц, а надо еще написать взаимодействие WIFI и Arduino + все это отладить от багов + сделать датчики и прошивку к ним ( что не маловажно). Но я учту в следующий раз, спасибо )