Условие не срабатывает почему-то...
- Войдите на сайт для отправки комментариев
Чт, 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байт
Да, но я пока еще только начал =)
В будущем... =)