Построение графика arduino

Урок 13.3 Arduino строим графики по данным c sd карты.

Сегодня в уроке мы сохраним данные и время считывания данных в файл. Который можно открыть в Excel и построить график.

Как вывести график на смартфон, в режиме реального времени смотрите тут: Arduino SD карта. Воспроизводим звуки и музыку в wav формате.

Для урока нам понадобиться:

Модуль DS3231 выбрал не случайно. В нем есть датчик температуры . И мы можем сохранять значение температуры и время замеров .

Это наглядный пример использования легирование показаний с датчиков . Вы можете использовать другое датчики: DS18B20, DHT11, DHT22 . Также вы можете использовать одновременно несколько датчиков и сохранять показание с них.

Подключаем SD-модуль и модуль реального времени DS3231 к Arduino UNO по схеме.

Для работы нам понадобиться библиотека DS3231.h. Скачать ее можно с сайта разработчика или в разделе для скачивания файлов внизу страницы.

Мы уже научились работать с картой, если возникнут сложности посмотрите предыдущий урок: Arduino SD карта. Создаем, удаляем файлы. Чтение, запись файлов.

Перейдем сразу к модулю времени DS3231 . Для его подключения нужно добавить всего пару строк:

Для вывода текущего времени и температуры есть 2 функции.

Для примера работы выведем время и показания в монитор порта.

И точно такие же показания будем сохранять в наш файл.

Можно сохранять в текстовый файл. А можно сохранить в файл TEST.csv.

Это тоже текстовый файл. Но его можно сразу открыть в Excel.

Осталось только построить график по полученным данным.

У вас наверное возникнет вопрос, почему у меня так скачет температура? Нет у меня нет резкого изменения температуры в комнате. Просто я погрел пальцами модуль времянки. И после он постепенно остывал.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

Понравилась статья? Поделитесь ею с друзьями:

Источник

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Как использовать функцию Serial Plotter в Arduino IDE для отображения графиков

Визуализация данных при работе с Arduino – это то, что нам всем приходилось делать в прошлом, используя стороннее или самостоятельно разработанное программное обеспечение. Но команда Arduino недавно решила это изменить. Сегодня мы рассмотрим их решение, называемое Serial Plotter, новый инструмент, который поставляется с новыми версиями Arduino IDE.

Serial Plotter обеспечивает среду, через которую мы можем видеть графики данных, выводимых в последовательный порт Arduino в режиме реального времени. Перед включением этой функции в Arduino IDE инженерам и любителям обычно приходится писать дополнительный код с использованием других инструментов и языков программирования, таких как Python. Иногда это затрудняет отладку из-за дополнительной работы и времени, которое требуется, особенно в приложениях, основанных на сигналах, где просмотр данных на последовательном мониторе будет недостаточным.

Serial Plotter или последовательный плоттер в основном принимает значения, поступающие из заданного последовательного порта, и отображает их на графике плоскости x-y. Ось Y представляет значения из последовательного порта и автоматически настраивается при увеличении или уменьшении значения. Можно сказать, что ось X представляет собой момент времени. Каждая точка на оси x представляет выполнение оператора println в коде Arduino. Проще говоря, каждый раз, когда выполняется команда println, на графике записывается новая точка / данные (значение Y, соответствующее этой конкретной инструкции println). Ограничением Serial Plotter в этой версии Arduino IDE является тот факт, что он поддерживает всего 500 выборок данных, после чего может потребоваться перезапуск плоттера. Это может сделать плоттер непригодным для определенных приложений, но, возможно, это изменится в следующих версиях Arduino IDE.

Serial Plotter можно вызвать после загрузки кода на плату Arduino, щелкнув tools — serial plotter в раскрывающемся меню или нажав CTRL + SHIFT + L, что является сочетанием клавиш для той же операции.

Чтобы продемонстрировать использование последовательного плоттера в сегодняшнем уроке, мы создадим два примера. Для первого примера мы будем использовать Serial Plotter для получения данных с фоторезистора. Это даст нам возможность изучить, как данные изменяются в зависимости от силы света, не пытаясь понять, какие числа выводятся на последовательном мониторе. Во втором примере мы будем использовать датчик температуры и влажности DHT22. Цель этого примера – показать, как выводить данные с нескольких датчиков с помощью последовательного плоттера Arduino.

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

Для второго примера схема содержит датчик температуры и влажности DHT22, подключенный к Arduino, как показано на следующей схеме.

Код для двух примеров, с которыми мы будем работать, довольно прост. В обоих программах важна функция println(). Функция Serial.println() Arduino выводит данные на последовательный порт в виде читаемого человеком текста ASCII, за которым следует символ возврата каретки (ASCII 13 или «\r») и символ новой строки (ASCII 10 или «\n») , Эта команда принимает ту же форму, что и инструкция Serial.print(), с той лишь разницей, что символ новой строки не связан с serial.print(). Как упоминалось в начале, каждый раз, когда выполняется команда serial.println(), данные записываются в последовательный плоттер, что делает его очень важным для этого проекта. С учетом сказанного давайте рассмотрим код примеров, начиная с первого.

Здесь в рамках функции бесконечного цикла void loop() мы используем функцию analogRead() для получения данных с вывода делителя напряжения, после чего данные отправляются в последовательный порт с помощью команды serial.println(), благодаря чему отображаются в виде графика в Serial Plotter.

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

В функции void loop(), как обычно, делается большая часть работы. Мы начали с использования функций dht.readTempera() и dht.readHumidity, чтобы получить значение температуры и влажности от датчика. После чего мы приступили к их распечатке таким образом, чтобы Serial Plotter понимал разницу между переменными. Это делается путем печати пустого пространства между переменными (после первого значения, перед вторым значением). Без этого пустого пространства между данными плоттер увидит следующий оператор println как обновление предыдущего.

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

Источник

Строим график на символьном дисплее 1602 Ардуино

Нам понадобится Ардуино УНО, дисплей 1602(и переходник i2c), датчик давления БМП180. Прошу прощения за качество фото, но какое есть.

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

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

Остальное комментариями в коде.

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

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

При расчете интервала нам нужно минимальное значение в массиве:

Строим сам график, если значений в массиве времени нет, выводим прочерк. Вызов функции усложнен для построения разных графиков из массива. Первое число номер массива, затем периодичность выборки данных, потом начальное значение в массиве. Мы берем первый массив(0), берем каждое второе значение(2) и начинаем с начала(0):

Источник

Строим графики на LCD дисплеях 1602 и 2004

Кто сказал, что символьные дисплеи для символов? Какие-то скучные чуваки. Если бы это было так, эти дисплеи не были бы настолько любимы и популярны в Arduino среде (купить можно тут https://alexgyver.ru/arduino_shop/). Подробного гайда лично от меня пока что нет, но суть такая: в этих дисплеях есть 8 ячеек для хранения “кастомных” символов, то есть символов, которые можно нарисовать самому, например при помощи различных онлайн сервисов типа такого http://maxpromer.github.io/LCD-Character-Creator/. Полученный массив байтов вставляется в скетч, передаётся в дисплей, и затем можно им пользоваться при помощи команды write(). Простой пример есть на офф сайте Ардуино https://www.arduino.cc/en/Reference/LiquidCrystalCreateChar. К слову эти ячейки в памяти занимают места с 0 по 7

Был у меня оч крутой проект, PCdisplay https://alexgyver.ru/pcdisplay/, в котором на дисплее 2004 отображалась в реальном времени информация о железе ПК: температуры и проценты загрузки, для красоты я выводил показатели не только числами, но и графически, в виде “полос загрузки” и графиков.

Проект получился очень классный, но вот я подумал, а почему бы не вынести построение графиков и полос загрузки удобными отдельными функциями? Ведь по-любому пригодятся кому-нибудь из вас, а достать код из PCdisplay новичку не под силу (к тому же он там чутка кривоват…). Так что представляю вашему вниманию GyverLCDbars – набор удобных инструментов для украшения ваших проектов графическими элементами: полосками загрузки и графиками. Актуальная версия всегда лежит у меня на GitHub https://github.com/AlexGyver/GyverLCDbars. Ссылка на прямую загрузку архива.
В библиотеке вас ждёт 6 примеров: 4 типа полос загрузки и два примера с графиком.

Как этим пользоваться? Да очень просто. Одна функция для инициализации “кастомных” символов, вторая – для вывода нужного элемента с настройками его размера и позиции на дисплее!

Полоса загрузки: fillBar(столбец, строка, ширина, значение)

  • Столбец: отвечает за положение левой точки полосы, нумерация идёт слева направо с нуля
  • Строка: отвечает за положение левой точки полосы, нумерация идёт сверху вниз с нуля
  • Ширина: полная ширина полосы по горизонтали. Очевидно, что ширина + стартовая позиция по горизонтали (столбец) не должны превышать ширину дисплея в символах по горизонтали
  • Значение: число от 0 до 100 – процент заполнения полосы. Любая ваша величина приводится к диапазону 0-100 при помощи ардуиновской функции map
  • Особенность: если вы используете свои кастомные символы, то перед выводом полосок нужно обязательно вызвать initBar() для загрузки в память дисплея символов полосы! Полоски занимают разное количество мест в зависимости от типа, подробнее смотрите в самих примерах

График из массива: drawPlotArray(столбец, строка, ширина, высота, мин. значение, макс. значение, массив) – смотри пример!

График в реальном времени: drawPlot(столбец, строка, ширина, высота, мин. значение, макс. значение, величина)

  • Столбец: нумерация идёт слева направо с нуля. Начало координат графика – нижняя левая точка!
  • Строка: нумерация идёт сверху вниз с нуля. Начало координат графика – нижняя левая точка!
  • Ширина: ширина графика по горизонтали. Очевидно, что ширина + стартовая позиция по горизонтали (столбец) не должны превышать ширину дисплея в символах по горизонтали
  • Высота: высота графика по вертикали. Очевидно, что высота+ стартовая позиция по вертикали (строка) не должны превышать высоту дисплея в символах по вертикали. То есть для 2004 максимум высота 4, для 1602 максимум 2.
  • Мин. значение: минимальное значение для графика, ниже него строиться не будет (тип данных int -32,768 to 32,767)
  • Макс. значение: максимальное значение для графика, выше него строиться не будет (тип данных int -32,768 to 32,767)
  • Величина: значение, которое будет построено на графике с краю, предыдущие столбики автоматически сдвинутся в сторону при вызове функции drawPlot. Тип данных int -32,768 to 32,767
  • Также в примере есть готовый кусок кода для расчёта и вывода максимального и минимального значения на текущем графике!
  • Особенность: если вы используете свои кастомные символы, то перед выводом графика нужно обязательно вызвать initPlot() для загрузки в память дисплея символов графика! Они занимают все места, с 0 по 7!

Источник