DS18B20 + LCD 1602 + KY-040

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 16 декабря 2017, 15:04

DS18B20 + LCD 1602 + KY-040.jpg
DS18B20 + LCD 1602 + KY-040
DS18B20 + LCD 1602 + KY-040.jpg (178.36 КБ) 1395 просмотров


Подключение и код очень похоже на подключение 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 = (+ 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;
    }
  }
}


В итоге должно получиться что то на подобии такого девайса :grin:

DS18B20 + LCD 1602 + KY-040 в корпусе.jpg
DS18B20 + LCD 1602 + KY-040 в корпусе
DS18B20 + LCD 1602 + KY-040 в корпусе.jpg (206.48 КБ) 1394 просмотра
[center]i love you [s]mxIni[/s] Mysql[/center]


Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#2 Дим » 16 декабря 2017, 17:53

Заметив некую странность - а именно после отключения питания после точки становится не два а три знака. Как оказалось это не очищалась последняя ячейка. Решение было найдено добавлением пробела в конце строки. lcd.print(" ");
Теперь void temp(unsigned long interval ) выглядит так. Это теперь будет влиять на знак "градус", при отрицательной температуре (-) и более 9 градусов (2 символа до точки). Но можно и сам знак с буквой С пододвинуть на одну ячейку вправо.

Код: Выделить всё

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(1)2);   // Выводим показания температуры дома (2 - это сколько знаков после запятой)
    
lcd.setCursor(71);
    
Serial.println(sensors.getTempCByIndex(0));
    
lcd.print(sensors.getTempCByIndex(0),2);    // Выводим показания температуры улицы (2 - это сколько знаков после запятой у меня после перезагрузки появляется 2 знака -решение ниже)
    
lcd.print(" ");// пробел и ячейка с лишним нулём более не активна
    
Serial.println("TEMP");
    
  }
[center]i love you [s]mxIni[/s] Mysql[/center]


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя
Боты: Bing [Bot]