• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 данные из порта, и при достижении некоторого символа конца пакета считать, что пакет принят
 
Сверху Снизу