Условие не срабатывает почему-то...

Diatez
Offline
Зарегистрирован: 09.10.2014

Здравствуйте Господа,

не кидайте тапками, но пытаюсь заставить 10 лампочный LEDbar работать в зависимости от показания датчика влажности (до 10%- 1 диод, от 10 до 20 - 2 диода и тд и тп)

Все работает кроме if...else- всегда срабатывает самое первое условие- горит один диод. При этом LED с драйвером работают корректно (проверял на другом коде), датчик влажности- тоже (прописывал airHum вручную- эффест тотже)

При этом IDE ведет себя спокойно, не ругается.

LCD тоже не работает, но не обращайте внимания =)

Где косяк?

#include <DHT.h>
#include <lcd.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Prototypes


// Define variables and constants
#define DHTPIN 2
#define DHTTYPE DHT11
int latchpin = 8;
int clockpin = 9;
int datapin = 10;
byte qleds[] = {B00000001, B00000011, B00000111, B00001111, B00011111, B00111111, B01111111, B11111111, B11111111, B11111111 };
byte qled[] = {B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000001, B00000011 };

DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal_I2C lcd(0x27,20,4);


void setup() 
{
    pinMode(latchpin, OUTPUT);
    pinMode(clockpin, OUTPUT);
    pinMode(datapin, OUTPUT);
    
    dht.begin();
    
    Serial.begin(9600);
    
    lcd.begin(20,4); // for 16 x 2 LCD module
    lcd.setBacklightPin(3,POSITIVE);
    lcd.setBacklight(HIGH);
    
    
}

// Add loop code 
void loop() {
    
    float airHum = dht.readHumidity();
    float airTemp = dht.readTemperature();
    if (isnan(airHum) & isnan(airTemp)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
    }

        if (5 < airHum <= 10) {
            shiftOut(datapin, clockpin, MSBFIRST, qled[0]);
            shiftOut(datapin, clockpin, MSBFIRST, qleds[0]);
            digitalWrite(latchpin, HIGH);
            delayMicroseconds(1);
            digitalWrite(latchpin, LOW);
        } else {
            if (10 < airHum <= 20) {
            shiftOut(datapin, clockpin, MSBFIRST, qled[1]);
            shiftOut(datapin, clockpin, MSBFIRST, qleds[1]);
                digitalWrite(latchpin, HIGH);
                delayMicroseconds(1);
                digitalWrite(latchpin, LOW);
            } else {
                if (20 < airHum <= 30) {
                    shiftOut(datapin, clockpin, MSBFIRST, qled[2]);
                    shiftOut(datapin, clockpin, MSBFIRST, qleds[2]);
                    digitalWrite(latchpin, HIGH);
                    delayMicroseconds(1);
                    digitalWrite(latchpin, LOW);
                } else {
                    if (30 < airHum <= 40) {
                        shiftOut(datapin, clockpin, MSBFIRST, qled[3]);
                        shiftOut(datapin, clockpin, MSBFIRST, qleds[3]);
                        digitalWrite(latchpin, HIGH);
                        delayMicroseconds(1);
                        digitalWrite(latchpin, LOW);
                        delay(500);
                    } else {
                        if (40 < airHum <= 50) {
                            shiftOut(datapin, clockpin, MSBFIRST, qled[4]);
                            shiftOut(datapin, clockpin, MSBFIRST, qleds[4]);
                            digitalWrite(latchpin, HIGH);
                            delayMicroseconds(1);
                            digitalWrite(latchpin, LOW);
                        } else {
                            if (50 < airHum <= 60) {
                                shiftOut(datapin, clockpin, MSBFIRST, qled[5]);
                                shiftOut(datapin, clockpin, MSBFIRST, qleds[5]);
                                digitalWrite(latchpin, HIGH);
                                delayMicroseconds(1);
                                digitalWrite(latchpin, LOW);
                            } else {
                                if (airHum > 60){
                                    shiftOut(datapin, clockpin, MSBFIRST, qled[8]);
                                    shiftOut(datapin, clockpin, MSBFIRST, qleds[8]);
                                    digitalWrite(latchpin, HIGH);
                                    delayMicroseconds(1);
                                    digitalWrite(latchpin, LOW);
        }
                            }
                        }
                    }
                }
            }
        }



    Serial.print("Humidity: ");
    Serial.println(airHum);
    Serial.print("Temp: ");
    Serial.println(airTemp);
    delay(300);

   lcd.home (); // set cursor to 0,0
    lcd.print(" tronixlabs.com");
    lcd.setCursor (0,1);        // go to start of 2nd line
    lcd.print(millis());
    delay(1000);
    lcd.setBacklight(LOW);      // Backlight off
    delay(250);
    lcd.setBacklight(HIGH);     // Backlight on
    delay(1000);

}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нельзя так писать. надо так

if (airHum>5 && airHum <= 10)

 

Diatez
Offline
Зарегистрирован: 09.10.2014

Да,
это я, конечно, тупанул, полдня на это убил.... =(

Спасибо большое!!!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

странно что вообще компилировалось

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

можно проще сделать без массива с использованием сдвига, или делатьне 2 массива а один int

и передевать его по половинке

Diatez
Offline
Зарегистрирован: 09.10.2014

Да, спасибо, я в курсе =)

Просто в этом LED-bar 10 диодов, поэтому пришлось брать 16 разрядный драйвер(который был в зоне досягаемости) и пихать в него по 2 байта. Не нашлось у меня другого решения =)

А что вы имеете в виду по половинке?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

shiftOut только 1 байт же за раз может передать. если 10 светодиодов проще int массив например. но это два байта. нужно просто разбить int на половинки и передать и все

Diatez
Offline
Зарегистрирован: 09.10.2014

Вообще да, спасибо, сейчас попробую =)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

что то вроде этого. сокращенный вариант

int LED=0;

..............

if (airHum>5 && airHum <= 10) LED=1;
if (airHum>10 && airHum <= 15) LED=2;

.............

shiftOut(datapin, clockpin, MSBFIRST, LED);
shiftOut(datapin, clockpin, MSBFIRST, (LED<<8));

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

можно вообще не использовать shiftOut

написать свою функцию передачи сразу 2байт

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

можно вообще не использовать shiftOut

написать свою функцию передачи сразу 2байт

Diatez
Offline
Зарегистрирован: 09.10.2014

Да, но я пока еще только начал =)

В будущем... =)