• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Передача данных с arduino на ESP-01 через последовательный порт(не стандартная прошивка)

perelygin

New member
В наличии контроллер, который управляет различной нагрузкой в зависимости от показаний датчиков. Контроллер реализован на arduino nano. Так же есть ESP8266 -01
Хочется что бы контроллер передавал информацию на web сервер, который находится на ESP.
Соответственно, пользователь подключается к wi-fi точке доступа, которую создает ESP и обращается по адресу web-сервера, который выдает ему страничку с информацией о состоянии контролера.

За основу взят пример WiFiWebServer из Arduino IDE (огромный респект создателям). Пример отрабатывает. Сервер выдает страничку.
Теперь я пытаюсь передать из arduino данные контроллера. Так как на нем остался один цифровой пин и RX0 c TX1, то выбор пал на обмен по UART.
Собрал схему по примеру:
http://bigbarrel.ru/arduino_serial_uart_net/
Т.е. arduino, выставляет 1 на цифровом пине, который подключен к GIO2 ESP. Затем начинается передача данных по последовательному порту:

Код:
digitalWrite(SERIALBEGINPIN, HIGH);   // начинаем обмен по UART
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(d2);//задержка для срабатывания прерывания на контроллерах приема
  Serial.print("This is the perfect world");
  delay(d);//задержка для приема сообщения
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(SERIALBEGINPIN, LOW);   // завершаем обмен по UART
На ESP, к GIO2 подвешено прерывание
Код:
 pinMode(2,INPUT);
  attachInterrupt(2,getSerial,RISING );
обработка прерывания

Код:
void getSerial(){  //прием данных  по прерыванию

  noInterrupts(); //отключаем прерывания
  
    while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
  if(inputString.length()>0){
    XYZ = XYZ +1;  // пременная для проверки срабатывания прерывания
  }else {
    XYZ=111;
  }
interrupts();  //включаем прерывания.
}
Не работает.
Причем само прерывание срабатывает, проверял. Но стоит включить чтение из порта, сервер зависает. И как либо диагностировать не получается. Так как монитор последовательного порта не включить.

Вопрос: Что я делаю не правильно? ИМХО включать передачу данных по последовательному порту в программу обработки прерывания - не самая лучшая идея. Но как тогда сообщить ESP, что ему нужно считывать данные из порта?
 

perelygin

New member
Похоже, что
// noInterrupts(); //отключаем прерывания
и
// interrupts(); //включаем прерывания.

вызывают перезагрузку модуля ESP8266
 

igrushkin

Member
Только один вопрос: нафига Вам прерывания?
Начните с банального while (Serial.available)...
Кроме того, если Вы только передаете с Ардуины на ESP, то вполне можете пользоваться монитром порта, там не будет видно, что передает Ардуина, но можно печатать то, что получает ESP

ps у меня все работает прекрасно.
 

perelygin

New member
@igrushkin
Упростил код до того, что arduino все время шлет в порт одну и ту же строку, а ESP читает из порта. И кажется нашел где собака зарыта.
Проблема в подключении линий RX/TX. Дело в том, что для согласования уровней напряжения 5В/3.3В я подключил их через токоограничительные резисторы. Как описано здесь(вариант 1):
http://we.easyelectronics.ru/Shematech/soglasovanie-logicheskih-urovney-5v-i-33v-ustroystv.html
Для сигнала с прерыванием это сработало, а вот в случае с портом не прокатило. Стоило закоротить этот резистор и передача пошла. Для отладки подключу напрямую, а потом попробую через делитель подключить.
 

sally555

New member
я вот так сопрягаю, важно чтоб в ЕСПшку не попало 5 вольт, поэтому линия передачи от Ардуинки к ЕСПшке ограничена стабилитроном. Линию передачи от ЕСПшки к Ардуине можно соединять напрямую.сопряжение_5в_3_3в.JPG
 

igrushkin

Member
я вот так сопрягаю, важно чтоб в ЕСПшку не попало 5 вольт, поэтому линия передачи от Ардуинки к ЕСПшке ограничена стабилитроном. Линию передачи от ЕСПшки к Ардуине можно соединять напрямую.Посмотреть вложение 1316
работает схемка на стабилитроне? на резисторном делителе у меня не захотела работать
 

Onkel

New member
2 ТС :
весьма остроумное решение, я про

Код:
 pinMode(2,INPUT);
  attachInterrupt(2,getSerial,RISING );
но пара вопросов- esp штука быстрая, не получается, что прерывание вызывается и обрабатывается пока байт еще не до конца получен, и может получиться так, что пока прерывание будет в getSerial() отключено, байт будет получен, и по возврату из функции байт будет сидеть в буфере, но функция getSerial() будет вызвана только при следущем приходе байта? У меня задача приема на скорости 9600, тут такое запросто может быть.
И не нашли ли Вы в ide arduino для esp прямую функцию, вызываемую по приему байта, вроде atmeg /ардуиновской USART_Receive( void ) ? А то уже неделю ломаю голову, как малой кровью такие прерывания организовать....
 

max506

New member
Насколько я проверял, serialEvent() ардуиновский для esp не работает.
Но можно в цикле loop() вытаскивать на esp данные из порта, и при достижении некоторого символа конца пакета считать, что пакет принят
 
Сверху Снизу