/*
* Набор для экспериментов ArduinoKit
* Код программы для опыта №7: sketch 07
*
* Датчик температуры
*
* Написано для сайта http://arduinokit.ru
*
*
* Помощь сообщества Arduino.
* Посетите сайт http://www.arduino.cc
*
*
* ДАТЧИК ТЕМПЕРАТУРЫ
*
* Использование «Монитора порта» (Serial Monitor), чтобы прочитать
* показания датчика температуры.
*
* TMP35/TMP36/TMP37 являются простыми в использовании датчиками температуры,
* которые меняют напряжение на своем выходе прямо пропорционально температуре
* окружающей среды. Вы можете использовать их во всех видах задач
* автоматизации, где необходимо использовать изменение параметров в
* зависимости от изменения температуры.
*
*
* Передача информации от Arduino компьютеру тема еще более интересная, чем
* предыдущие опыты, — мы начнем использовать последовательный порт Arduino.
* До сих пор мы ограничивались в использовании простых светодиодов для индикации
* каких либо событий. Теперь мы убедимся, что Arduino можете не только
* сигнализировать о чем либо, но и с легкостью общаться с компьютером, если это
* необходимо, а также выводить все виды текста и данных на любой терминал.
*

* Подключение оборудования:
*
*  Будьте осторожны при установке датчика температуры, т.к. он очень
*  похож на транзистор и есть шанс ошибиться! Вам нужен тот, на котором нет
*  надписи 222, а есть треугольный логотип или надпись «TMP».
*
*  Если повернуть датчик плоской стороной к себе, а выводами вниз, то
*  назначение выводов будет таким (с лева на право): 5V, СИГНАЛ, и GND.
*
*  Подключите вывод датчика «5V» к  общей шине +5 вольт.
*  Подключите вывод «Сигнал» к аналоговому порту 0 (Pin0).
*  Подключите вывод «GND» к земляной шине (GND).
*
*  Комментарий к программе переведен
*  11 октября 2014
*  специально для http://arduinokit.ru
*
*/

// Мы будем использовать аналоговый порт 0 (Pin0) для снятия
// показаний с сигнального вывода датчика температуры.

const int temperaturePin = 0;

void setup()
{

// В этом скетче, мы будем используем последовательный порт Arduino,
// чтобы передать текст обратно на компьютер.
// Для того чтобы общение происходило корректно, необходимо соблюсти
// общий протокол обмена данными, а также скорость передачи информации.
// Для этого мы воспользуемся функцию Serial.begin(), она используется
// для инициализации порта и согласования скорости связи.

// Скорость передачи информации через последовательный порт измеряется в
// битах в секунду, кстати бит может быть либо логической «единицей»,
// либо логическим «нулем». «baud rate» — скорость передачи.
// Скорость 9600 является очень широко используемой при передачи данных,
// хотя и очень медленной, при такой скорости передается примерно 10
// символов в секунду.

Serial.begin(9600);
}

void loop()
{
// До сих пор мы использовали для наших скетчей только целые числа («INT»),
// «int» в переводе на русский — целые числа — 0, 1, 23 и т.д..
// В этй программе, мы будем использовать значения «float».
// «Float» в переводе с английского – плавающий, у таких чисел помимо целой,
// есть еще дробная часть например, 1,42, 2523,43121 и т.д.

// Мы объявляем три переменных, все они будут «float», т.е. дробные, или как
// еще говорят с плавающей точкой. Мы можем объявить несколько переменных
// одного типа за раз, на одной строчке, через запятую с пробелом:

float voltage, degreesC, degreesF;

// Сначала мы измерим напряжение на аналоговом входе. Обычно для этого мы
// использовали функцию analogRead(), которая возвращает число от 0 до 1023.
// Здесь же мы написали специальную функцию, о ней чуть дальше, под
// названием getVoltage(), которая возвращает напряжение (от 0 до 5 вольт),
// присутствующего на аналоговом входе.

voltage = getVoltage(temperaturePin);

// Теперь мы преобразовываем напряжения в градусы Цельсия.
// В этой формуле используются данные полученные с датчика температуры.
// Следующая формула работает для датчика TMP36:

degreesC = (voltage — 0.5) * 100.0;

// Если у вас датчик TMP35 формулу нужно немного изменить,
// соответственно закомментируйте функцию выше и раскомментируйте
// следующую, в ней ничего не надо вычитать, так как у TMP35
// выходное напряжение 0,25 милли вольт, а не 0,75 как у TMP36:

// degreesC = voltage * 100.0;

// Хотя нам это и не очень нужно, но давайте преобразуем градусы Цельсия (C)
// в градусы Фаренгейта (F) (система используемая в США).
// Это классическая формула преобразования C в F:

degreesF = degreesC * (9.0/5.0) + 32.0;

// Теперь мы будем использовать последовательный порт для вывода
// данных на монитор!

// Чтобы открыть окно монитора порта, нужно загрузить код, а затем
// нажать кнопку «увеличительное стекло» на правом краю панели
// инструментов Arduino IDE, откроется дополнительное окно монитора COM порта.

// (ПРИМЕЧАНИЕ: не забудьте, о чем мы говорили ранее, что скорость передачи
// должна быть одинаковой для обеих сторон (передающей стороны и принимающей.
// Убедитесь, что контроль скорости передачи в нижней части окна установлен
// в 9600. Если это не так, исправьте его на 9600.)

// Также обратите внимание, что каждый раз, когда вы загружаете
// новый скетч в Arduino, окно монитора порта закрывается. Это
// происходит потому что последовательный порт используется также
// и для загрузки кода! Когда загрузка будет завершена, вы можете
// повторно открыть окно монитора COM порта.

// Для передачи данных от Arduino в COM порт, мы используем функцию
// Serial.print(). Вы можете добавить свой текст напечатав его в кавычках.
// С русскими символами монитор не дружит! Сразу за вашим текстом будет
// впечатано значение переменной, см. ниже, оно без кавычек, их 3 —
// voltage, degreesC, degreesF:

Serial.print(«voltage: «);
Serial.print(voltage);
Serial.print(»  deg C: «);
Serial.print(degreesC);
Serial.print(»  deg F: «);
Serial.println(degreesF);

// Вывод информации будет иметь вид подобно следующему:
// «voltage: 0.73 deg C: 22.75 deg F: 72.96»

// Обратите внимание, что все переменные выше заявлены как
// «Serial.print», а для последнего «Serial.println».
// Все слова и значения переменных будут выведены на экран в одной строке,
// а вот после последней переменной будет произведен «перевод каретки»
// на новую строку, за это как раз и отвечает «println».

delay(1000); // повторение через одну секунду (можете поменять!)
}

float getVoltage(int pin)
{
// Эта функция имеет один входной параметр, получаемый с аналогового
// порта. Вы могли заметить, что эта функция не имеет ключевого «void»,
// хотя «void» должен использоваться при объявлении функций, но если
// только функция не возвращает никакого значение, у нас как раз случай,
// наоборот, потому что возвращается значение с плавающей точкой,
// которое является настоящим напряжением на этом выводе (от 0 до 5 В).

// Вы можете написать свои собственные функции, которые принимают
// что-то в параметрах, и после возвращают какие-либо значения:

// Чтобы что-то принять в параметрах, укажите их тип и имя в скобках,
// после имени функции (смотри выше). Вы можете указать несколько
// параметров, разделенных запятыми.

// Чтобы возвратить значение, укажите тип перед именем функции,
// помните пример «float», и используйте функцию return() для возврата
// значение (см ниже).

// Если у вас нет необходимости, что-то получить, просто используйте
// пустые скобки «()» после имени функции.

// Если у вас нет необходимости возвращать какое либо значение,
// просто укажите «void» перед именем функции.

// Далее идет оператор возврата return() для нашей функции. Мы
// делаем все вычисления которые должны сделать:

return (analogRead(pin) * 0.004882814);

// Это уравнение преобразует значение напряжения от 0,0 до 5,0 В.,
// полученное с помощью функции analogRead() с аналогового порта,
// в значения от 0 до 1023.
}

// Как еще можно попробовать использовать этот код?

// Например включить светодиод, если температура становится выше
// или ниже заданного значения.

// Прочитать показания с потенциометра — получится термостат!
// Ну и так далее, все в ваших руках!