Как отправить последовательные данные с Arduino Uno в последовательный ESP-01?

Итак, мне нужно отправить данные звукового датчика с Arduino Uno на ESP8266 (ESP-01), чтобы он мог выводить push-уведомление на мой телефон всякий раз, когда раздается громкий шум. У меня датчик только что включен и подключен к аналоговому контакту 0, а ESP подключен и подключен к последовательным контактам Arduino в обратном порядке (RX-TX, TX-RX)

Это код, который у меня есть на Arduino:

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

void loop() {
  Serial.write(analogRead(A0) + "\r\n");
  delay(100);
}

И это код, который у меня есть на ESP:
(я опускаю часть уведомления для ясности, она даже не использует Serial, поэтому я не думаю, что это должно мешать)

void setup() {
  Serial.begin(115200);
}
void loop() {
  String val;
  val = Serial.readString();
  if( val.toInt() < 50 ){ sendNotification("Hello!"); delay(10000);}
}

Я протестировал выходной сигнал датчика, и он кажется нормальным, всякий раз, когда я щелкаю или хлопаю, показания показывают пик (хотя и перевернутый, он постоянно остается на 1023, а затем достигает максимума примерно до 0 ~ 50), и ESP также может отправлять уведомления в обычном режиме. Но триггер в уведомлении, похоже, никогда не срабатывает, так что я предполагаю, что ESP не получает данные должным образом.

Я новичок в Arduino, поэтому я не знаю, делаю ли я здесь что-то не так, Заранее спасибо!

, 👍0

Обсуждение

Serial.println(analogRead(A0)); отправит значение в виде текста, завершающегося символом \r\n. на стороне получения используйте по крайней мере readStringUntil, @Juraj


1 ответ


2

Запись мусора из памяти

Serial.write(analogRead(A0) + "\r\n");

Это перевод указателя на "\r \n" на любое число, возвращаемое analogRead . Другими словами, вы отправляете не измерение, а мусор из памяти после (или иногда в) ячейки памяти "\ r \ n".

Serial.println(analogRead(A0)); похоже, это то, к чему вы стремились здесь. окончание линии println для последовательного соединения UNO - "\r\n".

Логические уровни

Когда дело доходит до соединения последовательных соединений вместе, должно происходить некоторое преобразование уровней. Потому что контакты UNO имеют логические уровни 5 В, а ESP-01 ожидает уровни 3,3 В.

,

Спасибо за информацию! Простое написание analogRead(A0) не работало, поэтому я предположил, что ESP нуждается в новой строке и каретке для приема ввода, как и в AT-командах. Преобразование уровня, о котором вы сказали, является аппаратным преобразованием, например, уменьшением напряжения 5 В до 3,3 В с помощью резистора, или это какое-то программное преобразование?, @Jao

Для UNO TX-ESP-01 RX резисторный делитель напряжения, вероятно, будет работать нормально. Двигаясь в другом направлении, вам понадобится какой-то буфер, чтобы надежно получить высокое напряжение минимального логического уровня UNO., @timemage

Еще раз спасибо! Я пойду куплю регулятор и посмотрю, работает ли он. Другой вопрос, мне нужно только отправить серийный номер из UNO в ESP, ESP никогда ничего не отправляет обратно. Нужен ли мне буфер для регулирования натяжения для соединения ESP с UNO в любом случае?, @Jao

@Jao: есть вещи, называемые "преобразователями логического уровня", которые созданы для такого сценария. Думаю, вместо этого стоит взглянуть., @Mat

@Jao, в направлении от UNO к ESP, вероятно, вам просто нужно создать разделитель для сигнала вашего UNO TX, и преобразователь уровня не будет строго необходим, хотя, вероятно, он может быть более эффективным. Разделитель - это простое решение. Имейте в виду, что ваш UNO TX / D1 - это тот же сигнал, который в конечном итоге возвращается на ПК, поэтому, когда вы используете его для отправки на ESP-01, вы также отправляете данные на ПК / последовательный монитор., @timemage

Кроме того, ваш ESP-01 не является устройством с напряжением 5 В. Таким образом, вы не хотите включать его от 5 В, если вы это делали. Вам также следует избегать попыток запитать его от линии 3,3 В UNO, которая, скорее всего, не обеспечит ток, требуемый ESP-01 при выполнении каких-либо действий по Wi-Fi., @timemage