====== Эксперимент 16. Метеостанция ======
[[комнатный-термометр|← Комнатный термометр]] | [[конспект-arduino:|Оглавление]] | [[пантограф|Пантограф →]]
В этом эксперименте мы передаем данные об измерениях температуры на компьютер (например, для последующей обработки).
===== Список деталей для эксперимента =====
* 1 плата [[amp>product/arduino-uno|Arduino Uno]]
* 1 беспаечная [[amp>collection/breadboards|макетная плата]]
* 1 [[amp>product/resistor-10k|резистор]] номиналом 10 кОм
* 1 [[amp>product/thermistor|термистор]]
* 3 провода [[amp>product/wire-mm|«папа-папа»]]
===== Принципиальная схема =====
{{ :конспект-arduino:16_meteostation_scheme.svg.png?nolink& |}}
===== Схема на макетке =====
{{ :конспект-arduino:16_meteostation_bread.svg.png?nolink& |}}
===== Скетч =====
#include
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").
- Добавьте столбец, содержащий количество секунд, прошедших с момента запуска микроконтроллера. Можно уменьшить интервал передачи данных.
----
[[комнатный-термометр|← Комнатный термометр]] | [[конспект-arduino:|Оглавление]] | [[пантограф|Пантограф →]]