Разработка электронных часов с использованием микроконтроллера
1.8 Листинг программы
#include<LiquidCrystal.h>
#include <OneWire.h>
OneWireds(10); // Подключаем датчик к 8 цифровому пину
LiquidCrystallcd(12, 11, 5, 4, 3, 2); //Подключаем LCD
void setup(void)
{
pinMode(A0,INPUT);
pinMode(7, OUTPUT);
Serial.begin(9600);// Связь с ПК
lcd.begin(16, 2); //16 знаков, 2 строки
lcd.print("Temperature:"); //Печатаем верхнюю строку LCD
}
void loop(void)
{
bytei;
bytetype_s;
byte data[12];
byteaddr[8];
floatcelsius, fahrenheit;
inttemp_r;
// Ищем адрес датчика
if (!ds.search(addr))
{
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
// Проверяем не было ли помех при передаче
if (OneWire::crc8(addr, 7)!= addr[7])
{
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// Определяем серию датчика
switch (addr[0])
{
case 0x10:
Serial.println(" Chip = DS18S20");
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr); // Выбираем адрес
ds.write(0x44, 1); // Производим замер, в режиме паразитного питания
delay(1000);
ds.reset();
ds.select(addr);
ds.write(0xBE); // Считываем оперативную память датчика
for(i = 0; i < 9; i++)
{
data[i] = ds.read(); // Заполняем массив считанными данными
} // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
int16_t raw = (data[1] << 8) | data[0]; // Переводим температуру в шкалы по Цельсию и Фаренгейту
if (type_s)
{
raw = raw << 3;
}
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
} else {
bytecfg = (data[4] & 0x60);
if (cfg == 0x00)
raw = raw << 3;
else if (cfg == 0x20)
raw = raw << 2;
else if (cfg == 0x40)
raw = raw << 1;
}
celsius = (float)raw / 16.0;
temp_r = analogRead(A0) / 51+20;
if (celsius>temp_r)
{
digitalWrite(7, HIGH);
}
else
{
digitalWrite(7, LOW);
}
Serial.print("Temp = "); //ПишемвПКинформацию
Serial.print(celsius);
Serial.print(" C, ");
Serial.print(fahrenheit);
Serial.println(" Т");
lcd.setCursor(0, 1); //Пишем в LCD на 2 строке
lcd.print("C:");
lcd.setCursor(2, 1);
lcd.print(celsius); //Цельсии
lcd.setCursor(8, 1);
lcd.print("Т:");
lcd.setCursor(10, 1);
lcd.print(temp_r); // Задаваемаятемпература
}