Условие не срабатывает почему-то...
- Войдите на сайт для отправки комментариев
Чт, 09/10/2014 - 18:14
Здравствуйте Господа,
не кидайте тапками, но пытаюсь заставить 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); }
нельзя так писать. надо так
Да,
это я, конечно, тупанул, полдня на это убил.... =(
Спасибо большое!!!
странно что вообще компилировалось
можно проще сделать без массива с использованием сдвига, или делатьне 2 массива а один int
и передевать его по половинке
Да, спасибо, я в курсе =)
Просто в этом LED-bar 10 диодов, поэтому пришлось брать 16 разрядный драйвер(который был в зоне досягаемости) и пихать в него по 2 байта. Не нашлось у меня другого решения =)
А что вы имеете в виду по половинке?
shiftOut только 1 байт же за раз может передать. если 10 светодиодов проще int массив например. но это два байта. нужно просто разбить int на половинки и передать и все
Вообще да, спасибо, сейчас попробую =)
что то вроде этого. сокращенный вариант
можно вообще не использовать shiftOut
написать свою функцию передачи сразу 2байт
можно вообще не использовать shiftOut
написать свою функцию передачи сразу 2байт
Да, но я пока еще только начал =)
В будущем... =)