Arduino UNO R3, с WiFi R3, макетная плата WeMos ESP8266 не получается прошить ардуино

tomas111
Offline
Зарегистрирован: 01.03.2018

Спасибо огромное, такая мелочь была. Теперь у меня последнее что осталось это как то получить данные из Atmega.

Для этого нужно включить перемычки 1-2 в положение ON? но я не пойму как именно они соединены, судя по всему по ногам 0-1. Схему актуальную не нашёл. Может есть варианты  проверить это?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

по каким линиям там обмен не знаю, скорее всего программу надо писать между UNO и ESP

Взял бы ты себе esp32 и голову не морочил, там и ног достаточно и всё напрямую

tomas111
Offline
Зарегистрирован: 01.03.2018

ua6em пока у меня есть эта плата я повожусь с ней. Нашёл простой пример как соединить обе платы и всё заработало. Соединены они через пины 0 и 1. и соответствующие перемычки.

Для Атмеги:

const int buttonPin = 2;     // the number of the pushbutton pin
int buttonState = 0;
void setup() {

// Initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200); //All ESP8266 serial communication at 115200 baud
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // Send a message to the ESP8266
    Serial.write("change");
    // Flash the built in LED to confirm that button push was registered
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    delay(250);
    
  }
  else {
    delay(25);
  }
}

Для того что бы ESP задействовать:

bool toggle;
String incomingString;

void setup() {
  pinMode(12, OUTPUT);     // Initialize pin 12 which is GPIO12 as an output
  toggle = false;

  Serial.begin(115200);   //All serial communication with ESP8266 at 115200 baud
}

void loop() {

  if (Serial.available() > 0){
    // read the incoming string from the Arduino
    incomingString = Serial.readString();
    
    // If the incoming string from the Arduino equals "change" then we toggle the LED
    if (incomingString.equals("change")){
      digitalWrite(12, toggle);  // Turn the LED off or on
      toggle = !toggle;                     
    }
  }
  delay(50); // Wait for half second
}

Всё просто, мы по сериал порту передаем текст change.

Проверил у меня работает.

У теперь у меня другой вопрос. Как мне передать и возможно ли это вообще:

кусок скетча:

     gps.read();                                   //
//   Выводим время:                                //
     Serial.print(gps.Hours  ); Serial.print(":"); //  Выводим час.
     Serial.write(gps.Hours  ); Serial.print(":");
     Serial.print(gps.minutes); Serial.print(":"); //  Выводим минуты.
     Serial.write(gps.minutes); Serial.print(":");
     Serial.print(gps.seconds); Serial.print(" "); //  Выводим секунды.
     Serial.write(gps.seconds); Serial.print(" ");
//   Выводим дату:                                 //
     Serial.print(gps.day    ); Serial.print("."); //  Выводим день месяца.
     Serial.write(gps.day    ); Serial.print(".");
     Serial.print(gps.month  ); Serial.print("."); //  Выводим месяц.
     Serial.write(gps.month  ); Serial.print(".");
     Serial.print(gps.year   ); Serial.print("г.");//  Выводим год.
     Serial.write(gps.year   ); Serial.print("г.");
//   Выводим день недели:                          //
     Serial.print(" (");                           //
     Serial.write(" (");
     Serial.print(wd[gps.weekday]);                //  Выводим день недели.
     Serial.write(wd[gps.weekday]);
     Serial.print("), ");                          //
     Serial.write("), ");

На сколько корректно так писать? после принта отправлять данные? Может есть другой способ более простой?

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не понял что хотите

tomas111
Offline
Зарегистрирован: 01.03.2018

Я хочу передавать данные из Меги в ЕСП. По уже готовым линиям. это Пин 0 и 1.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

так в примере это и есть, а откуда и куда - без разницы, интерфейс двусторонний

tomas111
Offline
Зарегистрирован: 01.03.2018

Я просил на сёт корректности написания:

     Serial.print(gps.Hours  ); Serial.print(":"); //  Выводим час.
     Serial.write(gps.Hours  ); Serial.print(":");
     Serial.print(gps.minutes); Serial.print(":"); //  Выводим минуты.
     Serial.write(gps.minutes); Serial.print(":");

У меня до этого было просто:

     Serial.print(gps.Hours  ); Serial.print(":"); //  Выводим час.
     Serial.print(gps.minutes); Serial.print(":"); //  Выводим минуты.
     Serial.print(gps.seconds); Serial.print(" "); //  Выводим секунды.

Я всё это видел в мониторе порта, но когда я буду передавать данные что я увижу? Функция print не передаст в ESP? Для передачи нужна функция WRITE?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

tomas111 пишет:

Я всё это видел в мониторе порта, но когда я буду передавать данные что я увижу? Функция print не передаст в ESP? Для передачи нужна функция WRITE?

и та и та передают, но разное

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Передавать можно любыми функциями. Главное, чтобы Вы понимали, в каком виде передаете и в каком виде хотите принять.

tomas111
Offline
Зарегистрирован: 01.03.2018

Правильно я понимаю Serial.print = Serial.write?

tomas111
Offline
Зарегистрирован: 01.03.2018

Мне для веб страницы думаю будет идеально.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нет.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

tomas111 пишет:

Правильно я понимаю Serial.print = Serial.write?

Serial.write()

Функция передает данные как бинарный код через последовательное соединение. Данные посылаются как один или серия байтов. Для того, чтобы передать данные как символы следует использовать другую функцию print().

 

tomas111
Offline
Зарегистрирован: 01.03.2018

Понял, и теперь я столкнулся с такой проблемой, я в мониторе порта вижу русские буквы но при передачи в ESP я вижу: 

РЎРєРѕСЂРѕСЃС

Думаю что проблема для многих понятная, а для меня новая.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Самое простое решение - не использовать кириллицу.

Иначе придется разбираться с кодировками, а в Arduino IDE и в мониторе порта они разные. Следовательно, нужна перекодировка.

tomas111
Offline
Зарегистрирован: 01.03.2018

Я уже понял в чем дело. Разобрался. В целом что я хотел работает. Осталось теперь только красоту наводить. На самом деле плата нормальная, да с ней есть проблемы...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

tomas111 пишет:

Я уже понял в чем дело. Разобрался. В целом что я хотел работает. Осталось теперь только красоту наводить. На самом деле плата нормальная, да с ней есть проблемы...

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

tomas111
Offline
Зарегистрирован: 01.03.2018

У меня несколько вопросов:

1) Какую нормальную? Пример других плат? Я эту взял с али за 650 рублей с доставкой.

2) есть ограничения по длине на передачу данных? Я отправляю на ESP около 240 символов но вижу из них только последние около 100... Подозреваю что первые не доходят либо в строку не помещается ...

3) Какие есть функции по разделению строки?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

да любую ESP32, эту к примеру я брал 38 пиновые

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

tomas111 пишет:

2) есть ограничения по длине на передачу данных? Я отправляю на ESP около 240 символов но вижу из них только последние около 100... Подозреваю что первые не доходят либо в строку не помещается ...

Ограничений по длине ни на прием, ни на передачу данных нет.

А вот на хранение, - очевидно, есть.

Поэтому не нужно дожидаться, пока строка будет передана целиком, следует разбирать ее побайтно в процессе получения.

tomas111
Offline
Зарегистрирован: 01.03.2018

Спасибо за ссылку, очень понравилось! Это так же всё программировать через Arduino?
Адаптер есть в продаже, он для чего? Не совсем понимаю его роль, вроде и так есть интерфейс micro USB.

tomas111
Offline
Зарегистрирован: 01.03.2018

Значит строковых функций разделения нет? Или они может не удобные!?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

tomas111 пишет:

Спасибо за ссылку, очень понравилось! Это так же всё программировать через Arduino?
Адаптер есть в продаже, он для чего? Не совсем понимаю его роль, вроде и так есть интерфейс micro USB.

адаптер,чтобы собирать не на дюпонах, да, программируется через IDE

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

tomas111 пишет:

Значит строковых функций разделения нет? Или они может не удобные!?

Строковых функций много разных. Другое дело, что понятие, что следует считать строкой, в Си и Си++ разное. А Ардуино добавляет еще третий вид строки. Из-за чего, на мой взгляд, образуется некоторая путаница.

Я как-то задался целью установить, какова может быть наибольшая длина строки. У меня для этого есть достаточно внушительная электронная библиотека. Так вот, выяснилось, что максимальная длина строки из моей библиотеки составляет около 90 кбайт.

В esp32 оперативной памяти, конечно, больше. Но, тем не менее, не факт, что строка может целиком поместиться, скажем во входном (или выходном) буфере последовательного порта.

Поэтому я повторяю свою рекомендацию - не дожидаться приема строки целиком, а разбирать ее побайтно по мере прихода очередных символов.

tomas111
Offline
Зарегистрирован: 01.03.2018

Я понял, но может примером поделиться? как со строками так и с байтаи?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

В качестве источника примеров могу порекомендовать:

1. Учебники.

2. Интернет.

3. Платный раздел "Ищу исполнителя".

Именно в таком порядке приоритета.

 

PS. Да, на всякий случай: искать можно по словосочетанию "конечный автомат".

leonopulos
Offline
Зарегистрирован: 01.02.2022

Здравствуйте.

Я заказал такую же плату на алиэкспресс.

UNO должен будет работать с аналоговыми датчиками угарного газа и c датчиками температуры и влажности через I2C, а состояние датчиков я должен буду отслеживать через встроенный вебсервер.

Если я правильно понимаю, то я должен буду написать 2 скетча:

 - скетч вебсервера для ESP8266 с набором HTML страниц, CSS стилей и Javascript скриптов

- скетч для UNO, который будет будет собирать данные с датчиков

Эти два скетча должны будут общаться между собой по SPI интерфейсу.

Я все правильно понимаю?

UPD:

Прочел весь тред внимательно и понял, что между атмегой и ЕСП используется СОМ-порт и пересылка данных идет через класс Serial.

Платка приедет - буду пробовать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SPI не лучший вариант для общения между контроллерами. Насколько я помню, в Ардуино вообще поддерживается только SPI master. Последовательный порт - да, подходит.

И, кстати, зачем Вам Уно? Почему не сделать все на esp8266?

tomas111
Offline
Зарегистрирован: 01.03.2018

Да всё верно. Но лучше сделай сразу всё на ESP. Будет проще и удобнее.

leonopulos
Offline
Зарегистрирован: 01.02.2022

Нашел эту плату. А там и Uno и ESP.

Спасибо за ответы.
Как приедет, попробую все на ESP сделать.