Проблема с кодом
- Войдите на сайт для отправки комментариев
Чт, 11/03/2021 - 09:38
Здравствуйте форумчане!
Собрал одометр по счетчику нажатий кнопок на ардуино. Кнопок две. Счетчик работает, но при мониторинге счетчик начинает с нуля. Т.е. когда ардуино подключен к бп и подключаю телефон для мониторинга, то предыдущие значения обнуляются и начинается всё заного. При подключении к компьютеру и включении Мониторг порта в Arduino IDE так же самая история. Предназначение устройства, поставить на ночь ардуино и считать пробег, утром подключить телефон и посмотреть результат.
const int rt = 200; const int buttonPin = 5; // кнопка (1) const int button1Pin = 6; //кнопка (2) bool button_old = 1; // предыдущее значение button0 bool button1_old = 1; // предыдущее значение button1 int count = 0; // переменная для подсчета нажатий на кнопку float rast_m = 0; // переменная для подсчета расстояния в метрах int rast_km = 0; // переменная для подсчета расстояния в километрах void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT_PULLUP); pinMode(button1Pin, INPUT_PULLUP); } void loop() { bool button = digitalRead(buttonPin); if (!button && button_old) { button_old = 0; delay(rt);// ждем чтобы дребезг прошел count = count + 1; //Serial.println(count); rast_m = count * 2 * 3.14 * 89 / 1000 ; Serial.print("Пробежал "); Serial.print(rast_m ); Serial.print(" м. или "); Serial.print(rast_km); Serial.println(" км."); } if (button && !button_old) { button_old = 1; delay(rt);// ждем чтобы дребезг прошел } bool button1 = digitalRead(button1Pin); if (!button1 && button1_old) { button1_old = 0; delay(rt);// ждем чтобы дребезг прошел count = count + 1; //Serial.println(count); rast_m = count * 2 * 3.14 * 89 / 1000; //Serial.println(rast_m; "m ili"; rast_km; "km"); Serial.print("Пробежал "); Serial.print(rast_m ); Serial.print(" м. или "); Serial.print(rast_km); Serial.println(" км."); } if (button1 && !button1_old) { button1_old = 1; delay(rt);// ждем чтобы дребезг прошел } }
Что в этом удивительного? Когда компьютер выключаете/включаете - он тоже всё с начала начинает.
Все правильно, если данные не сохранены в EEPROM, то после отключения питания они исчезают ))
А то что при подключении к компорту происходит перезагрузка Ардуино, за это спасибо преобразователю usb-ttl скажите.
Рекомендации по лечению ищите в сети.
еепром хорошая весч
Можно перейти на ESP. Там ничего не перезагружается. Но EEPROM, разумеется, никто не отменял при этом. Только надо понять, как часто его теребонькать придется новыми значениями. Можно длинный кольцевой буфер запилить на весь размер
если точность не критична, то может сохранять в еепром каждые 10 или 100 оборотов?
тоже такая идея была, шоб не изнашивать одну ячейку памяти частой перезаписью, писать каждый раз в следующий адрес, но как тогда после перезагрузки сообщить ардуинке на каком остановились?
Помогите чайнику при проверке кода выдается ошибка:
Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"
Изменена опция сборки, пересобираем все
inkubator.ino: In function 'void loop()':
inkubator:191: error: 'EEPROM_read' was not declared in this scope
inkubator.ino: In function 'void startInk()':
inkubator:275: error: 'EEPROM_read' was not declared in this scope
inkubator:287: error: 'EEPROM_write' was not declared in this scope
inkubator:291: error: 'EEPROM_write' was not declared in this scope
inkubator.ino: In function 'void bird_setup()':
inkubator:322: error: 'EEPROM_read' was not declared in this scope
inkubator:331: error: 'EEPROM_write' was not declared in this scope
и так далее оп всему скетчу.
Где и как объявить ? Приведу кусочек где ругается:
SerialReceive();
тоже такая идея была, шоб не изнашивать одну ячейку памяти частой перезаписью, писать каждый раз в следующий адрес, но как тогда после перезагрузки сообщить ардуинке на каком остановились?
Если, как у ТСа, нужно хранить один единственный уинт32 - уапще легко! Быстро пробежаться на старте по килобайту и найти ячейку с содержимым !=0 вопрос пары сотен миллис.
Быстренько, пока старшие веки не разлепили на этот ужас, поправьте сообщение в соответствии с правилами вставки кода. Код отдельно, письмо от компилатора отдельно
Код:
Вавена
Код по правилам! Правила прилеплены в песочнице. Такую простыню под кат!
Вавена, молодца! Вот только почему у меня стойкое ощущение, что этот код с этой же простыней ошибок компиляции я сегодня уже видел в другой теме?
сообщение компилятора:
Значит следующий адрес пишем, предыдущий обнуляем? Итого, можно уменьшить износ на 1024/4/2= 128 раз?
То все мое. Выполняю действия с скейтчем как на смайлике, что мог перепробывал. Уроки всякие смотрел ( от Гувера и др). Может кто то пантокрина в ветвистые добавит.
Значит следующий адрес пишем, предыдущий обнуляем? Итого, можно уменьшить износ на 1024/4/2= 128 раз?
Ну да. Если нужно всего 1 переменную хранить и не хочется заморачиваться подключением "вечной" i2c fram
Вавена, не стоит во все темы одно и то-же писать.
По вашему вопросу я бы может и подсказал чего полезного, но я не имел дела с библиотекой EEPROM2.h и х/з чем она отличается от нормальной EEPROM.h. Или вы по ошибке двойку впендюрили?
Значит следующий адрес пишем, предыдущий обнуляем? Итого, можно уменьшить износ на 1024/4/2= 128 раз?
Ну да. Если нужно всего 1 переменную хранить и не хочется заморачиваться подключением "вечной" i2c fram
Двойной износ - сначала записать, потом стереть. Лучше уж, как предлагал один скандалист, найти ячейку с максимальным значением. Но кольцевая запись оставляет открытым вопрос контроля количества записей в ячейку
Двойной износ - сначала записаать, потом стереть. Лучше уж, как предлагал один скандалист, найти ячейку с максимальным значением. Но кольцевая запись оставляет открытым вопрос контроля количества записей в ячейку
Как вариант. Я знал, что умные люди подскажут боле изящное решение. При условии, что прееменная без вариантов инкрементируется. А контроль количества записей, как я уже говорил, радикально решается только заменой AT24 на FM24.
А контроль количества записей, как я уже говорил, радикально решается только заменой AT24 на FM24.
А при такой замене заморачиваться с кольцевой записью вообще не имеет смысла ))
А при такой замене заморачиваться с кольцевой записью вообще не имеет смысла ))
Таки, а я за шо? ))
Что в этом удивительного? Когда компьютер выключаете/включаете - он тоже всё с начала начинает.
не всегда, у меня обычный системник на 7-ке засыпает как ноут )))
На самом интересном электрики сеть ремонтировать начали, поэтому пишу с опозданием.
Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.
На самом интересном электрики сеть ремонтировать начали, поэтому пишу с опозданием.
Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.
На самом интересном электрики сеть ремонтировать начали, поэтому пишу с опозданием.
Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.
привет. научи меня писать такой сложный код :)
Не смейся, тут до соплей обидно. Структуру программы еще как то может смогу начертать. а в программировании я полный чайник пока, в свои 67 на базе информатики 80-х не очень прыткий в освоении.
Не смейся, тут до соплей обидно. Структуру программы еще как то может смогу начертать. а в программировании я полный чайник пока, в свои 67 на базе информатики 80-х не очень прыткий в освоении.
ну может лучше самому написать код. я на него тоже смотрю и ничего не понимаю )
В таком попробуй еще разобраться. Наверное что то с библиотеками не то
Вавена
Не знаю, что там за библиотеки, но лучше пойти простым путем и переписать все под стандартную EEPROM.h , которая поставляется в комплекте IDE. Её подробное описание есть в интернетах. Или попробуйте написать правильно:
В любом случае, курите исходник библиотеки, которую пытаетесь подключить
Спасибо Всем за отклик на проблему!.
Разницы нет, EEPROM.h с двойкой или без двойки, компилятор матерится одинаково.
так тут дело не только в том, что библиотека не та и операторы не определены. Тут и код работы с ЕЕПРОМ написан в принципе неверно, так что какую библиотеку не поставь - скетч правильно не заработает.
У вас в коде вы оператором EEPROM_write() пишете все подряд - и байт, и инт, и флоат. Совершенно не думая о том, что для байта нужна одна ячейка, для инта - две, а для флоат - 4.
Rumata, b707 спасибо за помощь, с "шашкой наголо" не удалось. Сяду за буквари, попробую переписать под <avr/eeprom.h>, Гувер на уроках то же пишет, что она хорошо работает.
Даст Бог управит меня в этом нелегком труде, отпишусь о результатах.
Rumata, b707 спасибо за помощь, с "шашкой наголо" не удалось. Сяду за буквари, попробую переписать под
Для первого приближения вы бы лучше со стандартной библой EEPROM.h освоились. Она очень простая - грубо говоря, всего три метода на запись и два на чтение. И главное, она достаточно неплохо документирована для начинающих и IDE из коробки содержит 8 вменяемых примеров на все случаи жизни (Файл -> Примеры -> EEPROM)
Для первого приближения вы бы лучше со стандартной библой EEPROM.h освоились.
Поддерживаю.
И категорически не советую изучать EEPROM.h по урокам гайвера. Вообще он обычно для новичков обьясняет неплохо, но вот как раз о ЕЕПРОМ у него наворочено такое, что опытный запутается. Он зачем-то смешивает библиотеки из комплекта ардуино, авр-студии и еще какую-то свою, в лучших традициях "самую удобную и эффективную", а на деле кривую и с кучей глюков.
Спасибо ребята за подсказки, что указали тропинку к знаниям и подняли дух, а то руки опускаются и я "танцы с бубном в лесу" выполнял бы.
Как с помощью "char" на ЛСД экране показать знак градуса в коде ASCII :
макет выдает ошибку: Arduino: 1.6.4 (Windows 7), Плата"Arduino Uno"
ikubator: 472: ошибка: ожидалось первичное выражение перед 'char'
ожидаемое первичное выражение перед 'char'. Че туда вставить надо?! Плиз.
Оно?
Как с помощью "char" на ЛСД экране показать знак градуса в коде ASCII :
lcd.print((char) 247);
Наверное оно, так теперь вылезло другое:
463 if (button_minus) {
Пишет: C:\Users\merga\Documents\Arduino\libraries\RTClib\RTClib.cpp: In member function 'char*
DateTime::toString(char*)':
C:\Users\merga\Documents\Arduino\libraries\RTClib\RTClib.cpp:467:32: error: 'nullptr' was not
declared in this scope
(strstr(buffer, "ap") != nullptr) || (strstr(buffer, "AP") != nullptr);
^
Гугл пепревел: C: \ Users \ merga \ Documents \ Arduino \ libraries \ RTClib \ RTClib.cpp: в функции-члене 'char * DateTime :: toString (char *)':
C: \ Users \ merga \ Documents \ Arduino \ libraries \ RTClib \ RTClib.cpp: 467: 32: ошибка: 'nullptr' не был объявлен в этой области
(strstr (buffer, "ap")! = nullptr) || (strstr (буфер, "AP")! = nullptr);
^
Ошибка компиляции. Не пойму причем здесь библиотека часов?
Эти ошибки не имеют отношения к выводу символа.
Если хотите помощи - выкладывайте код целиком и вставляйте его в сообщение правильно.
Коллеги, предлагаю дальше без кода не отвечать.
Собрался проверить экран, заблудился в 3 соснах, при загрузке экран остается чистым, в лучшем случае может выдать начальные буквы. "Ткните носом", что не так?
Собрался проверить экран, заблудился в 3 соснах, при загрузке экран остается чистым, в лучшем случае может выдать начальные буквы. "Ткните носом", что не так?
Всё так в программе. Скорее всего проблема с "железом". Где-то непропай. И еще - покрутите резистор на плате - бывает помогает. И проверьте адрес прибора (паранойя, конечно, но мало ли). И на всякий случай добавьте после begin()
Ответ на мои посты #22,25,34,37 - версию ИДЕ 1.6.4 сменил на 1.8.11 все ушло, скетч нормально компилируется и заливается.
Ответ на пост #39 - добавил -lcd.clear(); и функцию - lcd.begin() изменил - lcd.begin(20,4). Экран начал нормально работать. Написал для таких чайников как я.