ARDUINO проблемы с serial

kgjhkldcfkjhof

✩✩✩✩✩✩✩
27 Мар 2020
4
0
Решил я сделать будильник с функциями:
♦ Отображения времени и другой информации на lcd2004
♦Синхронизации времени ds3231m с timeserver
♦вывода погоды и т.д. с openweather
♦вывода показаний с bme 280
♦вывода показаний с ds18b20
♦пищание активным зуммером
Делать собираюсь на Arduino Leonardo с wifi-шилдом на esp8266. Передача данных между шилдом и дуиной должна осуществляться через Serial. С Serial я никогда не работал - не было необходимости. Везде пишут, что serial читает только дин байт. Я решил это проверить наскоро написав такой скетч
C++:
void setup() {
  Serial.begin(9600);
  Serial.print("start");
}

void loop() {
 
if(Serial.available() >= 1){
Serial.println("ressived    ");
Serial.println(Serial.read());

}}
При вводе в монитор порта чисел и английских букв выводился всякий бред:
ввожу выдаёт
1 49
2 50
3 51
4 52
51 53;49
a 97
b 98
c 99


Будет ли передаваемая информация так коверкаться при передаче с пердуины на шилд и обратно? Если да, то как это исправить?
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
читает буфер какого-то размера, а не байт
водиш ты аски символы, а терминал тебе выдает аски код
терминал должен понимать, в каком формате он должен отображать цифры, а ардуиновский терминал это не понимает
в нормальных терминалах есть переключатель и там есть формат ascii

чтобы твой код работал, то надо сконвертировать при помощи функции initeger to ascii
Serial.println(itoa(Serial.read()));
 

kgjhkldcfkjhof

✩✩✩✩✩✩✩
27 Мар 2020
4
0
читает буфер какого-то размера, а не байт
водиш ты аски символы, а терминал тебе выдает аски код
терминал должен понимать, в каком формате он должен отображать цифры, а ардуиновский терминал это не понимает
в нормальных терминалах есть переключатель и там есть формат ascii

чтобы твой код работал, то надо сконвертировать при помощи функции initeger to ascii
Serial.println(itoa(Serial.read()));
то есть при передаче между ардуино и шилдом этой хрени не будет?
Буфер может быть любого размера?
Если по сериал на ардуино отправить "2020,03,03,17,26,15" (т.е. Serial.println("2020,03,03,17,26,15")
то можно будет ли это применить DS3231M.adjust(DateTime(Serial.read());
описание функции adjust
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
то есть при передаче между ардуино и шилдом этой хрени не будет?
смотря как будет устроено все
где-то надо слать байты, где-то аски

Буфер может быть любого размера?
буфер всегда ограничен размером озу и по дефолту где-то определен в исходниках файла сериал, точно не помню размер, но вроде 64 байта

Если по сериал на ардуино отправить "2020,03,03,17,26,15" (т.е. Serial.println("2020,03,03,17,26,15")
принтлн добавляет в конец символ \n для перевода строки вниз, что может вызвать ошибку
лучше сразу слать serial.print(""2017-08-05 18:19:20"") в таком формате
вроде как функция установки времени ожидает данные в таком формате и проще сформировать сразу такую строку на передающей стороне, чем на приемной использовать еще одну функцию и тратить память

собственно что ты хочеш сделать - делается на одной 8266
если применить flprog, то делается вообще без строчки кода минут за 10
да и при наличии сети там отдельная мелкасхема часов не нужна
 

kgjhkldcfkjhof

✩✩✩✩✩✩✩
27 Мар 2020
4
0
смотря как будет устроено все
где-то надо слать байты, где-то аски


буфер всегда ограничен размером озу и по дефолту где-то определен в исходниках файла сериал, точно не помню размер, но вроде 64 байта


принтлн добавляет в конец символ \n для перевода строки вниз, что может вызвать ошибку
лучше сразу слать serial.print(""2017-08-05 18:19:20"") в таком формате
вроде как функция установки времени ожидает данные в таком формате и проще сформировать сразу такую строку на передающей стороне, чем на приемной использовать еще одну функцию и тратить память

собственно что ты хочеш сделать - делается на одной 8266
если применить flprog, то делается вообще без строчки кода минут за 10
да и при наличии сети там отдельная мелкасхема часов не нужна
Время с инетом будет синхронизироваться один раз - только после успешного старта. Проблему я буду рещать так: ардуино отправляет запрос на получение текущего года и ждёт ответа, esp отвечает либо год либо 0(ошибка соединения), ардуино сохраняет год в переменную и запрашивает месяц , esp отправляет месяц ........ из переменных всё отправляется на ds3231m.
Только на esp сделать не смогу. Причины:
•3,3в логика
• может не хватить памяти и производительности(моя ещё не законченная прошивка занимает 68% памяти Leonardo(ещё не знаю сколько будет занимать прошивка для esp) (в прошивку esp я планирую добавить deauther, управление которым будет осуществляться с будильника т.е. придётся модифицировать библиотеки deauther и добавлять отправку get запросов на timeserver и openweathermap )
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
Время с инетом будет синхронизироваться один раз - только после успешного старта.
ты можеш это делать хоть раз в минуту
на есп уход времени за год это 274 секунды где-то и это можно скорректировать в прошивке
https://www.instructables.com/id/TESTED-Timekeeping-on-ESP8266-Arduino-Uno-WITHOUT-/

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

 

kgjhkldcfkjhof

✩✩✩✩✩✩✩
27 Мар 2020
4
0
@kalobyte, мне и так надо с библиотеками возиться, чтобы поменять управление с кнопок и oled дисплея обычного deauther на управление по serial. Если делать всё только на esp то придётся переписывать все 288 строчек кода (это ещё не законченый код) под esp, много изменять, но толку от этого почти не будет - избавлюсь только от serial.

памяти и так не хватает :
Скетч использует 704386 байт (92%) памяти устройства. Всего доступно 761840 байт.
Глобальные переменные используют 42768 байт (52%) динамической памяти, оставляя 39152 байт для локальных переменных. Максимум: 81920 байт.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
145
памяти и так не хватает :
так это не память есп же
у меня есть на есп8266 гирлянда адресных светодиодов и с кучей эффектов, которые переключаются через вебморду и еще там можно накрутить любой цвет и яркость руками + там портал для настройки беспроводного соединения
и все это влезло спокойно в память
а там куча хтмл, цсс и яваскрипта

но толку от этого почти не будет - избавлюсь только от serial.
твой будильник реализуется за 1-2 часа без единой строчки кода при помощи флпрог и всего лиш на одной есп8266
a.png

например вот так выглядят часы, которые отображают время на вот такой платке



а вот проект термометра, который измеряет температуру и меняет цвет в зависимости от нее + работает это только когда освещение ниже установленного

b.png