Ардуино как устранить мигание дисплея

Обновлено: 04.07.2024

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

dmmmit

Здравствуйте, начал увлекаться ардуино. Хочу сделать метеостанцию + управление реле с помощью ИК.
Управление релешками с помощью ИК уже сделал, все работает окей! Есть у меня датчик BME280(давление,влажность,температура,относ.высота) будет у меня на улице стоять. Хочу сделать вывод информации с него на дисплей.
Сначала выводятся температура и влажность, через пять секунд выводится давление и высота. С delay все это получилось, но хочу добавить кнопку, нажав на которую будет показывать информация с других датчиков. Как мне добавить в работу millis??
Делал такой вариант, но инфа выводится на дисплей и сразу же потухает и так каждые пять секунд.
Целый день сегодня ищу инфу по поводу этого, в итоге ничего. Помогите пожалуйста начинающему школьнику-ардуинщику, дайте хотя бы наводки какие-нибудь, буду очень благодарен.
P.S Пробовал разными способами сделать вывод инфы : делать вывод другой информации с датчиков через 10 секунд, и чтобы сначала просто выводилась Температура и влажность, а потом используя millis через 5 сек давление и высота - безуспешно, показывается какая-то ерунда.

Wan-Derer

@dmmmit, Во-первых, у тебя IF не закрыт фигурной скобкой. А во-вторых, ты не показал второй блок, который выводит показания давления и высоты.
А потом возьми и представь себя компьютером. который совсем не понимает чего хочет от него человек, а просто исполняет программу, строчка за строчкой. Пройди по программе с карандашиком и пойми где что не так.

dmmmit

это изначальный код с delay. Когда решил добавить кнопку начал куда-то приписывать
if (millis() - time > 5000)

time = millis();
, но ничего не выходило. В инете нужной инфы не нашел, там только как просто вывести например в Serial, а как вывести и оставить на 5 сек нету.

Wan-Derer

@dmmmit, не надо с делэй. Мы же не его обсуждаем. Давай тот код, который должен работать и описание как он по-твоему должен работать (но не работает)

dmmmit

Первые пять секунд после запуска выводит температуру и влажность. Затем начинает выводить два значения и из-за этого текст на экране просто мигает. Мне нужно сделать так: после включения Ардуино выводились показания температуры и влажности на дисплей, затем через пять секунд выводилось давление и высота. И так каждые пять секунд. Нужно сделать именно с millis. Т.к в дальнейшем хочу добавить кнопку и другие датчики. В интернете информацию нашел только по поводу вывода в Сериал, а мне нужно на экран + чтобы вывелась, ждала 5 сек и только потом менялась
P.S Извиняюсь за долгий ответ.

Wan-Derer

@dmmmit, представь себя процессором и пройди по своей программе. Увидишь где ошибка

dmmmit

@Wan-Derer Уже проходился, и не раз. вот в этом коде сделал так как думаю. Хотелось бы хоть узнать где ошибка

Wan-Derer

@dmmmit, Ну подумай что случится с твоими IF через 5 и через 10 сек
А чтобы экран не мельтешил, избегай lcd.clear(); внутри циклически повторяющегося вывода.

SergeySAS

Я бы выделил отдельные функции что-то типа ShowTemperatureAndHumidity(), ShowPressureAndAltitude().
В них уйдут все твои print и основной код займет 5 строк.
Далее в loop ввел бы стандартную state машину. Т.е. ввел переменную режим работы и по ней switch.
А вот эту переменную уже и меняй как угодно. хоть по delay(), хоть по millis().
Получится примерно так:

dmmmit

@SergeySAS Спасибо огромное. в Скором времени попробую код и напишу как что получилось. )))

MbIKOLA

Здравствуйте.
Ивините что пишу сюда не хочу новую тему создавать идентичную.
У меня такая же ситуация с LCD и millis() только мне надо чтоб на экран с интервалом 5 секунд выдавало с 5 датчиков.
Ваш код работает но на LCD выводить только показание с 2 датчиков те что стоят в первой очереди
case 0 и case 1 и так по кругу хотя все case 2,3,4 сделано по аналоги c case 0,1

switch(CurrState) case 0: ShowTemperatureAndHumidity();
break;
case 1: ShowPressureAndAltitude();
break;
case 2: мой код 2);
break;
case 3: мой код 3();
break;
case 4: мой код 4();

default: break;
>
Скажете почему не работает case 2,3,4?

Arhat109

Да, применение конечных автоматов (программ с состояниями, типа тут CurrState) решает задачу разделения вывода.

Тут: пост №10 выкладывал свою библиотеку и там далее есть развитие в виде драйвера к LCD дисплею и ПО для конечных автоматов разной сложности.. все это решено.

Проблема есть несколько иного плана, а именно:
При выводе на дисплей по I2C, чип-переходник вполне способен работать на скоростях вплоть до 880кГц шины I2C (Атмел позволяет тоже). Но, вот сам дисплей "отрисовывает" символ не шустрее чем за 700-800микросекунд! И это время приходится пропускать в "цикле ожидания", пусть и через delayMicroseconds() .. жаба душит: 800мксек это около 8000 команд МК даже с учетом двухтактного обращения к ОЗУ!

В общем, надо как-то реализовать функцию lcd.write() в нотации типовой библиотеки или lcdWrite() в моей нотации, так ..
Чтобы вывод буфера (строки) нескольких символов стал НЕ блокирующим и эти 8000 команд можно было бы "что-то делать ещё"..

Пробовал с наскоку .. получается какая-то фигня.

Mamkin_teXnik

Доброго времени суток! Вопрос касаемо вывода данных на дисплей 16х2. проект представляет собой примитивный контроллер полива по заранее установленным временным параметрам. так задумано сделать 2 режима работы, которые выбираются с помощью ключа. Эту часть кода я осилил, но была задумка параллельно выводить на дисплей следующую информацию: Приветствие, после выбор режима, после выбора режима должно отображаться (1, 0) текущее время, (0, 1) состояние реле насоса, (6, 1) зона, на которой ведется полив.
1. Приветсвие - это реализовал в сетапе.
2. Выберите режим - это уже в лупе. и тут начались проблемы. изначально я расписал отдельно функции режимов и потом в лупе через иф запускаю 1-й или 2-й режим. При переводе ключа в один из режимов, режим активируется, но на дисплее происходит вакханалия, фраза "выберите режим" - не исчезает, её частично заменяет реальное время, но часть символов остаётся, так же состояние реле насоса изначально "Pump_off", а когда реле активируется должно писать "Pump_on", а получатеся "Pump_onf". подскажите, как решить данную проблему.


LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой
//LiquidCrystal_PCF8574 lcd(0x27); // Вариант для библиотеки PCF8574
RTC_DS3231 RTC;

boolean mode_1;
boolean mode_2;
const int pump = 6;
const int zona1 = 7;
const int zona2 = 8;
const int zona3 = 9;
const int zona4 = 10;
const int zona5 = 11;


int Hour; //Данная переменная хранит часы
int Min; //Данная переменная хранит минуты
int Sec; //Данная переменная хранит секунды

Как прекратить мерцание дисплея без потери функциональности?вот что я имею

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

по кнопке и пульту IR включается и выключается нагрузка. в целях изучения недавно полученного lcd пытаюсь его сюда пристроить. здесь все работает, только дисплей мерцает. Если добавить delay - то грузит всю программу(чего и ожидал). Погугливши - путного ничего не нашел. Как решить? Называю свой код "изящным" ))))

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

вместо lcd.clear(); делай lcd.print( " " );

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

спасибо, работает, только лишние символы не удаляет, в итоге получается при включенной нагрузке - Light is ONF . F осталась от предыдущей задачи и не стерлась

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

Light is ONF содержит 12 символов - сколько символов нужно, что бы перезаписать 12 символов?

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

Light is ONF содержит 12 символов - сколько символов нужно, что бы перезаписать 12 символов?

Хочется, конечно, чтобы не Light is ONF, а Light is ON.

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

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

Хочется, конечно, чтобы не Light is ONF, а Light is ON.

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

правильнее печатать сверху напечатанного, что бы не тратить время и ресурсы на стирание.

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

ок, концепцию понял, спасибо))

а если, вдруг, заморочиться? наверное millis подойдет? как его сюда вставить? или может еще что?

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

а если, вдруг, заморочиться? наверное millis подойдет? как его сюда вставить? или может еще что?

не совсем ясно, что ты имеешь ввиду.

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

имею в виду стирание экрана и вывод новых данных без мерцания

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

имею в виду стирание экрана и вывод новых данных без мерцания

закоменти lcd.clear(); и не будет у тебя мерцания

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

а вот тут я не понял - его надо в константы/переменные ввести или в setup? можно пример строки?

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

еще вопрос про lcd - если накрутил нужное сопротивление потенциометром для контраста дисплея - можно ли этот потенциометр на постоянный резистор заменить? себе представляю, что одну ногу резистора надо на VO (3 вывод), а вторую куда? на землю или питание?

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

но это же просто комментарий выйдет, а не программный код.

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

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

или то, что я хочу нерационально?

ты не сообщил, что ты хочешь.

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

нажал кнопку или кнопку пульта, как в данном скетче --> зажегся/погас светодиод, тем временем, на lcd высветилось on или off на дисплее(согласно состоянию светодиода), причем символы on или off не переписывают друг друга, а просто пишутся на сброшенный(чистый) дисплей (чтобы не считать количество символов в строках и не подгонять их друг по друга). Ну и, конечно, чтобы дисплей не мерцал и в любой момент схема воспринимала сигнал с кнопки и пульта, как без дисплея. дисплей и кнопки работают параллельно (ну или как то так), не мешая друг другу, а дисплей не мерцает. так себе это вижу

Вывод текста без мерцания и наложения UNO R3 + 2.4 TFT (решено)

Олег Кораблёв

Юрий Гавриш

Олег, вариантов всего два, но один вам не понравится.
1. хз, как там фруктовая библиотека, но UTFT умеет выводить текст сразу с закраской фоном, то есть минус одна операция. поищите в исходниках библиотеки функция установки цвета фона. типа "bgcolor"/"background color" наверняка что-то есть. ну или в функции вывода текста гляньте, чем оно красит, если не надо выводить пиксель буквы.
2. вы уверены, что в тех примерах используется уно, а не похожая внешне плата, но с arm на борту? у arm частота работы раз этак в пять выше, поэтому там и мерцания не заметно.

Олег Кораблёв

Юрий, спасибо, сразу отвечу по поводу 2 пункта, очень возможно, на видео тоже дисплей выполнен в форме шилда и закрывает полностью плату, но большой USB выдаёт сходство с UNO:) Проблема ещё в том, что UTFT написан под 2.2 дисплей с другим количеством и расположением выводов и как подогнать эту библиотеку под 2.4 шилд пока не очень то понимаю.

Юрий Гавриш

Олег, у меня UTFT спокойно работала на трёхдюймовом 320х240. правда у меня была плата самопальная и библиотеку надо было перепиливать под мои реалии

Юрий Гавриш

Мигаем встроенным светодиодом

Самый первый проект всегда лучше делать как можно более простым и понятным. Лучше всего сначала просто сообщить миру о том, что программа работает. В других языках программирования это достигается выводом текста на экран фразы «Hello, World» , которая стала по-настоящему культовой. С ее помощью новые программы приветствуют мир уже на протяжении половины столетия.

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

Встроенный светодиод в Ардуино Uno, Nano и Mega

Мы должны написать и загрузить в ардуино скетч, который будет мигать встроенным в плату ардуино светодиодом – включать его каждую секунду, а потом на секунду выключать.

Вам понадобится: ничего, кроме платы ардуино. Сложность: простой проект.

Что мы узнаем:

  • Как мигает светодиод.
  • Что такое скетч и как написать программу.
  • Как включить и зажечь светодиод.
  • Как выключить светодиод.
  • Как сделать задержку в программе.

Вопросы, на которые вы уже должны знать ответы:

Как мигает светодиод

Алгоритм программы очень прост.

  1. Мы должны подать напряжение на светодиод (на тот пин, к которому подсоединен светодиод, в нашем случае, 13).
  2. Затем ждем некоторое время. Например, секунду.
  3. После чего убираем напряжение.
  4. И опять немного ждем, чтобы глаз мог заметить, что света нет.
  5. Начинаем все с первого пункта

На русском все выглядит очень просто. Осталось только перевести на язык, понятный Ардуино. Мы заменяем каждую строчку нашего алгоритма командой.

Для того, чтобы записать все эти команды, а потом перевести их в машинопонятный язык и загрузить в микроконтроллер мы используем программу Arduio IDE. В ней мы пишем наш код (или вставляем готовый из примера), в ней же нажмем несколько кнопок для проверки, трансляции и загрузки программы в Ардуино.

Давайте соберем все, что нужно, вместе в одной инструкции.

Пошаговая инструкция

Обратите внимание! Если вы отключите контроллер от компьютера и просто подадите на него питание (например, от батареек), то программа все равно будем выполняться! Ваша программа записана в память микроконтроллера и теперь будет в нем до тех пор, пока вы не перезапишите ее другой программой.

Поздравляем! У вас получилось реализовать ваш первый проект на Ардуино. Если все мигает так, как надо. Теперь можем переходить к анализу программы и сбору электронной схемы с отдельным светодиодом. Если же что-то не получилось, давайте разберемся, почему.

Если что-то пошло не так

Программа и скетч мигающего светодиода

Давайте теперь рассмотрим программу, которую мы загрузили из примеров и проанализируем.

Если вы обратите внимание на блок loop, то именно в нем и сосредоточены наши команды, управляющие светодиодом:

Как только программа дойдет до конца, контроллер перейдет в начало блока loop и будет выполнять все команды заново. И так раз за разом, целую вечность (пока есть свет). Наш светодиод мигает без остановки.

В этом проекте мы с вами практически повторим предыдущий, но при этом добавим самую настоящую схему. Подключим светодиод и токоограничивающий резистор. Чтобы не повторяться, отправим вас за подробным описанием в статью о правильном подключении светодиода к плате Ардуино.

  • Плата Arduino Uno или Nano
  • Макетная плата для монтажа без пайки
  • Резистор номиналом 220 Ом
  • Светодиод
  • Провода для соединения

Сложность: простой проект.

  • Как подключить светодиод к ардуино.
  • Повторим процедуру загрузки скетча в микроконтроллер.

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

Если вы еще не загружали программу, то вам надо повторить ту же последовательность действий, что и для работы со встроенным светодиодом. Загружаем пример, затем программу в контроллер и наблюдаем за результатом.

Попробуйте внести изменения в программу. Сделайте так, чтобы маячок мигал медленней и быстрее (чаще). Добейтесь того, чтобы частота мигания стала такой, что мигание света стало бы незаметным.

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

  • Плата Arduino Uno или Nano
  • Макетная плата
  • Два резистора 220 Ом
  • Два светодиода. Если есть возможность, лучше взять синий и красный.
  • Провода для соединения.

Сложность: простой проект.

  • Как подключить светодиод к ардуино.
  • Как изменить стандартную программу мигалки.
  • Повторим процедуру загрузки скетча в микроконтроллер.

Программирование мигалки

В скетч с мигающим светодиодом нам надо будет внести определенные изменения. Алгоритм действий таков:

  • Включаем синий светодиод
  • Ждем какое-то время (1 секунду)
  • Выключаем синий светодиод и одновременно включаем красный
  • Ждем какое-то время (1 секунду)
  • Повторяем еще раз

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

В этой программе нам опять встречается блок команд loop. В нем мы выполняем включение и выключение пинов с помощью digitalWrite. Никаких сложностей это вызвать не должно.

Давайте поговорим более подробно о блоке setup. Мы видели его и в прошлом примере. Внутри setup обычно располагаются команды инициализации, которые запускаются только один раз, в момент подключения контроллера к питанию.

Надеемся, процедура проверки скетча и прошивки контроллера не вызвала каких-то трудностей. Запустите программу и вы увидите, как весело перемигиваются светодиоды на плате. Поздравляем с написанием своих первых проектов на Ардуино!

Заключение

Я пытаюсь запустить скетч обработки на своем Arduino. Я получил его несколько дней назад, так что я в значительной степени новичок. Я сделал два похожих скетча - один в Arduino и один в Processing. Один Arduino работает, в то время как скетч Processing - нет, хотя при запуске скетча Processing на плате загорается RX.

Я подключил светодиод к D9 на плате с резистором 220 Ом, а другую ногу подключил к GND. Затем я приступил к запуску скетча Arduino, который является простым, он на секунду загорается и гаснет светодиод. Этот сработал.

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

Я попытался установить только последовательное соединение между Arduino, и это сработало - я подключил модуль джойстика к Arduino и отправил X и Y через последовательный порт, а эскиз обработки получил информацию через последовательный порт, так что они есть, действительно, общение.

Используемый порт - COM3 и работает со скоростью 9600 бод.

Это скетч Arduino:

И это скетч Processing (версия 3.4):

2 ответа

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

Как вы можете видеть в этом примере, в setup() последовательная связь инициализируется со скоростью 9600 бод (скорость связи, 9600 байт / символов в секунду):

Используя эти понятия, вы могли бы написать такой базовый набросок:

Загрузка этого скетча в ваш Arduino должна позволить вам ввести 1 в Serial Monitor и нажать Enter, чтобы включить светодиод, или 0 , чтобы выключить его.

Незначительное примечание: обратите внимание, что я не использую delay() в обработке, я рекомендую вместо этого использовать millis (), поскольку он не блокирует выполнение кода, как это делает delay() .

Таким образом, приведенное выше выглядит как небольшой фрагмент кода, просто чтобы мигать светодиодом, но суть в том, чтобы понять основы последовательной связи, которые будут полезны в долгосрочной перспективе:

  1. инициализация последовательной связи с Arduino (понимать скорость передачи)
  2. базовое чтение / запись байтов через последовательный порт
  3. инициализация последовательной связи из Обработка и отправка данных

Возвращаясь к исходному вопросу, вы упустили важную деталь, касающуюся библиотеки Arduino, которую вы используете в Processing: она основана на специальном скетче (прошивке) Arduino под названием Firmata. Вы сможете узнать больше об этом и о том, как использовать библиотеку, в Arduino и Processing руководство.

Как упоминается в руководстве, вам необходимо сначала загрузить этот эскиз из Arduino> Примеры> Firmata> StandardFirmata . Также помните, что скорость передачи данных установлена ​​на 57600 , а не на 9600 , поэтому вам нужно обновить свой код следующим образом:

Для использования: вы обязательно ставите стандартные фирмы

  • Используя программное обеспечение Arduino, загрузите пример StandardFirmata (расположенный в Примеры> Firmata> StandardFirmata) на вашу плату Arduino.

Вы можете добавить эту строку, чтобы следить за своим последовательным портом:

Читайте также: