Урок 16. Метеостанция

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

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

Принципиальная схема

Урок 16. Метеостанция. Принципиальная схема

Схема на макетке

Урок 16. Метеостанция. Схема на макетке

Скетч

  1.     #include <math.h>
  2.     int minute = 1;
  3.  
  4.     // Параметр конкретного типа термистора (из datasheet):
  5.     #define TERMIST_B 4300 
  6.  
  7.     #define VIN 5.0
  8.  
  9.     void setup()
  10.     {
  11.       // мы хотим передавать информацию на компьютер через USB, а
  12.       // точнее через последовательный (англ. serial) порт.
  13.       // Для этого необходимо начать (англ. begin) передачу, указав
  14.       // скорость. 9600 бит в секунду — традиционная скорость.
  15.       // Функция «begin» не является глобальной, она принадлежит
  16.       // объекту с именем «Serial». Объекты — это «продвинутые»
  17.       // переменные, которые обладают собственными функциями,
  18.       // к которым обращаются через символ точки.
  19.       Serial.begin(9600);
  20.       // передаём заголовок нашей таблицы в текстовом виде, иначе
  21.       // говоря печатаем строку (англ. print line). Символы «\t» —
  22.       // это специальная последовательность, которая заменяется на
  23.       // знак табуляции (англ. tab): 8-кратный выровненный пробел
  24.       Serial.println("Minute\tTemperature");
  25.     }
  26.  
  27.     void loop()
  28.     {
  29.       // вычисляем температуру в °С с помощью магической формулы.
  30.       // Используем при этом не целые числа, а вещественные. Их ещё
  31.       // называют числами с плавающей (англ. float) точкой. В
  32.       // выражениях с вещественными числами обязательно нужно явно
  33.       // указывать дробную часть у всех констант. Иначе дробная
  34.       // часть результата будет отброшена
  35.  
  36.        float voltage = analogRead(A0) * VIN / 1024.0;
  37.        float r1 = voltage / (VIN - voltage);
  38.  
  39.  
  40.        float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
  41.       // печатаем текущую минуту и температуру, разделяя их табом.
  42.       // println переводит курсор на новую строку, а print — нет
  43.       Serial.print(minute);
  44.       Serial.print("\t");
  45.       Serial.println(temperature);
  46.  
  47.       delay(60000); // засыпаем на минуту
  48.       ++minute;     // увеличиваем значение минуты на 1
  49.  
  50.       // откройте окно Serial Monitor в среде Arduino, оставьте на
  51.       // сутки, скопируйте данные в Excel, чтобы построить графики
  52.     }

Пояснения к коду

  • В данном эксперименте мы знакомимся со стандартным объектом Serial, который предназначен для работы с последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с данным объектом) begin(), print() и println(), которые вызываются после точки, идущей за именем объекта:
  • Очень часто бывает полезно обмениваться данными, например, с компьютером. В частности, для отладки работы устройства: можно, например, смотреть, какие значения принимают переменные.
    • чтобы обмениваться данными, нужно начать соединение, поэтому Serial.begin(baudrate) вызывается в setup()
    • Serial.print(data) отправляет содержимое data. Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек: "". Кириллица, скорее всего, будет отображаться некорректно.
    • Serial.println(data) делает то же самое, только добавляет в конце невидимый символ новой строки.
  • В print() и println() можно использовать второй необязательный параметр: выбор системы счисления, в которой выводить число (это может быть DEC, BIN, HEX, OCT для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел.

Например,

  1. Serial.println(18,BIN);
  2. Serial.print(3.14159,3);

в мониторе порта даст результат

  1. 10010
  2. 3.142
  • Монитор порта, входящий в Arduino IDE, открывается через меню Сервис или сочетанием клавиш Ctrl+Shift+M. Следите за тем, чтобы в мониторе и в скетче была указана одинаковая скорость обмена данными, baudrate. Скорости 9600 бит в секунду обычно достаточно. Другие стандартные значения можете посмотреть в выпадающем меню справа внизу окна монитора порта.
  • Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.
  • При запуске монитора порта скетч в микроконтроллере перезагружается и начинает работать с начала. Это удобно, если вам нельзя упустить какие-то данные, которые начинаю передаваться сразу же. Но в других ситуациях это может мешать, помните об этом нюансе!
  • Если вы хотите читать какие-то данные в реальном времени, не забывайте делать delay() хотя бы на 100 миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать. Вы можете отправлять данные и без задержки, а затем, к примеру, скопировать их для обработки в стороннем приложении.
  • Последовательность \t выводится как символ табуляции (8 пробелов с выравниванием). Также вы можете использовать, например, последовательность \n для перевода строки. Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же: \\.

Вопросы для проверки себя

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

Задания для самостоятельного решения

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

 

Источник: 
wiki.amperka.ru