Эксперимент 41. Двухзонный термометр с LCD дисплеем

Теперь у нас есть опыт создания аналогового термометра с термистором в качестве датчика, и цифрового с датчиком DS18B20. Почему бы не объединить эти датчики, чтобы сделать двухзонный термометр. Учитывая исполнение датчиков, с помощью DS18B20 можно измерять температуру в комнате, а термистор в корпусе вывести на улицу, чтобы видеть на дисплее данные о температуре в комнате и на улице одновременно.

Схема эксперимента

Рисунок 1. Монтажная схема эксперимента

Программный код эксперимента

Exp41.ino
  1. #include <OneWire.h>
  2. #include <DallasTemperature.h>
  3. #include <LCDI2C_Multilingual.h>
  4.  
  5. #define ACD_PIN A0
  6. #define BUS_PIN 12
  7. #define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
  8.  
  9. const int Bcoef = 3950;
  10. const int R1 = 10000;
  11. const int Rtnom = 10000;
  12. const float T0 = 273.15;
  13.  
  14. OneWire oneWire(BUS_PIN);
  15. DallasTemperature sensors(&oneWire);
  16. LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
  17.  
  18. void setup() {
  19. sensors.begin();
  20. lcd.init();
  21. lcd.setBacklight(0);
  22. }
  23.  
  24. void loop() {
  25. int value = analogRead(ACD_PIN);
  26. float R2 = (-R1 * value) / (value - 1023);
  27. float temp_outodor = 1 / (log(R2 / Rtnom) / Bcoef + 1/(25 + T0)) - T0;
  28.  
  29. sensors.requestTemperatures();
  30. float temp_inroom = sensors.getTempCByIndex(0);
  31.  
  32. lcd.clear();
  33. lcd.print("Outodor: ");
  34. lcd.println(temp_outodor, 1);
  35. lcd.print("In room: ");
  36. lcd.print(temp_inroom, 1);
  37. delay(1000);
  38. }

Код программы состоит из кода двух экспериментов, посвящённых термометру на термисторе и термометру на DS18B20.

Сначала подключаем необходимые библиотеки:

  1. #include <OneWire.h>
  2. #include <DallasTemperature.h>
  3. #include <LCDI2C_Multilingual.h>

Задаем псевдонимы для пина АЦП, пина шины 1-Wire и адреса дисплея.

  1. #define ACD_PIN A0
  2. #define BUS_PIN 12
  3. #define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT5;

Определяем константы, необходимые для вычисления температуры с помощью терморезистора (подробно разбиралось в Проекте 3. "Термометр").

  1. const int Bcoef = 3950;
  2. const int R1 = 10000;
  3. const int Rtnom = 10000;
  4. const float T0 = 273.15;

Создаем объекты шины 1-Wire, датчика DS18B20 и дисплея:

  1. OneWire oneWire(BUS_PIN);
  2. DallasTemperature sensors(&oneWire);
  3. LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);

В функции setup() инициализируем объекты датчика и дисплея, включаем подсветку.

  1. sensors.begin();
  2. lcd.init();
  3. lcd.setBacklight(0);

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

  1. int value = analogRead(ACD_PIN);

Определяем сопротивление термистора, из которого вычисляем температуру (подробно рассматривалось в эксперименте 32) и сохраняем в переменной temp_outodor:

  1. float R2 = (-R1 * value) / (value - 1023);
  2. float temp_outodor = 1 / (log(R2 / Rtnom) / Bcoef + 1/(25 + T0)) - T0;

Считываем температуру из датчика DS18B20 и сохраняем в переменной temp_inroom:

  1. sensors.requestTemperatures();
  2. float temp_inroom = sensors.getTempCByIndex(0);

!!!!!!!Выводим температуру в комнате и на улице в терминал. Перед выводом температур преобразовываем их из чисел в строки с помощью оператора str(): <code arduino[enable_line_numbers=«2», start_line_numbers_at=«37»]> print(«Outodor: » + str(inroom_temp)) print('In room: ' + str(outodor_temp)) </code>

Очищаем дисплей (при этом курсор дисплея перемещается в верхний левый угол), выводим строку с информацией о температуре на улице. Функция lcd.println() переводит курсор на следующую строку после вывода заданного текста.

  1. lcd.clear();
  2. lcd.print("Outodor: ");
  3. lcd.println(temp_outodor, 1);

Перемещаем курсор дисплея на нулевой (самый левый) символ второй строки и выводим информацию о температуре в комнате:

  1. lcd.print("In room: ");
  2. lcd.print(temp_inroom, 1);

Пауза на 1 секунду перед следующим измерением:

  1. delay(1000);