DHT11 и энкодер

Дим
Offline
Зарегистрирован: 05.05.2017

Здравствуйте, собрал схему DHT11 с вывом информации на 1602 экран. Всё работает нормально, но решил добавить энкодер для регулировки подсветки дисплея и не получилось. Т.e отдельно - без кода датчика, регулировать можно, но если добавлю код для считывания показаний с датчика - не работает.

#include <LiquidCrystal.h>
#include <Encoder.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 8// датчик темп и влаж
// 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


byte PE_lit[8] = {B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000,};
byte EL_lit[8] = {B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000,};
byte ZH_lit[8] = {B10001, B10101, B10101, B01110, B10101, B10101, B10001, B00000,};
byte MZ_lit[8] = {B10000, B10000, B10000, B11110, B10001, B10001, B11110, B00000,};
byte U_lit[8] =  {B10001, B10001, B10001, B01111, B00001, B00001, B11110, 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 ); // Энкодер
int Bright = 100;
int accel = 1;
long oldPosition = 0;
int i = 0;

void setup()
{
  lcd.createChar(1, PE_lit);
  lcd.createChar(2, U_lit);
  lcd.createChar(3, EL_lit);
  lcd.createChar(4, ZH_lit);
  lcd.createChar(5, MZ_lit);
  
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("TEM\1EPAT\2PA");
  lcd.setCursor(1, 1);
  lcd.print("B\3A\4HOCT\5");
  
  analogWrite(PWM_LED_PIN, Bright);
}

void loop()
{
  long newPosition = myEnc.read() / accel;
    if (newPosition > oldPosition) 
    {       
    analogWrite(PWM_LED_PIN, newPosition);
      Bright += 5;
      if ( Bright > 255 )
        Bright = 255;
    }
    else
    if (newPosition < oldPosition)
    {
    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 );
    } 
//== закоментировав данный код - регулировка работае т==
  int chk = DHT11.read(DHT11PIN);
  lcd.setCursor(12, 0);
  lcd.print((float)DHT11.temperature, 1);
  lcd.setCursor(12, 1);
  lcd.print((float)DHT11.humidity, 1);  
  delay(2000); 
//================================================
}
kalapanga
Offline
Зарегистрирован: 23.10.2016
Дим
Offline
Зарегистрирован: 05.05.2017

kalapanga пишет:

Изучайте Мигаем светодиодом без delay()

Благодарю, получилось, только верно или нет я наколхозил? И ещё ни как не смог найти - как сделать действие  нажатие на энкодер (шток) и длительное нажатие.

#include <LiquidCrystal.h>
#include <Encoder.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 8// датчик темп и влаж
// 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


byte PE_lit[8] = {B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000,};
byte EL_lit[8] = {B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000,};
byte ZH_lit[8] = {B10001, B10101, B10101, B01110, B10101, B10101, B10001, B00000,};
byte MZ_lit[8] = {B10000, B10000, B10000, B11110, B10001, B10001, B11110, B00000,};
byte U_lit[8] =  {B10001, B10001, B10001, B01111, B00001, B00001, B11110, 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 ); // Энкодер
int Bright = 100;
int accel = 1;
long oldPosition = 0;
int i = 0;
long previousMillis = 0;        
long interval = 2000;           

void setup()
{
  lcd.createChar(1, PE_lit);
  lcd.createChar(2, U_lit);
  lcd.createChar(3, EL_lit);
  lcd.createChar(4, ZH_lit);
  lcd.createChar(5, MZ_lit);
  
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("TEM\1EPAT\2PA");
  lcd.setCursor(1, 1);
  lcd.print("B\3A\4HOCT\5");
  
  Serial.begin(9600);
  Serial.println("Basic Encoder Test:");
  analogWrite(PWM_LED_PIN, Bright);
}

void loop()
{

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
  previousMillis = currentMillis; 

  int chk = DHT11.read(DHT11PIN);
  lcd.setCursor(12, 0);
  lcd.print((float)DHT11.temperature, 1);
  lcd.setCursor(12, 1);
  lcd.print((float)DHT11.humidity, 1);  
  }  
    long newPosition = myEnc.read() / accel;
    if (newPosition > oldPosition) 
    {       
    Serial.println(newPosition);
    analogWrite(PWM_LED_PIN, newPosition);
      Bright += 5;
      if ( Bright > 255 )
        Bright = 255;
    }
    else
    if (newPosition < oldPosition)
    {
    Serial.println(newPosition);
    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);
    } 
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

О коротком и длинном нажатии смотрите в темах про кнопки - это же обычная кнопка. В начале раздела закрепленные темы о кнопках есть, или в строке поиска справа вверху наберите что-нибудь типа "долгое нажатие" - выдаст кучу тем

Дим
Offline
Зарегистрирован: 05.05.2017

kalapanga пишет:

О коротком и длинном нажатии смотрите в темах про кнопки - это же обычная кнопка. В начале раздела закрепленные темы о кнопках есть, или в строке поиска справа вверху наберите что-нибудь типа "долгое нажатие" - выдаст кучу тем

Да нашёл класс титановый велосипед для тактовой кнопки. Но что то не очень в нём разобрался. Допустим мне на одну кнопку нужно сделать 2 действия:

1. На короткое - написать в порт "1"

2. Если отпущено и нективно - написать в порт "2"

Но если отпущено и нективно в порт пишет: сначала 1, а потом 2

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Дим пишет:

Да нашёл класс титановый велосипед для тактовой кнопки. Но что то не очень в нём разобрался. Допустим мне на одну кнопку нужно сделать 2 действия:

1. На короткое - написать в порт "1"

2. Если отпущено и нективно - написать в порт "2"

Но если отпущено и нективно в порт пишет: сначала 1, а потом 2

А шо не так? Кнопка нажата и отпущена? Да, выводим 1. Кнопка отпущена и неактивна? Да, выводим 2. Всё верно работает. Да и по вашим вводным - именно так и должно работать, перечитайте условия свои.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

     Если отпущено и нективно - написать в порт "2"

Но если отпущено и нективно в порт пишет: сначала 1, а потом 2

А можно узнать, почему при одном и том же условии - выполняются разные действя

Дим
Offline
Зарегистрирован: 05.05.2017

vosara пишет:

     Если отпущено и нективно - написать в порт "2"

Но если отпущено и нективно в порт пишет: сначала 1, а потом 2

А можно узнать, почему при одном и том же условии - выполняются разные действя

А с чего вы взяли что выполняются разные действия?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А Вы считаетет что "написать в порт "2"" и "в порт пишет: сначала 1, а потом 2" - это одно и то же?

b707
Offline
Зарегистрирован: 26.05.2017

Дим пишет:

А с чего вы взяли что выполняются разные действия?

Да потому что "короткое нажатие" всегда заканчивается состоянием "отпущено и неактивно". Так что проблема не в классе "титанового", а неправильной формулировке задачи.

Дим
Offline
Зарегистрирован: 05.05.2017

Настряпал некий код. Вроде работает. Знающие люди, посмотрите пожалуйста, чего у меня получилось.

При включении аппарата подсветка не горит

При нажатии на энкодер-кнопку - загорается на 5 сек (хотелось бы что бы медленно угасал)

При повороте ручки - увеличении/уменьшении подсветки

#include <LiquidCrystal.h>
#include <Encoder.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 8// датчик темп и влаж
// 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

byte PE_lit[8] = {B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000,};
byte EL_lit[8] = {B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000,};
byte ZH_lit[8] = {B10001, B10101, B10101, B01110, B10101, B10101, B10001, B00000,};
byte MZ_lit[8] = {B10000, B10000, B10000, B11110, B10001, B10001, B11110, B00000,};
byte U_lit[8] =  {B10001, B10001, B10001, B01111, B00001, B00001, B11110, 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);

int Bright = 0;
int value = 0;
int accel = 1;
int i = 0;
int clic = 0;
int flag=0;
long oldPosition = 0;
long interval = 2000; 
long previousMillis = 0;
 int val=0;
 
void setup()
{
 
  Serial.begin(9600);
  pinMode(12, INPUT_PULLUP);
  pinMode(13,OUTPUT);
  digitalWrite(13,HIGH);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("TEM\1EPAT\2PA");
  lcd.setCursor(1, 1);
  lcd.print("B\3A\4HOCT\5");
  analogWrite(PWM_LED_PIN, Bright);
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) 
  {
    previousMillis = currentMillis;
    int chk = DHT11.read(DHT11PIN);
    lcd.setCursor(12, 0);
    lcd.print((float)DHT11.temperature, 1);
    lcd.setCursor(12, 1);
    lcd.print((float)DHT11.humidity, 1); 
    Serial.println("TEMP");
  } 
//=== если нажата кнопка 100% подсветка ==
  value = digitalRead(12);
  if (value == LOW)
  {
     Serial.println("wibor++");
     analogWrite( PWM_LED_PIN, 255 );
     Bright = 500;
     clic = 1;
  }
//== отпущенная кнопка после Bright = 500 подсветка 0% ==
  else
  if (value == HIGH&&clic == 1)
  { 
  Bright--;  
  Serial.println("wibor--");
 // analogWrite( PWM_LED_PIN, Bright );
    if ( Bright <= 0 )
    {
      clic = 0;
      Bright = 0;
      analogWrite( PWM_LED_PIN, 0 );
    }
  }
//======
  long newPosition = myEnc.read() / accel;    
  if (newPosition > oldPosition) 
  {       
    Serial.println(newPosition);
    analogWrite(PWM_LED_PIN, newPosition);
    Bright += 5;
    if ( Bright > 255 )
    Bright = 255;
  }
  else
  if (newPosition < oldPosition)
  {
    Serial.println(newPosition);
    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);
  } 
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Дим пишет:

Настряпал некий код. Вроде работает. Знающие люди, посмотрите пожалуйста, чего у меня получилось.

Посмотрел, неинтересно. Работает - значит хорошо.

 

Дим пишет:

При включении аппарата подсветка не горит

И не должна. Активируете - будет гореть. А не активируете - ей самой этого и не надо. Законы природы такие.
 

Дим пишет:

При нажатии на энкодер-кнопку - загорается на 5 сек (хотелось бы что бы медленно угасал)

Уменьшайте подсветку на каждом вызове loop(), в чем затруднение?
 
Дим
Offline
Зарегистрирован: 05.05.2017

При включении аппарата подсветка не горит - мне так и нужно.

Уменьшайте подсветку на каждом вызове loop() - слишком быстро получается

sadman41
Offline
Зарегистрирован: 19.10.2016

Дим пишет:

При включении аппарата подсветка не горит - мне так и нужно.

Уменьшайте подсветку на каждом вызове loop() - слишком быстро получается

Значит уменьшайте каждые 500мс, к примеру: http://alxarduino.blogspot.ru/2013/09/BlinkAndPrintWithoutDelay.html

 

Дим
Offline
Зарегистрирован: 05.05.2017

Спасибо - дельная статья - помогла