Для данного практического занятия нам понадобятся:
1 - плата контроллера Ардуино УНО
2 - плата расширения LCD KeyPad шилд
3 - датчик температуры Ds18b20
4 - резистор 4,7 КОм
5 - макетная плата с набором проводов
6 - кабель microUSB > USB
Подключаем все по схеме ниже:
Скачиваем архив OneWire.zip
Распаковываем и копируем распакованную папку с библиотекой в папку libraries программы Arduino IDE.
Библиотека LiquidCrystal у нас уже должна быть установлена, после предыдущих занятий.
Если ее нет, то переходим в тему Урока 12, скачиваем, распаковываем и устанавливаем ее.
Затем запускаем среду разработки Arduino IDE и копируем туда вот этот тестовый скетч:
- Код: выделить все
#include <LiquidCrystal.h>
#include <OneWire.h>
OneWire ds(2); // подключаем датчик к входу 2
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int lcd_key = 0;
int adc_key_in = 0;
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
int read_LCD_buttons() {
adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 600) return btnLEFT;
if (adc_key_in < 920) return btnSELECT;
return btnNONE;
}
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Termometr");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print("T = ");
lcd.print(celsius);
lcd.print(" C");
lcd_key = read_LCD_buttons();
switch (lcd_key) {
case btnRIGHT: {
lcd.print("RIGHT ");
break;
}
case btnLEFT: {
lcd.print("LEFT ");
break;
}
case btnUP: {
lcd.print("UP ");
break;
}
case btnDOWN: {
lcd.print("DOWN ");
break;
}
case btnSELECT: {
lcd.print("SELECT");
break;
}
case btnNONE: {
lcd.print(" ");
break;
}
}
//----------Считываем данные с датчика DS18B20-----------------------------------
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
for( i = 0; i < 8; i++) {
}
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
delay(1000);
present = 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 {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;
}
celsius = (float)raw / 16.0;
}