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


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

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

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

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

Скетч

  1.     #include 
    
  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