Подключение и код очень похоже на подключение DHT11 + LCD 1602 + KY-040, только тут используется другой датчик. У меня используется один, для измерения температуры на улице. Но в дальнейшем планирую добавить ещё один для измерения температуры в помещении.
Код: Выделить всё
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <DallasTemperature.h> // Подключаем библиотеку DallasTempature
#define DS18B20 8 // Указываем, к какому выводу подключена DQ
// LCD пин управления яркостью
#define PWM_LED_PIN 9
// LCD другие пины
#define PIN_LCD_RS 7
#define PIN_LCD_E 6
#define PIN_LCD_D4 5
#define PIN_LCD_D5 4
#define PIN_LCD_D6 3
#define PIN_LCD_D7 2
// Энкодер
#define PIN_ENCODER_CLK 10
#define PIN_ENCODER_DT 11
#define PIN_ENCODER_SW 12
#define TEMP_INTERVAL 5000UL // интервал обновления данных темп (2 сек)
#define LCD_INTERVAL 20UL // скорость угасания подсветки LCD
byte bukva_B[8] = {B11110,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Б"
byte bukva_G[8] = {B11111,B10001,B10000,B10000,B10000,B10000,B10000,B00000,}; // Буква "Г"
byte bukva_D[8] = {B01111,B00101,B00101,B01001,B10001,B11111,B10001,B00000,}; // Буква "Д"
byte bukva_ZH[8] = {B10101,B10101,B10101,B11111,B10101,B10101,B10101,B00000,}; // Буква "Ж"
byte bukva_Z[8] = {B01110,B10001,B00001,B00010,B00001,B10001,B01110,B00000,}; // Буква "З"
byte bukva_I[8] = {B10001,B10011,B10011,B10101,B11001,B11001,B10001,B00000,}; // Буква "И"
byte bukva_IY[8] = {B01110,B00000,B10001,B10011,B10101,B11001,B10001,B00000,}; // Буква "Й"
byte bukva_L[8] = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"
byte bukva_P[8] = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000,}; // Буква "П"
byte bukva_Y[8] = {B10001,B10001,B10001,B01010,B00100,B01000,B10000,B00000,}; // Буква "У"
byte bukva_F[8] = {B00100,B11111,B10101,B10101,B11111,B00100,B00100,B00000,}; // Буква "Ф"
byte bukva_TS[8] = {B10010,B10010,B10010,B10010,B10010,B10010,B11111,B00001,}; // Буква "Ц"
byte bukva_CH[8] = {B10001,B10001,B10001,B01111,B00001,B00001,B00001,B00000,}; // Буква "Ч"
byte bukva_Sh[8] = {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00000,}; // Буква "Ш"
byte bukva_Shch[8]= {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00001,}; // Буква "Щ"
byte bukva_Mz[8] = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"
byte bukva_IYI[8] = {B10001,B10001,B10001,B11001,B10101,B10101,B11001,B00000,}; // Буква "Ы"
byte bukva_Yu[8] = {B10010,B10101,B10101,B11101,B10101,B10101,B10010,B00000,}; // Буква "Ю"
byte bukva_Ya[8] = {B01111,B10001,B10001,B01111,B00101,B01001,B10001,B00000,}; // Буква "Я
byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса
LiquidCrystal lcd(PIN_LCD_RS, PIN_LCD_E, PIN_LCD_D4, PIN_LCD_D5, PIN_LCD_D6, PIN_LCD_D7); // LCD
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
OneWire oneWire(DS18B20);
DallasTemperature sensors(&oneWire);
int Bright = 0;
int value = 0;
int accel = 1;
int i = 0;
int clic = 0;
long oldPosition = 0;
long interval = 2000;
long previousMillis = 0;
void setup()
{
Serial.begin(9600);
pinMode(12, INPUT_PULLUP);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
lcd.createChar(1, bukva_D);// Буква "Д"
lcd.createChar(2, bukva_Y);// Буква "У"
lcd.createChar(3, bukva_L);// Буква "Л"
lcd.createChar(4, bukva_I);// Буква "И"
lcd.createChar(5, bukva_TS);// Буква "Ц"
lcd.createChar(6, simvol); // Символ градуса
lcd.begin(16, 2);
lcd.setCursor(2, 0);
lcd.print("\1\OM:");//дом
lcd.setCursor(0, 1);
lcd.print("\2\3\4\5A:"); //Улица
lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13
lcd.print("\6"); // Выводим символ градуса
lcd.setCursor(14,0); // Устанавливаем курсор на 1 строку, ячейка 14
lcd.print("C"); // Выводим текст
lcd.setCursor(13,1); // Устанавливаем курсор на 2 строку, ячейка 13
lcd.print("\6"); // Выводим символ градуса
lcd.setCursor(14,1); // Устанавливаем курсор на 2 строку, ячейка 14
lcd.print("C");
}
void loop()
{
temp(TEMP_INTERVAL); // обновления данных темпер
if (clic == 1)
{
lcdl(LCD_INTERVAL); // угасания подсветки LCD
}
//=== если нажата кнопка, то 100% подсветка
value = digitalRead(PIN_ENCODER_SW);
if (value == LOW)
{
// Serial.println("wibor++");
analogWrite( PWM_LED_PIN, 255 );
Bright = 255;
clic = 1;
}
//=== ручка энкодера/регулироака
long newPosition = myEnc.read() / accel;
if (newPosition > oldPosition)
{
// Serial.println(">>>");
analogWrite(PWM_LED_PIN, newPosition);
Bright += 5;
if ( Bright > 255 )
Bright = 255;
}
else
if (newPosition < oldPosition)
{
// Serial.println("<<<");
analogWrite(PWM_LED_PIN, newPosition);
Bright -= 5;
if ( Bright < 0 )
Bright = 0;
}
if ( newPosition != oldPosition)
{
i = (i + 1)%16;
oldPosition = newPosition;
analogWrite( PWM_LED_PIN, Bright );
Serial.println(Bright);
}
}
void temp(unsigned long interval )
{
static unsigned long prevTime = 0; // время когда последний раз обновляли датчик
if(millis() - prevTime > interval)
{
sensors.requestTemperatures(); // Считываем показания температуры
prevTime = millis(); //
lcd.setCursor(12, 0);
// lcd.print(sensors.getTempCByIndex(0)2); // Выводим показания температуры дома (1 - это сколько знаков после запятой)
lcd.setCursor(7, 1);
lcd.print(sensors.getTempCByIndex(0),2); // Выводим показания температуры улицы (1 - это сколько знаков после запятой)
Serial.println("TEMP");
}
}
void lcdl(unsigned long interval)
{
static unsigned long prevTime=0;
if(millis()-prevTime>interval)
{
prevTime=millis();
Bright--;
analogWrite( PWM_LED_PIN, Bright );
if ( Bright <= 0 )
{
clic = 0;
Bright = 0;
}
}
}
В итоге должно получиться что то на подобии такого девайса