Эксперимент 16. Метеостанция
← Комнатный термометр | Оглавление | Пантограф →
В этом эксперименте мы передаем данные об измерениях температуры на компьютер (например, для последующей обработки).
Список деталей для эксперимента
- 1 плата Arduino Uno
- 1 беспаечная макетная плата
- 1 резистор номиналом 10 кОм
- 3 провода «папа-папа»
Принципиальная схема
Схема на макетке
Скетч
- p160_meteostation.ino
#include <math.h> int minute = 1; // Параметр конкретного типа термистора (из datasheet): #define TERMIST_B 4300 #define VIN 5.0 void setup() { // мы хотим передавать информацию на компьютер через USB, а // точнее через последовательный (англ. serial) порт. // Для этого необходимо начать (англ. begin) передачу, указав // скорость. 9600 бит в секунду — традиционная скорость. // Функция «begin» не является глобальной, она принадлежит // объекту с именем «Serial». Объекты — это «продвинутые» // переменные, которые обладают собственными функциями, // к которым обращаются через символ точки. Serial.begin(9600); // передаём заголовок нашей таблицы в текстовом виде, иначе // говоря печатаем строку (англ. print line). Символы «\t» — // это специальная последовательность, которая заменяется на // знак табуляции (англ. tab): 8-кратный выровненный пробел Serial.println("Minute\tTemperature"); } void loop() { // вычисляем температуру в °С с помощью магической формулы. // Используем при этом не целые числа, а вещественные. Их ещё // называют числами с плавающей (англ. float) точкой. В // выражениях с вещественными числами обязательно нужно явно // указывать дробную часть у всех констант. Иначе дробная // часть результата будет отброшена float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; // печатаем текущую минуту и температуру, разделяя их табом. // println переводит курсор на новую строку, а print — нет Serial.print(minute); Serial.print("\t"); Serial.println(temperature); delay(60000); // засыпаем на минуту ++minute; // увеличиваем значение минуты на 1 // откройте окно Serial Monitor в среде Arduino, оставьте на // сутки, скопируйте данные в Excel, чтобы построить графики }
Пояснения к коду
- Очень часто бывает полезно обмениваться данными, например, с компьютером. В частности, для отладки работы устройства: можно, например, смотреть, какие значения принимают переменные.
- В данном эксперименте мы знакомимся со стандартным объектом
Serial
, который предназначен для работы с последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с данным объектом)begin()
,print()
иprintln()
, которые вызываются после точки, идущей за именем объекта:- чтобы обмениваться данными, нужно начать соединение, поэтому
Serial.begin(baudrate)
вызывается вsetup()
Serial.print(data)
отправляет содержимоеdata
. Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек:""
. Кириллица, скорее всего, будет отображаться некорректно.Serial.println(data)
делает то же самое, только добавляет в конце невидимый символ новой строки.
- В
print()
иprintln()
можно использовать второй необязательный параметр: выбор системы счисления, в которой выводить число (это может бытьDEC
,BIN
,HEX
,OCT
для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел.
Например,
Serial.println(18,BIN); Serial.print(3.14159,3);
в мониторе порта даст результат
10010 3.142
- Монитор порта, входящий в Arduino IDE, открывается через меню Сервис или сочетанием клавиш Ctrl+Shift+M. Следите за тем, чтобы в мониторе и в скетче была указана одинаковая скорость обмена данными,
baudrate
. Скорости 9600 бит в секунду обычно достаточно. Другие стандартные значения можете посмотреть в выпадающем меню справа внизу окна монитора порта. - Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.
- При запуске монитора порта скетч в микроконтроллере перезагружается и начинает работать с начала. Это удобно, если вам нельзя упустить какие-то данные, которые начинаю передаваться сразу же. Но в других ситуациях это может мешать, помните об этом нюансе!
- Если вы хотите читать какие-то данные в реальном времени, не забывайте делать
delay()
хотя бы на 100 миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать. Вы можете отправлять данные и без задержки, а затем, к примеру, скопировать их для обработки в стороннем приложении. - Последовательность
\t
выводится как символ табуляции (8 пробелов с выравниванием). Также вы можете использовать, например, последовательность\n
для перевода строки. Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же:\\
.
Вопросы для проверки себя
- Какие действия нужно предпринять, чтобы читать на компьютере данные с Arduino?
- О каких ограничениях не следует забывать при работе с последовательным портом?
- Как избежать ошибки в передаче данных, содержащих обратный слэш (
\
)?
Задания для самостоятельного решения
- Перед таблицей данных о температуре добавьте заголовок (например, "Meteostation").
- Добавьте столбец, содержащий количество секунд, прошедших с момента запуска микроконтроллера. Можно уменьшить интервал передачи данных.