Платы Arduino применяют во многих проектах, как простых радиолюбительских, так и серьезных профессиональных. Одним из довольно простых проектов на Arduino является устройство регистрации параметров окружающей среды. Зачастую таким параметром выступает температура, иногда к ней добавляется влажность.
Данный проект термометра на Arduino очень прост и рекомендуется для новичков с целью изучения экосистемы Arduino.
Помимо самой платы Arduino здесь используется датчик температуры DS18B20, два семисегментных семиразрядных индикатора для отображения температуры и сдвиговые регистры для управления индикаторами. Датчик DS18B20 имеет три вывода – питание, земля и информационный выход. Поэтому для его подключения понадобится только одна линия Arduino. Как и в случае с другими датчиками, имеется удобная библиотека, которая позволяет легко получать температуру в градусах Цельсия или Фаренгейта, эта библиотека носит название Dallas_Temperature. Перед подключением DS18B20 к Arduino необходимо установить резистор сопротивлением 4.7 КОм между линией питания и информационным выходом. Этот выход впоследствии соединяем с линией D7 платы Arduino. Чтобы использовать минимальное количество линий Arduino для управления семисегментными индикаторами, следует применить два сдвиговых регистра, тогда можно обойтись тремя выводами Arduino для отображения температуры. Схема подключения всего устройства показана ниже.
Далее приведен код (скетч) для Arduino.
#include OneWire.h
#include DallasTemperature.h
// назначение выводов
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int tempPin = 7;
// настройка библиотек
OneWire oneWire(tempPin);
DallasTemperature tempSens(&oneWire);
// символы от 0 до 9 для отображения на индикаторах
byte numberSet[10] = {
B01111011, B01000001, B00110111, B01100111, // 0,1,2,3
B01001101, B01101110, B01111110, B01000011, // 4,5,6,7
B01111111, B01101111 // 8,9
};
void setup() {
// последовательный порт
Serial.begin(9600);
// инициализация датчика температуры
tempSens.begin();
// настройка выводов для сдвиговых регистров
pinMode(latchPin, OUTPUT);
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
}
void loop() {
tempSens.requestTemperatures();
float t = tempSens.getTempCByIndex(0);
Serial.println(t);
int rT = (int)t;
int units = rT % 10;
rT = rT/10;
int tens = rT % 10;
displayNumb(units, tens);
delay(100);
}
void displayNumb(int a, int b) {
byte bitsA = numberSet[a];
byte bitsB = numberSet[b];
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, bitsA);
shiftOut(dataPin, clockPin, bitsB);
digitalWrite(latchPin, HIGH);
}
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
int i=0;
int pinState;
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
if ( myDataOut & (1< pinState= 1;
}
else {
pinState= 0;
}
digitalWrite(myDataPin, pinState);
digitalWrite(myClockPin, 1);
digitalWrite(myDataPin, 0);
}
digitalWrite(myClockPin, 0);
}
© digitrode.ru