Последовательная связь ESP8266 с ATMega328P

Я изолирую ATMega328P от Arduino Uno. Я использовал его во многих других проектах, поэтому он работает так, как задумано. Кроме того, я использовал свой ESP8266-01 для других проектов, и он отлично работает (включая последовательную связь).

Я пытаюсь заставить ESP8266-01 заставить контакт 13 ATMega328P мигать светодиодом. Вот и все.

Когда ESP8266 подключен к TX/RX платы Arduino, программа работает точно так, как задумано. Я точно так же подключаю его к ATMega328P, и он не работает.

Я использую скорость передачи данных 9600 бод для связи и кристалл 16 МГц для ATMega328P.

schematic

Контроллер также получает напряжение 3,3 В от источника питания. А контакт 13 должен включаться/выключаться в зависимости от серийного значения. Ниже приведен код ESP8266:

#include <ESP8266WiFi.h>

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(10000);
  Serial.write("LED ON");
  delay(10000);
  Serial.write("LED OFF");
}

Ниже приведен код для ATMega328P:

#include <SoftwareSerial.h>

SoftwareSerial esp8266(2,3);

void setup()
{
  Serial.begin(9600);
  esp8266.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  if(esp8266.available()) 
  {
    String command = "";
    while(esp8266.available())
    {
      command += (char)esp8266.read();
    }

    if(command == "LED ON") {
      digitalWrite(13, HIGH);  
    }

    if(command == "LED OFF") {
      digitalWrite(13, LOW);
    }
  }

  delay(500);
}

Как уже говорилось, они прекрасно работают по отдельности, но когда я пытаюсь подключить их вместе, это не работает.

PS Обычно я устанавливаю скорость передачи данных для ESP8266 на значение 115200, но я считаю, что ATMega328P должен работать на скорости 9600 из-за тактовой частоты 16 МГц. Хотя насчет этого не уверен.

РЕДАКТИРОВАТЬ:

schematic

, 👍0

Обсуждение

«но я считаю, что ATMega328P должен работать на частоте 9600». Его аппаратный UART полностью поддерживает скорость 115200 бод и выше. Ограничение на скорость в 9600 бод применяется к порту SoftwareSerial, который моделируется путем запрограммированной «битовой обработки» на другой паре цифровых контактов ввода-вывода., @JRobert


1 ответ


Лучший ответ:

0

В общем, попробуйте устранить проблему. Очевидно, либо вы не получаете данные от своих esp8266.available() и/или esp8266.read(), либо это неправильные данные. Вставьте трассировки (Serial.println(...)), распечатайте данные и выясните, что происходит не так.


В частности, я подозреваю, что проблема здесь в том, что вы полагаетесь на то, что все данные будут доступны немедленно: вы проверяете esp8266.available(), который сообщит вам, есть ли или более байт доступно. Затем вы esp8266.read() до тех пор, пока не останется доступных байтов. Что делать, если между прибытием байтов есть задержка в 1 мс? Вы получите, возможно, LED O, esp8266.available() сообщающие вам, что данных больше нет (нет, пока!) и ты перестаешь читать.

Вероятно, вы могли бы заставить это работать, вставив небольшой delay() в:

while(esp8266.available())
{
  command += (char)esp8266.read();
  delay(100);
}

Это решение (вероятно), но не хорошее. Лучшим решением было бы создать команды LED_ON\n и LED_OFF\n — и читать, пока не получите \n.

,

Я попробовал все вышеперечисленное, но все еще безуспешно. Я не думаю, что это будет проблемой, потому что код работает с Atmega, подключенным к Uno. Все, что я действительно сделал, это изолировал его от uno и добавил кристалл 16 МГц для внешней тактовой частоты., @Brett Comardelle

Тогда я не знаю, извини. Что *на самом деле* происходит не так? Вы проложили трассировку, чтобы узнать, как далеко он продвинулся, где произошел сбой и т. д.?, @Mark Smith

Я вставил его обратно в уно, и теперь он не работает. Возможно я напутал контроллер. Попробую с новой атмегой., @Brett Comardelle

Хорошо. С Уно работает отлично. Но когда я снимаю контроллер и настраиваю его, как показано выше, он не работает., @Brett Comardelle

Мой Бог. Я понял. Я забыл подать питание на другую сторону чипа. ух ты., @Brett Comardelle