оптимизация кода
- Войдите на сайт для отправки комментариев
Сб, 10/08/2019 - 09:28
Всем привет, я недавно начал осваивать програмирование, имею арудино нано на ат158, и делаю часы/альтиметр/барометр/температуру в авто, столкунлся с тем что мне не хватает памяти для всего, либо я могу вывести на экран позанания датчика bme280, а время останется не задействованным, либо время без показания датчика, при этом у меня остается не реализованным управление настройкой времени через 2 кнопки.
вопрос такой, ткните меня в ошибки и подскажите как можно уменьшить вес библиотек не испортив ничего
#include <Wire.h> #include <SPI.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); #include <iarduino_RTC.h> //библиотека часов iarduino_RTC time (RTC_DS3231); // объявляем переменную time для работы с библиотекой, указывая название модуля RTC_DS3231 #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; int last_time; //потому что значение инт от -32к до +32к void setup() { lcd.init(); lcd.backlight(); lcd.clear(); bool status; status = bme.begin(); } void loop() { lcd.setCursor(0, 0); lcd.print("JEEP GRAND CHEROKEE"); lcd.setCursor(0, 1); //if (millis() % 1000 == 0) { // Если прошла 1 секунда //lcd.print(time.gettime("d-m-Y, H:i:s, D")); // Выводим время. //delay(1); // Приостанавливаем скетч на 1 мс, чтоб не выводить время несколько раз за 1мс. //} if (millis() - last_time > 1000) { last_time = millis(); printValues(); } } void printValues() { lcd.setCursor(0, 2); lcd.print("Tempe="); lcd.print(round(bme.readTemperature())); lcd.println("C "); lcd.setCursor(10, 2); lcd.print("Davl="); lcd.print(round(bme.readPressure() / 100.0F * 0.750062F)); lcd.println("mm"); lcd.setCursor(0, 3); lcd.print("Viso="); lcd.print(round(bme.readAltitude(SEALEVELPRESSURE_HPA))); lcd.print("m"); lcd.setCursor(10, 3); lcd.print("Vlazh="); lcd.print(round(bme.readHumidity())); lcd.println("% "); }
Для начала уточните, что у Вас за контроллер, т.к. указанного Вами
ат158,
я не знаю, и микрочип тоже не знает.
ткните меня в ошибки
В ошибки Вы сами должны нас ткнуть, т.е. описать что Вам не нравится и задать конкретный вопрос. Пока я вижу одну глобальную ошибку - использование напрочь кривой библиотеки iarduino_RTC. Бросьте каку и не хватайте руками всё, что на улице валяется.
как можно уменьшить вес библиотек не испортив ничего
Задача неясна. До какого предела уменьшить? Сейчас скетч занимает 12к, а сколько надо? Вы уж определитесь и задавайте вопрос поконкретнее.
Можно взять нану на ат318, там памяти больше
Это точно. А на 381 - ещё шибчее :)
Для начала уточните, что у Вас за контроллер, т.к. указанного Вами
ат158,
я не знаю, и микрочип тоже не знает.
ткните меня в ошибки
В ошибки Вы сами должны нас ткнуть, т.е. описать что Вам не нравится и задать конкретный вопрос. Пока я вижу одну глобальную ошибку - использование напрочь кривой библиотеки iarduino_RTC. Бросьте каку и не хватайте руками всё, что на улице валяется.
как можно уменьшить вес библиотек не испортив ничего
Задача неясна. До какого предела уменьшить? Сейчас скетч занимает 12к, а сколько надо? Вы уж определитесь и задавайте вопрос поконкретнее.
Сорян, ошибся, ATMega168, основной вопрос в весе, у меня есть всего 14к, при инициализации часов вес кода переваливает за 15к, соотвественно ниего не выходит сделать. Так вот вопрос это как уменьшить вес кода?
Библиотеку часов заменю. Спасибо
Это точно. А на 381 - ещё шибчее :)
Да это моя первая ошибка, не правльный выбор платы
В общем удалось мне установить все что я хотел, даже осталось место для реализации кнопок, только теперь столкнулся с такой проблемой, на фото видно, экран обновляется многократно и выводит полосы в 2 ячейки, не могу понять как мне это убрать, через миллис не могу остановить обновление экрана, так же еще вопрос, какой командой вывести формат времени "09:05" а не "9:5"
через миллис не могу остановить обновление экрана,
В строке №16 написано в чём проблема, нужно просто прочитать и исправить.
какой командой вывести формат времени "09:05" а не "9:5"
Есть 100500 вариантов. Например, можно воспользоваться sprintf или даже printf настроить.
Но если с памятью проблемы, то можно if'ом разбирать нужет там 0 или нет.
через миллис не могу остановить обновление экрана,
В строке №16 написано в чём проблема, нужно просто прочитать и исправить.
какой командой вывести формат времени "09:05" а не "9:5"
Есть 100500 вариантов. Например, можно воспользоваться sprintf или даже printf настроить.
Но если с памятью проблемы, то можно if'ом разбирать нужет там 0 или нет.
После замены библиотеки, по вашему совету, у меня повилось место на плате, сейчас используется 88%. буду пробовать, спасибо
После замены библиотеки, по вашему совету, у меня повилось место на плате
Это очень сильное колдунство :)
через миллис не могу остановить обновление экрана,
В строке №16 написано в чём проблема, нужно просто прочитать и исправить.
Заменил int на unsigned lond
если я через миллис торможу обновление экрана, тогда у меня полоски весят все время до обновления, потом показывается время и все проворяется, то есть они присутствуют всегда, я пробовл ставить обноление раз в минуту и тогда отчетливо все видно. если убираю милллис из кода на время, то тогда цифра висит и моргает еле видными полосками. я не могу понять почему полосы воообще не уходят, как-будто они в скетче прописаны
какой командой вывести формат времени "09:05" а не "9:5"
Есть 100500 вариантов. Например, можно воспользоваться sprintf или даже printf настроить.
Но если с памятью проблемы, то можно if'ом разбирать нужет там 0 или нет.
Сделал через IF, вроде получилось, другие команды мне показались массивными по коду
После замены библиотеки, по вашему совету, у меня повилось место на плате
Это очень сильное колдунство :)
на уровне с хогвартсем )))
я не могу потому никогда раньше програмированием не занимался.
вот код. надеюсь на помощь
вот код.
А полоски где?
вот код.
А полоски где?
Вот это фото уже было, с того момента скетч чуть изменился, но полосы на часах так же держатся, причем при уменьшении колличества обновлений экрана они становятся только четче, и обратно, если оставить обновление как есть, каждую секунду то их не так честко видно, больше выглядят как моргание цыфрой
--Доктор! Что со мной такое - куда ни ткну пальцем - больно?! И в ногу ткну - больно, и в руку, и в голову!
--Мил человек, да у вас палец сломан.
--------
Это я к тому, что стоит попробовать экран поменять. ;)))))
--Доктор! Что со мной такое - куда ни ткну пальцем - больно?! И в ногу ткну - больно, и в руку, и в голову!
--Мил человек, да у вас палец сломан.
--------
Это я к тому, что стоит попробовать экран поменять. ;)))))
тут скорее всего ручки из жопки ))
Ну правильная была мысль обновлять время с интервалом и
lcd.setCursor(0,0);
lcd.print(
"JEEP GRAND CHEROKEE"
);
Ну правильная была мысль обновлять время с интервалом и
lcd.setCursor(0,0);
lcd.print(
"JEEP GRAND CHEROKEE"
);
если ставлю надпись в setup то происходит следующее
Еще вопросик, я хотел вот этим кодом управлять настройкой времени чтобы не тащить комп к авто, код взят с https://lesson.iarduino.ru/page/urok-17-podklyuchenie-rtc-chasy-realnogo-vremeni-s-knopkami/ и "адаптирован" под мои команды, вопрос в том что я ничего не понимаю в настройке кнопок и логике работы, и в принцепе в логике работы этого кода, если у вас есть рабочик код настройки времени с 2 кнопок поделитесь плиз либо помогите мне написать его
http://arduino.ru/forum/obshchii/attiny85-i-posledovatelnyi-port#comment...
Вот здесь я привел программу часов с настройкой времени с помощью одной кнопки. И будильника с помощью другой.
Очень похоже что датчик bme280 дает артефакты на экран, потому что при работе только с экраном и временем ничего не моргало. и никаких полос в пустых строках не было. получатеся на датчик bme кривая библиотека? и какой командой можно заставить время мигать при настройке? now.blinktime пробовал выдает ошибку что не определен оператор. код для понимания процесса, пробую отдельно написать упраление кнопками, чтобы потом встроих их в основной скеч, до конца он еще не написан, но даже это заставить работать пока не получается.
и какой командой можно заставить время мигать при настройке?
Там вроде только курсор может мигать, а если хотите текст - мигайте им сами (очищайте и выводите по интервалам millis()).
http://www.dinceraydin.com/lcd/commands.htm
Да ему не погасить экран надо (без очистки) а Turn on visible blinking-block cursor
Сорри. Что-то у меня аллергия на бессмысленные вопросы в последнее время наблюдается - понять их не получается.
Мне кажется автор хочет сделать как часто в других девайсах со временем - чтобы при установке изменяемое число мигало, не курсор.
Если курсор полноразмерный (5х7), во всё знакоместо, то им можно мигать в изменяемой позиции, и просто и наглядно. (Я всегда так делаю)
Мне кажется автор хочет сделать как часто в других девайсах со временем - чтобы при установке изменяемое число мигало, не курсор.
Именно так я и хочу сделать
Сорри. Что-то у меня аллергия на бессмысленные вопросы в последнее время наблюдается - понять их не получается.
Вроде по максимуму конкретизировал вопрос, и в скетче сделал кучу пометок что и как хочу чтобы полнятно было
Если курсор полноразмерный (5х7), во всё знакоместо, то им можно мигать в изменяемой позиции, и просто и наглядно. (Я всегда так делаю)
У вас уже есть реализованная настройка часов на кнопках? можете код показать?
У вас уже есть реализованная настройка часов на кнопках?
Есть.
можете код показать?
Нет.
Валерич-тех. Что Вам мешает поискать на форуме решения для меню.
Ну ладно бы хоть какие то телодвижения Валерич делал - тогда и не жалко... А так, дай да дай... Стыдоба то какая.(
А вам пряма жалка чилавеку памочь!
А вот есть такая гнильца характера, чего уж тут...( Да и много тут всяких хитрожопых поразвелось, любителей лохов, понимаешь ли.)
А вот есть такая гнильца характера, чего уж тут...( Да и много тут всяких хитрожопых поразвелось, любителей лохов, понимаешь ли.)
я же не прошу за меня написать код. или что-то сделать за меня, тем более какие-то из своих новых открытий выкладываю сюда и вот стоило спросить про управление кнопками как сразу хитрожопый. и ничего что я б. до этого дойти своей головой пока еще не могу
Я понял что рано мне еще меню осваивать, так как уже несколько дней не могу напряму с кнопок время менять, какой командой в библиотеке rtclib просходит управление настройкой времени, не при компиляции скетча.. Еще прикол в том что команды типи now.isrunning| now.timestamp| now.toString (пытался пробовать все, чтобы хоть что-то куда-то двигалось) компилятор выдает что не объявлено значение now, хотя в loop все объявлено. Толи я дурак, то ли лыжи не едут. Какой командой меняется время на модуле ?
ПС смотри коментарии в скетче
Вот посмотрите, простенький примерчик работы с RTC без библиотек. Установка и вывод времени идет через монитор.
По нему можно разобраться с работой с RTC
Какую в точности библиотеку используете ? Я две наугад тыкнул в стандартном менеджере библиотек по отбору rtclib - не подходят, там все названия похожие.
Если Вы про скетч из #39, то там нет никакого loop, т.к. у того, что Вы планировали как loop, не закрыта фигурная скобка.
Толи я дурак, то ли лыжи не едут.
В случаях с компилятором - обычно первое. Всегда исходите из этого и ищите проблему у себя. Чтобы компилятор косячил - очень редкие случаи.
Я понял что рано мне еще меню осваивать
Правильно поняли. Начните с K&R. До меню доберётсь где-то через год. Но уже с понимаем и знаниями, как мужчина, а не как мартышка с очками.
Какую в точности библиотеку используете ? Я две наугад тыкнул в стандартном менеджере библиотек по отбору rtclib - не подходят, там все названия похожие.
https://github.com/adafruit/RTClib эту использую
Если долго мучиться, что-нибудь получится....
Почему ардуино не записывает новое значение времени в rtc, при чем дата устанавливается (спецом сентябрь поставл, для проверки, все идет кроме времени) и еще, почему дни недели стали выводиться цифрами, а не буквами то есть сейчас у меня горит 328 постоянно на lcd, хотя раньше, до того как перевел отслеживание времени в отдельную функцию все показывало четко
есть коментарии с описанием и вопросами.
А чего вы ждете, выводя на LCD переменную типа int - не цифр, а пряников?
Если долго мучиться, что-нибудь получится....
Валерич, кончайте уже идиотизмом страдать. За то время, пока вы трахаетесь с несколькими строчками кода - давно бы уже учебник по языку прочитали.
По поводу дней недели - сравните как вы их выводили на монитор в скетчах в начале темы - и попытайтесь понять разницу. Там было правильно, теперь -нет
Если долго мучиться, что-нибудь получится....
Валерич, кончайте уже идиотизмом страдать. За то время, пока вы трахаетесь с несколькими строчками кода - давно бы уже учебник по языку прочитали.
Бесконечно читать можно про прогрмирование, этим я и знамаюсь, но только время отведенное на это все 2 часа максимум в день. так что много не начитаешься, единственное с чем я действительно сейчас мучаюсь это с тем что rtc перезаписать не удается. но это дело поправиться когда пойму что к чему.
[/quote]
По поводу дней недели - сравните как вы их выводили на монитор в скетчах в начале темы - и попытайтесь понять разницу. Там было правильно, теперь -нет
[/quote]
так вот я сейчас использую тот что работает (старый) + основной вопрос все же про модуль времени и команду rtc.adjust
Все те кто пользуются библиотекой не знают как она устроена, тем более для rst . Надо разумеется залезть в нее и прочитать. А там как минимум два класса. И это даже не библиотека для лсд.
ПС: соберите это устройство , залейте программу и понаблюдайте работу. #84 Это позволит вам сэкономить немного времени для понимания и обучения.
Я наконец-то понял как заставить дуинку писать время в rtc и настраивать его с кнопок, оказалось что в loop жестко задается значения и по этому не записывалось ничего(это я для себя добавил, вы то уже 100% это все знаете). одна осталось проблема. чтобы видеть какие цифры будут выводиться после записи мне необходимо сейчас отдельно на экране выводить минуты. Где в коде проблема, почему не обновляется время без всяких доп цифр на экране ( см ссылки )
КАК ПРИХОДИТСЯ УСТАНАВЛИВАТЬ ЧТОБЫ ВИДЕТЬ МИНУТЫ
ПОСЛЕ ОБНОВЛЕНИЯ ВРЕМЕНИ