Метеостанция

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

Список деталей для эксперимента

  • 1 плата Arduino Uno

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

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

  • 1 термистор

  • 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 для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел.

  • Например, .. code-block:: c

    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. Добавьте столбец, содержащий количество секунд, прошедших с момента запуска микроконтроллера. Можно уменьшить интервал передачи данных.