Arduino.ru
Доброго времени суток , подскажите пожалйста как можно выводить данные на монитор пк аналогично как Serial НО, что бы значение не бегали, а стояли на одном месте, а то провожу калибровку глаза уже болят от вечно двигвющихся цифр. Заранее все спасибо.
- Войдите на сайт для отправки комментариев
Сб, 24/12/2016 — 21:19

Зарегистрирован: 20.06.2015
Можно написать собственный монитор, который удовлетворяет Вашим требованиям.
Еще один вариант — подключить к Ардуино дисплей и выводить отладочную информацию на него.
- Войдите на сайт для отправки комментариев
Сб, 24/12/2016 — 21:30

Зарегистрирован: 08.02.2014
Еще можно проводить проверку переменной и если она изменилась то вывести на монитор а если нет то не выводить
- Войдите на сайт для отправки комментариев
Сб, 24/12/2016 — 22:02
Зарегистрирован: 15.10.2016
К сожалению дисплей в пути еще, переменые постоянно меняются так что будет аналогично Serial.println. Про то как написать свой монитор если можно чуть подробней хотя бы ссылочку.
- Войдите на сайт для отправки комментариев
Вс, 25/12/2016 — 01:35

Зарегистрирован: 20.06.2015
Что значит «как написать»? Ручками.
Монитор — это программа, которая берет данные из COM-порта и отображает их на экране. А как — пишите так, как Вам надо. Если хотите совместимости или просто воспользоваться уже наработанным опытом — обрабатывайте Esc-последовательности.
- Войдите на сайт для отправки комментариев
Вс, 25/12/2016 — 10:18

Зарегистрирован: 25.05.2015
Sanchos07 пишет:
Про то как написать свой монитор если можно чуть подробней хотя бы ссылочку.
Исходников полно, хоть на С, хоть на Делфи.
- Войдите на сайт для отправки комментариев
Вс, 25/12/2016 — 15:09
Зарегистрирован: 15.10.2016
Ну я понимаю всем легко, когда в этом деле не первый год и понимаешь где что искать, я пока что начинающий, а в прогамировании вообще нуль только начал осваивание. Но все равно всем спасибо разбрался, сделал на библиотеке BasicTerm.h и вывод с помощью PUTTY вдруг кому пригодится.
- Войдите на сайт для отправки комментариев
Serial Monitor. Общаемся с компьютером
Для общения между платой Arduino и компьютером или другим устройством в контроллере используется интерфейс UART или USART, который в сочетании со встроенным в UNO USB-to-UART конвертером, позволит установить двунаправленую связь с компьютером через виртуальный последовательный порт. У некоторых моделей Arduino может быть несколько портов. Порт соединяется через цифровой пин 0 (RX) и 1 (TX) при подключении к компьютеру через USB, поэтому не используйте пины 0 и 1 для ввода/вывода.
Раньше на старых компьютерах были COM-порты, сейчас они создаются виртуально при помощи микросхемы FTDI, когда мы подключаем плату к компьютеру через USB.
Вам часто придётся использовать общение между устройствами для обмена информацией. Можно как посылать сигнал с компьютера, например, с клавиатуры, так и принимать сигналы с платы. Это полезно, чтобы узнать, что вообще происходит с сигналом из нужного вывода платы.
В Arduino IDE есть специальный значок с изображением лупы, который запускает Serial Monitor (монитор порта).
Для корректной работы с портом требуется выполнение двух условий: выбрать правильный COM-порт, выбрать скорость работы в скетче, которая должна совпадать со скоростью, выбранной в мониторе порта.
Для общения используется класс Serial. В методе setup() мы открываем порт для общения функцией Serial.begin() с указанием скорости в бодах (baud). Бод — это количество изменений сигнала в секунду. В нашем случае сигналы могут быть только двоичными, так что скорость в бодах соответствует скорости в битах в секунду. Можно использовать любую скорость, главное чтобы на приёмной и передающей сторонах они были одинаковыми. Доступные скорости можно посмотреть в настройках порта. Значение 9600 является стандартным и его можно не менять (9600 бод — 960 символов — один стартовый бит, восемь бит на сам символ и конечный бит). Если установить неправильную скорость, то вместо данных получим «мусор» — данные, которые нельзя обработать. Для обмена данными между другими компонентами скорость может быть и выше, например между платой и Bluetooth-модулем.
На платах Arduino Mega и Arduino Due доступны также Serial1, Serial2, Serial3.
Чтобы отправить сообщение в порт, используются методы print() (символы идут подряд) или println() (с переводом на новую строку).

Давайте выведем какое-нибудь сообщение. Это можно сделать в методе setup(), так как нам не нужно повторять одну и ту же фразу бесконечно. Метод loop() оставляем пустым.
void setup() < Serial.begin(9600); Serial.println("Hello Kitty!"); Serial.print("Мяу!"); >void loop()
Если посылаем строку, то обрамляем её кавычками. Если число, то кавычки не используем. Изменим функцию setup().
void setup() < Serial.begin(9600); Serial.print("А у кошки "); Serial.print(4); Serial.println(" ноги,"); Serial.print("А сзади у ней длинный хвост."); >void loop()
Можно заменить строки и числа на переменные. Перепишем пример.
String cat = "А у кошки "; int leg = 4; void setup() < Serial.begin(9600); Serial.print(cat); Serial.print(leg); Serial.println(" ноги,"); Serial.print("А сзади у ней длинный хвост."); >void loop()
Немного о числах. При работе с дробными числами, можно указать число знаков после запятой.
void setup() < float number = 9.434346502; Serial.begin(9600); Serial.print(number, 2); >void loop()
Работа с массивами и строками
Разберём пример отправки строк в случайном порядке. Любая строка уже является массивом символов. Поэтому вместо типа String, можно использовать массив char[]. Для примера создадим массив из четырёх имён и будем выводить их в случайном порядке через разные промежутки времени, используя функцию random().
char* catNames[] = < "Барсик", "Васька", "Мурзик", "Рыжик" >; void setup() < Serial.begin(9600); >void loop()

Приём данных
Выводить данные в порт просто. А вот принимать данные с компьютера и других источников сложнее. При отправлении данных, они складываются в буфер, ожидая, когда плата их прочитает. Объём буфера составляет 64 байта. Чтобы постоянно не читать пустой буфер, есть специальная функция проверки буфера Serial.available(). Она возвращает число байт, которые лежат в буфере. Обычно в коде создают условие проверки — если в буфере больше 0 байт, то выполняем какие-то команды.
Для демонстрации создадим странный пример — создадим переменную, присвоим ей данные через Serial.read() и попросим её прислать полученные данные через Serial.print(). Получится круговорот данных или эхо.
void setup() < Serial.begin(9600); >void loop() < if (Serial.available() >0) < int data = Serial.read(); Serial.println(data); >>
Проверяем на числах. Отправляем число 9, а получаем 57. Если вы получаете две строки с числами 57 и 10, то в нижней части окна выберите настройку No line ending вместо Newline.
Попробуем также отправить букву. Опять вместо t возвращается 116. Ерунда какая-то. Всё просто, функция read() работает с символьными значениями и мы видим код символа из стандартной таблицы символов ASCII.
Чтобы решить проблему, нужно изменить тип данных на char.
char data = Serial.read();
Вроде проблема решена. Мы можем принимать отдельные цифры и буквы. Но буквы только английские, а числа только однозначные.
Если мы планируем работать только с однозначными числами, то можно написать такой код.
int data = Serial.read() - '0';
Решение какое-то половинчатое. А как быть с большими числами или словами?
Если отправить двузначное число 23, то ответ разбивается на части — 2 и 3. Получается, что переменная получит последнее число 3 (промежуточные значения перезаписываются). Чтобы обработать всё число, нужно использовать метод parseInt().
int data = Serial.parseInt();
Теперь вы можете вводить любые числа. Но, наверное, вы заметите теперь небольшую задержку в ответах. Метод внутри себя перемалывает данные. Кстати, вы можете использовать и обычные символы. Если набор символов состоит только из букв, то вернётся 0. Если будут попадаться и цифры, то будут возвращаться цифры. Попробуйте комбинировать различные сочетания цифр и букв, чтобы понять, как будут обрабатываться данные.
Управление светодиодом с клавиатуры
Напишем пример управления встроенным светодиодом с клавиатуры. Если нажата клавиша 1, то светодиод должен загореться, при нажатии клавиши 0 выключим светодиод.
int ledPin = 13; byte incomingByte; void setup() < pinMode(ledPin, OUTPUT); Serial.begin(9600); >void loop() < if (Serial.available() >0) < incomingByte = Serial.read(); if(incomingByte == '1')< digitalWrite(ledPin, HIGH); >else if (incomingByte == '0') < digitalWrite(ledPin, LOW); >Serial.print("I received: "); Serial.println(incomingByte, DEC); > delay(10); >
Часть кода нам уже знакома — мы используем встроенный светодиод под номером 13.
Сигнал от компьютера поступает в виде байта. Создаём новую переменную incomingByte для этих целей.
Последовательный порт включается командой begin() с указанием скорости.
Если с компьютера поступает сигнал, то функция available() вернёт количество байт, доступное для чтения. Таким образом, мы просто убеждаемся, что какой-то сигнал пришёл (больше нуля).
После первой проверки мы проверяем введённый символ, который может быть представлен и как байт. Если символ равен единице, то включаем светодиод, как мы делали раньше. Если символ равен 0, то выключаем.
Как это выглядит на практике. Заливаем скетч и запускаем Serial Monitor (Ctrl+Shift+M). В окне Serial Monitor наверху есть текстовое поле. Вводим в него числа 1 или 0 и нажимаем кнопку Send. Можно также нажать клавишу Enter для быстрого ввода.
Для общего развития в скетч добавлены также две строчки кода, определяющие код нажатой клавиши. Таким образом вы можете узнать код для клавиш 0 и 1. Вы также можете нажимать и на другие клавиши, они не повлияют на светодиод, но вы увидите коды клавиш.
Чуть более сложный пример, когда строка задана в виде массива и символы выводятся по очереди.
#define ARRAY_SIZE 12 //global variable definition char hello[ARRAY_SIZE] = < 'h','e','l','l','o',' ','k','i','t','t','y','!'>; void setup() < Serial.begin(9600); >void loop() < //print characters from array to serial monitor for(int x = 0; x < ARRAY_SIZE; x++) < Serial.print(hello[x]); delay(250); >Serial.println(); delay(250); >
Функция Serial.end() закрывает последовательное соединение, порты RX и TX освобождаются и могут быть использованы для ввода/вывода.
В различных уроках вы будете принимать сигналы от платы Arduino. Это полезно, например, для отладки приложения, когда вы выводите сообщения и по ним ориентируетесь, какая часть программа работает, а какая — нет. Способность общения между Arduino и компьютером очень важна. Вы можете принимать сигналы не только в Arduino IDE, но и в других приложениях на компьютере. Например, в связке с Arduino часто используют приложение Processing, в котором рисуют графики поступаемых сигналов.
Если вы больше не нуждаетесь в получении данных, то закрывайте окно Serial Monitor.
Также существует библиотека SoftwareSerial. Она позволяет осуществить последовательную передачу данных через другие цифровые контакты Arduino.
Другие варианты
Чтение данных из последовательного порта возможно другими способами. Ищите расширения, например, Arduino Chrome Serial Monitor. На видео можно посмотреть, как создать расширение самостоятельно.
На C# также можно написать приложение, которое будет уметь считывать данные.
Processing также умеет работать с последовательным портом.
Дополнительное чтение
ASCIITable — распечатываем таблицу символов ASCII в разных форматах
Как Arduino подключить к компьютеру и вывести график температуры.
Для реализации своих задумок, мне нужно с компьютера управлять Arduino. Поэтому стал изучать программы, которые помогут реализовать обмен данных между ПК и Arduino. Сперва начал с самой распространённой программы для данных целей Processing. Сделал программу, которая позволяет управлять реле. Но когда я приступил к реализации более сложных проектов, столкнулся с проблемой возможности реализации на Processing задуманных функций. Поэтому я стал думать какой язык и IDE будем оптимальным для быстрого освоения и реализации связи Arduino с компьютером. После некоторого времени поисков и тестирования остановился на Visual Studio и языке программирования C#. Первый проект, который я реализовала это подключение Arduino к компьютеру и передача данных с датчика температуры DS18B20.
Visual Studio приложение Windows Forms для получения данных от Arduino.
Первое приложение Visual Studio буду делать Windows Forms C#. Для этого нужно создать новый проект и выбрать язык программирования C#. И соответственно Windows Forms.

Затем с помощью визуального редактора создать интерфейс приложения для получения данных с Arduino. Останавливаться на данном моменте не буду, так как в интернете очень много уроков и достаточно хорошая документация на русском языке, которую можно почитать на официальном сайте или тут.
Также вы можете скачать исходные материалы проекта и приложение в формате .exe внизу статьи в разделе «Файлы для скачивания».
Описание приложения построения графиков по данным с датчика температуры.

Для получения данных с датчика температуры достаточно запустить приложения, для этого откроем файл «Monitor temperature.exe».

При загрузке мы сразу получаем список всех доступных com-портов.

За это отвечает вот этот кусок кода.

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

После выбора нужного порта нажимаем кнопку «Подключиться». При подключении увидим, как мигнут светодиоды на плате Arduino. Это означает, что подключение прошло успешно.

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

Для работы с монитором порта добавим невидимый компонент в проект и назовем его «mySerialPort».

Для получения данных от Arduino добавим функцию «mySerialPort_DataReceived».

В данной функции реализуем считывание полученных данных из порта и выведем температуру в текстовое поле.

А также вывод значений полученных с датчика на график.

Чтобы график был читабельным при получении данных длительное время, сделаем ограничение выводимых значений на график. Для этого создадим еще один выводящий список «comboBox» и пропишем необходимые значения для выбора.

В коде ограничим диапазон в зависимости от выбора «Диапазона времени».

Также сделал вывод текущего времени и даты.

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

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

На график значение температуры выводиться по умолчанию 30 секунд. Данное значение мы можем изменить на 60, 90 120 сек. Данные диапазоны задаются в программе и их можно изменить и дополнить.

Изменяя данное значение, например, на 120 сек. На графике будем видеть изменение температуры, уже не 30 сек, а минимум 120 сек. Почему минимум? Это связанно с тем, что сдвиг графика происходит при достижении числа кратного значению 10. И диапазон выводимых значений будет на 9 секунд больше до момента сдвига.
Скетч для Arduino отправки значений температуры в монитор порта.
Измерять температуру будем датчиком DS18B20 выполненного в виде модуля KY-001. По работе с данным модулем у меня есть отдельный урок. Скетч возьмем из урока и немного подправим для нашего проекта.
#include #include // контакт 2 на Arduino: #define ONE_WIRE_BUS 2 // создаем экземпляр класса OneWire, чтобы с его помощью // общаться с однопроводным устройством OneWire oneWire(ONE_WIRE_BUS); // передаем объект oneWire объекту sensors: DallasTemperature sensors(&oneWire); void setup(void) < Serial.begin(9600); // запускаем библиотеку: sensors.begin(); >void loop(void) < // вызываем функцию sensors.requestTemperatures(), // которая приказывает всем устройствам, подключенным к шине sensors.requestTemperatures(); static uint32_t tmr2; if (millis() - tmr2 >1000) < tmr2 = millis(); Serial.println(sensors.getTempCByIndex(0)); // в Цельсиях: >>
Схема подключения модуля KY-001 (DS18B20) к Arduino.

В связи с тем, что будим использовать модуль KY-001 (DS18B20) подключение к Arduino будет достаточно простым и понадобиться всего 3 соединительных провода.
Подведем итог.
Как видим сделать в Visual Studio приложение Windows Forms достаточно просто. А при сочетании с C# возможности взаимодействия Arduino с компьютером становятся достаточно большими. Можно реализовать не только получение данных с Arduino, но и реализовать управление, получая данные с ПК, Интернета и т.д.
Если вам интересны уроки по данной теме, пишите в комментарии. При заинтересованности сделаю блок уроков Visual Studio Arduino.
Понравился проект Пульт для презентаций своими руками на Arduino? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Чтение данных из последовательного порта. Урок 6. Ардуино

Привет! Сегодня еще один урок. Мы уже рассмотрели много разных ситуаций работы с ардуино. И в одном из предыдущих уроков научились записывать данные из программы в последовательный порт, чтобы следить за выполнением программы. Теперь рассмотрим чтение данных из последовательного порта, чтобы управлять программой и схемой с его помощью.

Зачем это может понадобиться? Конечно, для управления вашим устройством через компьютер или любое другое подключенное устройство ввода, которое поддерживает передачу данных через COM порт.
Статью про запись данных в последовательный порт для отладки программы, вы можете найти по ссылке ниже. Пожалуйста, посмотрите ее, если пропустили или уже забыли о чем речь.
В этой статье рассмотрим методы объекта Serial, их использование и примеры кода для реализации программ. Также соберем простую схему с сервоприводом и будем управлять ей с помощью монитора последовательного порта в ардуино ide.
Мы уже делали схему управления сервоприводом с помощью потенциометра, в одном из предыдущих уроков. Пожалуйста, посмотрите его, если пропустили.
Для выполнения этого урока нам понадобятся
- Ардуино UNO
- Макетная плата
- Перемычки
- Сервопривод
- Блок батареек
- Кабель USB
Serial.read()
Команды Serial.print() и Serial.println() мы уже знаем. Они записывают данные в последовательный порт. Команда для чтения данных, как не трудно догадаться — Serial.read().
Эта функция считывает и возвращает байт информации из буфера последовательного порта.
Если никакой информации нет, то возвращает -1.
Тип данных будет int.
Хитрость этой функции, с которой обязательно придется столкнуться в том, что она считывает именно байт информации и представляет его в виде кода символа из таблицы ASCII. Это значит, если вы введете слово из 5 букв, то каждый символ будет считан отдельно и его код из таблицы будет выведен в монитор последовательно. Например, код символа 0 — это 48, А код символа F — это 70. Причем только в десятичной системе счисления. Естественно, с символами Кириллицы все еще сложнее.
Попробуем загрузить в ардуино несколько примеров.
void setup() < Serial.begin(9600); >void loop() < if (Serial.available() >0) < Serial.println(Serial.read(), DEC); >> // 1 - 49 // a - 97 // F - 70 // ] - 93
Serial.available()
Эта функция получает доступную для чтения из последовательного порта информацию. Максимум в буфере может быть до 64 байт. Эта те данные, которые записаны в порт и ожидают чтения. Следовательно, это удобно использовать для проверки последовательного порта на готовность к чтению. Если функция возвращает состояние отличное от 0, значит можно получить данные из порта. Попробуйте загрузить такой скетч в ардуино и проверить монитор порта.
void setup() < Serial.begin(9600); >void loop() < if (Serial.available() >0) < Serial.println(Serial.read(), DEC); >else < Serial.println("Ожидаем данные"); >>
Serial.readString()
Считывает из буфера символы, формирует из них строку типа String и выводит ее. С такой функцией уже можно принимать в программу целые команды. Хотя их еще нужно специальным образом обработать. Но в нашей программе будем использовать именно эту функцию.
void setup() < Serial.begin(9600); >void loop() < if (Serial.available() >0) < String str = Serial.readString(); Serial.println(str); >>
Serial.parseInt()
Эта функция ищет целое число во входном потоке. Если число не было введено, выведет 0. Если ввести строку знаков, в которой будут числа, выведет только числа.
void setup() < Serial.begin(9600); >void loop() < if (Serial.available() >0) < x = Serial.parseInt(); Serial.println(x); >> //sfdfsdf - 0 //sdfdf34 - 34 // dsf3df3 - 3 \n 3

Программа
Ок. Давайте попробуем собрать схему и написать программу управления сервоприводом на основе данных вводимых в последовательный порт.
Программа будет принимать данные из порта, анализировать их, и если данные подходят для сервопривода отправлять на привод угол для перемещения вала.
В простейшем варианте такой программы используем функцию Serial.parseInt() чтобы получить только цифру и установить ее на сервопривод. Не забудьте ограничить максимальное и минимальное значение переменной функцией constrain().
void loop() < if (Serial.available() >0) < x = Serial.parseInt(); x = constrain(x, 0, 180); Serial.println(x); myservo.write(x); >>
Но, что если мы хотим принимать не только числовые данные, но и обрабатывать строковые команды. Тогда необходимо принимать все символы и обрабатывать их. Воспользуемся функцией Serial.readString(), чтобы организовать чтение данных из последовательного порта.
Затем сравним строку с несколькими значениями, которые уже будут внесены в программу. Если ни одна текстовая команда не подойдет, попробуем преобразовать строку в число и передать на сервомотор.
Полный текст программы
#include Servo myservo; int pos=0; String str; void setup() < Serial.begin(9600); myservo.attach(9); >void loop() < if (Serial.available() >0) < str = Serial.readString(); if (str == "one")else if (str == "ten")else if (str == "ninety")else < pos = str.toInt(); >pos = constrain(pos, 0, 180); pos = str.toInt(); Serial.println(str); > myservo.write(pos); >
Заключение
Теперь мы можем использовать последовательный порт на ардуино для передачи команд на устройство и управления оборудованием от него. В следующих уроках и проектах мы будем использовать эти полезные функции.