Arduino. Эксперимент 16. Метеостанция

В этом эксперименте мы передаем данные об измерениях температуры на компьютер (например, для последующей обработки).

 

СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА

 

-   1 плата Arduino Uno;

-   1 беспаечная макетная плата;

-   1 резистор номиналом 10 кОм;

-   1 термистор;

-   3 провода «папа-папа».

 

ПРИНЦИПИАЛЬНАЯ СХЕМА

 

 

СХЕМА НА МАКЕТНОЙ ПЛАТЕ

 

 

СКЕТЧ

скачать скетч для Arduino IDE
#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() можно использовать второй необязательный параметр: выбор системы счисления, в которой выводить число (это может быть DECBINHEXOCT для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел. Например,

 

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 для перевода строки. Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же: \\.

 

ВОПРОСЫ ДЛЯ ПРОВЕРКИ СЕБЯ

  1. Какие действия нужно предпринять, чтобы читать на компьютере данные с Arduino?
  2. О каких ограничениях не следует забывать при работе с последовательным портом?
  3. Как избежать ошибки в передаче данных, содержащих обратный слэш (\)?

 

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ

  1. Перед таблицей данных о температуре добавьте заголовок (например, "Meteostation").
  2. Добавьте столбец, содержащий количество секунд, прошедших с момента запуска микроконтроллера. Можно уменьшить интервал передачи данных.

 

С оригиналом статьи вы можете ознакомиться на сайте Amperka.ru


ЭКСПЕРИМЕНТ 15 | ОГЛАВЛЕНИЕ | ЭКСПЕРИМЕНТ 17

Категория: Простые эксперименты | Добавил: Decay_Dance (15.03.2016)
Просмотров: 2249 | Теги: электрические схемы, основы схемотехники, основы робототехники, электричество, микроконтроллеры, простые эксперименты, Arduino | Рейтинг: 5.0/1