Помогите со скетчем... Автоматизация)))

Тема в разделе "Arduino & Shields", создана пользователем shamzelia, 20 июл 2015.

  1. shamzelia

    shamzelia Нерд

    Проблема с прописыванием реакции по датчику sensorPin (аналоговый)

    Релюха 3 ну никак не реагирует (((

    Код (Text):
    #include <Wire.h>        // Добавляем необходимые библиотеки
    #include <LiquidCrystal_I2C.h>
    #include <dht11.h>
    dht11 DHT;              // Объявление переменной класса dht11
    #define DHT11_PIN 5      // Датчик DHT11 подключен к цифровому пину номер 4

    #define RELAY1  9      //Порт реле 1                      
    #define RELAY2  8      //Порт реле 2                      
    #define RELAY3  7      //Порт реле 3                    
    #define RELAY4  6      //Порт реле 4


    byte degree[8] =        // Битовая маска символа градуса
    {
      B00111,
      B00101,
      B00111,
      B00000,
      B00000,
      B00000,
      B00000,
    };

    byte temp[8] = //Иконка термометра
    {
        B00100,
        B01010,
        B01010,
        B01110,
        B01110,
        B11111,
        B11111,
        B01110,
    };

    byte humidL[8] = //Иконка влажности
    {
        B00000,
        B00000,
        B00011,
        B01110,
        B11000,
        B10000,
        B01110,
        B00011,
    };
    byte humidR[8] = //Иконка влажности
    {
        B00000,
        B00000,
        B11000,
        B01110,
        B00011,
        B00001,
        B01110,
        B11000,
    };

    byte Light[8] = //Иконка света
    {
        B00100,
        B10101,
        B10101,
        B01110,
        B11011,
        B01110,
        B10101,
        B10101,
    };


    byte MOISTURE[8] = //Иконка почвы
    {
        B00100,
        B00100,
        B01010,
        B01010,
        B10001,
        B10001,
        B10001,
        B01110,
    };
    LiquidCrystal_I2C lcd(0x27,16,2);  // Задаем адрес и размерность дисплея

    //Датчик влажности
    int sensorPin = 0;    // Аналоговый порт 0 (порт данных)
    int sensorValue = 0;  // Переменная для хранения значение из датчика
    //Датчик света
    int sensorPinL = 1;    // Аналоговый порт 1 (порт данных)
    int sensorLight = 0;


    void setup()
    {
      lcd.init();                      // Инициализация lcd          
      lcd.backlight();                  // Включаем подсветку
      lcd.createChar(1, degree);        // Создаем символ под номером 1
      lcd.createChar(2, temp);
      lcd.createChar(3, humidL);
      lcd.createChar(4, humidR);
      lcd.createChar(5, Light);        //иконка солнышка
      lcd.createChar(6, MOISTURE);      //Иконка почвы
    // Инициализация DATA pins для OUTPUT
      pinMode(RELAY1, OUTPUT);    
      pinMode(RELAY2, OUTPUT);
      pinMode(RELAY3, OUTPUT);
      pinMode(RELAY4, OUTPUT);
      digitalWrite(RELAY1,HIGH);          // Turns Relay Off
      digitalWrite(RELAY2,HIGH);          // Turns Relay Off
      digitalWrite(RELAY3,HIGH);          // Turns Relay Off
      digitalWrite(RELAY4,HIGH);          // Turns Relay Off
    }

    void loop()
    {
      // Выводим показания влажности и температуры
      lcd.setCursor(0, 0);        // Устанавливаем курсор в начало 1 строки
      lcd.print("\3\4=  % ");    // Выводим текст
      lcd.setCursor(3, 0);
      lcd.print(DHT.humidity, 1);
      lcd.setCursor(7, 0);              // Устанавливаем курсор в начало 2 строки
      lcd.print("\2=  \1C ");    // Выводим текст, \1 - значок градуса
      lcd.setCursor(9, 0);          
      lcd.print(DHT.temperature,1);

    // выводим показания влажности почвы
    lcd.setCursor(0, 1);
    lcd.print("\6=");
    lcd.setCursor(2, 1);
    lcd.print(analogRead(sensorPin));
    //Выводим значение освещенности
    lcd.setCursor(7, 1);
    lcd.print("\5=  ");
    lcd.setCursor(9, 1);
    lcd.print(analogRead(sensorPinL));

    //зададим диапазоны срабатываний для атмосферной влажности
    if (DHT.humidity > 35) {
      digitalWrite(RELAY1,LOW);
    }
    else if (DHT.humidity < 18) {
      digitalWrite(RELAY1,HIGH);
    }
    //зададим диапазоны срабатываний для атмосферной температуры
    if (DHT.temperature >= 29) {
      digitalWrite(RELAY2,LOW);
    }
    else if (DHT.temperature >= 28) {
      digitalWrite(RELAY2,HIGH);
    }
    //зададим диапазоны срабатываний для датчика влажности почвы
    if (analogRead(sensorPin) > 5000) {
      digitalWrite(RELAY3,HIGH); //выключаем
    }
    else if (analogRead(sensorPin) < 2000 ) {
      digitalWrite(RELAY3,LOW); //включаем
    }




      int chk;  
      ; // Мониторинг ошибок
      chk = DHT.read(DHT11_PIN);    // Чтение данных
      switch (chk){
      case DHTLIB_OK:
        break;
      case DHTLIB_ERROR_CHECKSUM:
        lcd.clear();
        lcd.print("Checksum error");
        break;
      case DHTLIB_ERROR_TIMEOUT:
        lcd.clear();
        lcd.print("Time out error");
        break;
      default:
        lcd.clear();
        lcd.print("Unknown error");
        break;
      }
      delay(1000);                  
    }
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Функция analogRead выдает 10 двоичных разрядов. Откуда взялись числа 2000 и 5000?
     
  3. shamzelia

    shamzelia Нерд

    :(На дисплей выдает значения от 1000 до 10000
     
    Последнее редактирование: 20 июл 2015
  4. vvr

    vvr Инженерище

    Напряжение поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт
     
  5. shamzelia

    shamzelia Нерд

    Я совсем не понимаю ((( Может скажите что в коде подшаманить???
     
  6. shamzelia

    shamzelia Нерд

    вот световой датчик так и выдвет максимум 1024, а влажности чудеса пишет ((
     
  7. shamzelia

    shamzelia Нерд

    как их кодом в божеский формат перевести?
     
  8. DrProg

    DrProg Вечный нерд

    Код (Text):
    //зададим диапазоны срабатываний для датчика влажности почвы
    if (analogRead(sensorPin) > 5000) {
      digitalWrite(RELAY3,HIGH); //выключаем
    }
    else if (analogRead(sensorPin) < 2000 ) {
      digitalWrite(RELAY3,LOW); //включаем
    }
    На самом деле проверьте что выдает датчик через Serial.print. Ну никак не может analogRead вернуть значение более 1024.
    HIGH это разве выключение?
    Да, и конструкция с else на мой взгляд ни к чему.
    Код (Text):
    if (analogRead(sensorPin) > 5000) digitalWrite(RELAY3,HIGH); //выключаем
    if (analogRead(sensorPin) < 2000 ) digitalWrite(RELAY3,LOW);
     
    Последнее редактирование: 21 июл 2015
  9. shamzelia

    shamzelia Нерд

    Спасибо за мудрый совет else уберу
     
  10. shamzelia

    shamzelia Нерд

    Код (Text):
    #include <Wire.h>        // Добавляем необходимые библиотеки
    #include <LiquidCrystal_I2C.h>
    #include <dht11.h>
    dht11 DHT;              // Объявление переменной класса dht11
    #define DHT11_PIN 5      // Датчик DHT11 подключен к цифровому пину номер 4

    #define RELAY1  9      //Порт реле 1                      
    #define RELAY2  8      //Порт реле 2                      
    #define RELAY3  7      //Порт реле 3                    
    #define RELAY4  6      //Порт реле 4


    byte degree[8] =        // Битовая маска символа градуса
    {
      B00111,
      B00101,
      B00111,
      B00000,
      B00000,
      B00000,
      B00000,
    };

    byte temp[8] = //Иконка термометра
    {
        B00100,
        B01010,
        B01010,
        B01110,
        B01110,
        B11111,
        B11111,
        B01110,
    };

    byte humidL[8] = //Иконка влажности
    {
        B00000,
        B00000,
        B00011,
        B01110,
        B11000,
        B10000,
        B01110,
        B00011,
    };
    byte humidR[8] = //Иконка влажности
    {
        B00000,
        B00000,
        B11000,
        B01110,
        B00011,
        B00001,
        B01110,
        B11000,
    };

    byte Light[8] = //Иконка света
    {
        B00100,
        B10101,
        B10101,
        B01110,
        B11011,
        B01110,
        B10101,
        B10101,
    };


    byte MOISTURE[8] = //Иконка почвы
    {
        B00100,
        B00100,
        B01010,
        B01010,
        B10001,
        B10001,
        B10001,
        B01110,
    };
    LiquidCrystal_I2C lcd(0x27,16,2);  // Задаем адрес и размерность дисплея

    void setup()
    {
      lcd.init();                      // Инициализация lcd          
      lcd.backlight();                  // Включаем подсветку
      lcd.createChar(1, degree);        // Создаем символ под номером 1
      lcd.createChar(2, temp);
      lcd.createChar(3, humidL);
      lcd.createChar(4, humidR);
      lcd.createChar(5, Light);        //иконка солнышка
      lcd.createChar(6, MOISTURE);      //Иконка почвы
    //  Инициализация релюх
      pinMode(RELAY1, OUTPUT);    
      pinMode(RELAY2, OUTPUT);
      pinMode(RELAY3, OUTPUT);
      pinMode(RELAY4, OUTPUT);
      //выключаем релюхи
      digitalWrite(RELAY1,HIGH);          // Off
      digitalWrite(RELAY2,HIGH);          // Off
      digitalWrite(RELAY3,HIGH);          // Off
      digitalWrite(RELAY4,HIGH);          // Off
    }

    void loop()
    {
      // Выводим показания влажности и температуры
      lcd.setCursor(0, 0);        // Устанавливаем курсор в начало 1 строки
      lcd.print("\3\4=  % ");    // Выводим текст
      lcd.setCursor(3, 0);
      lcd.print(DHT.humidity, 1);
      lcd.setCursor(7, 0);              // Устанавливаем курсор в начало 2 строки
      lcd.print("\2=  \1C ");    // Выводим текст, \1 - значок градуса
      lcd.setCursor(9, 0);          
      lcd.print(DHT.temperature,1);

    // выводим показания влажности почвы
    int SenPin = analogRead(0);    // Аналоговый порт 0 (порт данных)
    int sensorValue = map(SenPin, 0, 1023, 100, 0);
    lcd.setCursor(0, 1);
    lcd.print("\6=  % ");
    lcd.setCursor(2, 1);
    lcd.print(sensorValue);
    //Выводим значение освещенности
    int SenPinL = analogRead(1);    // Аналоговый порт 1 (порт данных)
    int sensorLight = map(SenPinL, 0, 1023, 100, 0);
    lcd.setCursor(7, 1);
    lcd.print("\5=  % ");
    lcd.setCursor(9, 1);
    lcd.print(sensorLight);

    //зададим диапазоны срабатываний для атмосферной влажности
    if (DHT.humidity >= 35) digitalWrite(RELAY1,LOW);//включаем
    if (DHT.humidity <= 37) digitalWrite(RELAY1,HIGH);//выключаем
    //зададим диапазоны срабатываний для атмосферной температуры
    if (DHT.temperature >= 29) digitalWrite(RELAY2,LOW);//включаем
    if (DHT.temperature <= 28) digitalWrite(RELAY2,HIGH);//выключаем
    //зададим диапазоны срабатываний для датчика влажности почвы
    if (sensorValue >= 55) digitalWrite(RELAY3,HIGH); //выключаем
    if (sensorValue <= 50) digitalWrite(RELAY3,LOW); //включаем
    //зададим диапазоны срабатываний для датчика света
    //if (sensorLight >= 55) digitalWrite(RELAY4,HIGH); //выключаем
    //if (sensorLight <= 50) digitalWrite(RELAY4,LOW); //включаем


      int chk;  
      ; // Мониторинг ошибок
      chk = DHT.read(DHT11_PIN);    // Чтение данных
      switch (chk){
      case DHTLIB_OK:
        break;
      case DHTLIB_ERROR_CHECKSUM:
        lcd.clear();
        lcd.print("Checksum error");
        break;
      case DHTLIB_ERROR_TIMEOUT:
        lcd.clear();
        lcd.print("Time out error");
        break;
      default:
        lcd.clear();
        lcd.print("Unknown error");
        break;
      }
      delay(1000);                  
    }
     

    Спасибо за помощ


    Есть вопрос
    :!!!

    Разорвал цепь питания датчика влажности реле 4

    Хочу редко опрашивать датчик влажности и включать его (реле 4) только когда опрашиваю, но при этом часто опрашивать остальные датчики.

    Пример раз в сутки включаем реле 4 и опрашиваем датчик, если сухо включаем реле 3 и поливаем пока не станет нормально )

    Остальные датчики опрашиваем с частотой раз в 1 минут..
     
  11. DrProg

    DrProg Вечный нерд

    Для включения датчика не обязательно реле, достаточно транзистора. Так же можно устроить последовательный опрос кучи датчиков на одном пине.
     
  12. shamzelia

    shamzelia Нерд

    О, а можно пример конекта и кода? А пин аналоговый?
     
  13. DrProg

    DrProg Вечный нерд

    Рисовать пока не могу. Полевой транзистор лыской к себе, левую ножку на минус датчика, среднюю в пин вкл-выкл, правую на землю. Когда пин HIGH датчик работает. Между вкл и замером выждать миллисекунд 50, если он через схему а не напрямую. В любом случае подключать надо так, иначе электроды датчика корродируют очень быстро.
     
  14. shamzelia

    shamzelia Нерд

    (( Я совсем начинающий ... может ссылку куданить?
     
  15. DrProg

    DrProg Вечный нерд

    Ну куда ссылку, я сам такую систему делал, наработки от туда.
     
  16. shamzelia

    shamzelia Нерд

    Да? ну как? аж лодошки вспотели ))) Какой транзистор взять?
     
  17. DrProg

    DrProg Вечный нерд

    [​IMG]
    Вот схемка, поавда слегка устаревшая, но рабочая.
     
  18. shamzelia

    shamzelia Нерд

    Спасибо огромное, а скетч ссыль мона?
     
  19. DrProg

    DrProg Вечный нерд

    Целиком не могу, интеллектуальная собственность. )) Могу вообще аппарат сделать, только в розетку воткнуть останется. )
     
    ИгорьК нравится это.
  20. shamzelia

    shamzelia Нерд

    А он у вас с меню???