DHT11 и энкодер
- Войдите на сайт для отправки комментариев
Сб, 02/12/2017 - 18:48
Здравствуйте, собрал схему 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);
//================================================
}
Изучайте Мигаем светодиодом без delay()
Изучайте Мигаем светодиодом без 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); } }О коротком и длинном нажатии смотрите в темах про кнопки - это же обычная кнопка. В начале раздела закрепленные темы о кнопках есть, или в строке поиска справа вверху наберите что-нибудь типа "долгое нажатие" - выдаст кучу тем
О коротком и длинном нажатии смотрите в темах про кнопки - это же обычная кнопка. В начале раздела закрепленные темы о кнопках есть, или в строке поиска справа вверху наберите что-нибудь типа "долгое нажатие" - выдаст кучу тем
Да нашёл класс титановый велосипед для тактовой кнопки. Но что то не очень в нём разобрался. Допустим мне на одну кнопку нужно сделать 2 действия:
1. На короткое - написать в порт "1"
2. Если отпущено и нективно - написать в порт "2"
Но если отпущено и нективно в порт пишет: сначала 1, а потом 2
Да нашёл класс титановый велосипед для тактовой кнопки. Но что то не очень в нём разобрался. Допустим мне на одну кнопку нужно сделать 2 действия:
1. На короткое - написать в порт "1"
2. Если отпущено и нективно - написать в порт "2"
Но если отпущено и нективно в порт пишет: сначала 1, а потом 2
А шо не так? Кнопка нажата и отпущена? Да, выводим 1. Кнопка отпущена и неактивна? Да, выводим 2. Всё верно работает. Да и по вашим вводным - именно так и должно работать, перечитайте условия свои.
Если отпущено и нективно - написать в порт "2"
Но если отпущено и нективно в порт пишет: сначала 1, а потом 2
А можно узнать, почему при одном и том же условии - выполняются разные действя
Если отпущено и нективно - написать в порт "2"
Но если отпущено и нективно в порт пишет: сначала 1, а потом 2
А можно узнать, почему при одном и том же условии - выполняются разные действя
А с чего вы взяли что выполняются разные действия?
А Вы считаетет что "написать в порт "2"" и "в порт пишет: сначала 1, а потом 2" - это одно и то же?
А с чего вы взяли что выполняются разные действия?
Да потому что "короткое нажатие" всегда заканчивается состоянием "отпущено и неактивно". Так что проблема не в классе "титанового", а неправильной формулировке задачи.
Настряпал некий код. Вроде работает. Знающие люди, посмотрите пожалуйста, чего у меня получилось.
При включении аппарата подсветка не горит
При нажатии на энкодер-кнопку - загорается на 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); } }Настряпал некий код. Вроде работает. Знающие люди, посмотрите пожалуйста, чего у меня получилось.
Посмотрел, неинтересно. Работает - значит хорошо.
При включении аппарата подсветка не горит - мне так и нужно.
Уменьшайте подсветку на каждом вызове loop() - слишком быстро получается
При включении аппарата подсветка не горит - мне так и нужно.
Уменьшайте подсветку на каждом вызове loop() - слишком быстро получается
Значит уменьшайте каждые 500мс, к примеру: http://alxarduino.blogspot.ru/2013/09/BlinkAndPrintWithoutDelay.html
Спасибо - дельная статья - помогла