25 февраля 2013-го

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Heat-o-Meter (измерение температуры).

25 февраля 2013, 18:26

Arduino можно использовать для измерения температуры.
Переключатели и кнопки — замечательно, но реальный мир вокруг не всегда можно описать двумя состояниями (вкл. и выкл.)

Немного теории:

Несмотря на то, что Arduino  — это цифровое устройство, оно может получать информацию с аналоговых сенсоров для измерения температуры или освещенности. Для этих целей необходимо использовать встроенный в Arduino аналого-цифровой перобразователь (АЦП). Аналоговые входы A0-A5 выдают значение от 0 до 1023, что соответствует напряжению от 0 до 5-ти вольт.

Для измерения температуры мы использовали температурный сенсор (TMP 36).

Термосенсор (TMP36)

Этот компонент изменяет напряжение на выходе в зависимости от температуры окружающей среды. Датчик имеет три контакта: один подсоединяется на «ground», второй  — на «power», а третий, который выдает изменяющееся напряжение, подсоединяется к Arduino. В программе для этого проекта мы будем считывать значения, которые выдает сенсор, и использовать их для включения и выключения светодиодов для индикации температуры.

Теперь к практике. Как обычно, сначала рисуем «схему»:

В собранном виде на макетной плате, она выглядит так:

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

Вот такая получилась программа, для считывания и вывода информации с сенсора:

int spin = A0; //датчик температуры
void setup(){
  Serial.begin (9600);//для вывода на экран компьютера
}
void loop(){
  int sVal = analogRead(spin);//Считываем информацию с сенсора
  Serial.print(«Sensor Value: „);//выводим значение на экран компьютера
  Serial.print(sVal);
  //конвертируем значение в вольты
  float v=(sVal/1024.0)*5.0;
  Serial.print(“, Volts: „);
  Serial.print(v);
  Serial.print(“, degrees C: „);
  //переводим вольты в градусы
  float t=(v-0.5)*100;
  Serial.println(t);
}

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

Как расчитывается температура? Сначала необходимо понять сколько вольт получается на выходе термосенсора. Поскольку всего может быть 1024 значения (от 0 до 1023), а напряжение от 0В до 5В, используется формула [значение на аналоговом входе]* 5В/1024. Затем по документации на этот термосенсор переводим выдаваемое им напряжение в градусы по шкале Цельсия t=(v-0.5)*100.

Вот как выглядят результаты работы программы:

Теперь программируем работу светодиодов. Базовой температурой будем считать 23 градуса (такая температура была у нас в комнате). Если термосенсор нагревается на 2 градуса — загорается первый диод, еще на 2 (всего на 4) — второй диод, затем еще на 4 градуса (всего на 8) — третий диод.

Параллельно а работой над программой мы решили, что будет интереснее сделать светодиоды разноцветными:

Макет с разноцветными диодами

Вот наша программа:

int spin = A0; //датчик температуры
float basetemp= 23.0; //комнатная температура
int led1 = 2;//красный
int led2 = 3;//жёлтый
int led3 = 4;//зелёный

void setup(){
  Serial.begin (9600);//для вывода на экран компьютера
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  digitalWrite(led1,LOW);
  digitalWrite(led2,LOW);
  digitalWrite(led3,LOW);
}

void loop(){
  int sVal = analogRead(spin);
  Serial.print(«Sensor Value: „);//выводим информацию на экран компьютера
  Serial.print(sVal);
  //конвертируем значение в вольты
  float v=(sVal/1024.0)*5.0;
  Serial.print(“, Volts: „);
  Serial.print(v);
  Serial.print(“, degrees C: „);
  //переводим вольты в градусы
  float t=(v-0.5)*100;
  Serial.println(t);
  if(t<basetemp){//температура поднимается на 2 градуса — ничего не горит
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led1,LOW);
  }
  else if( (t>=basetemp+2)&&(t<basetemp+4) ){//температура подниамется от 2 до 4 градусов горит только зеленый
    digitalWrite(led2,LOW);
    digitalWrite(led3,HIGH);
    digitalWrite(led1,LOW);
  }
  else if( (t>=basetemp+4)&&(t<basetemp+8) ){
    digitalWrite(led2,HIGH);
    digitalWrite(led3,LOW);
    digitalWrite(led1,LOW);
  }
  else if (t>=basetemp+8){
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led1,HIGH);
  }
}

Результаты работы программы:

21 февраля 2013   · · ·
Ctrl
· · ·   1 марта 2013