Много глупых вопросов!

Тема в разделе "Arduino & Shields", создана пользователем Kirguh, 28 мар 2017.

  1. Kirguh

    Kirguh Нерд

    Ооо! Спасибо за развернутый ответ! Буду его обдумывать. И сразу задам еще такой вопрос вам - я в сетап воткнул:
    Код (C++):
    void setup(void)
    {
      // начало работы с дисплеем
      qd.begin();
      // пин помпы в режим выхода
      pinMode(POMP_PIN, OUTPUT);
      // пин датчика в режим выхода
       pinMode(DAT_PIN, OUTPUT);
      // выводим AAAA на дисплей
      qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001);
      delay(2000);
    }
    Воткнул включение пина датчика в режим вывода - теперь силовой ключ моргает - правильно ли я поступил? Ведь, вроде именно так я и долежн контролировать питание датчика?
     
  2. Kirguh

    Kirguh Нерд


    Вроде сделал все, как вы сказали.


    Код (C++):
    // Подключаем библиотеку для работы с дисплеем
    #include "QuadDisplay2.h"
    // имя пина, к которому подключена помпа
    #define POMP_PIN 4
    //имя пина к которому подключен датчик почвы
    #define DAT_PIN 3
    // имя пина к которому подключён датчик влажности почвы
    #define HUMIDITY_PIN A0
    // минимальный порог влажности почвы
    #define HUMIDITY_MIN 200
    // максимальный порог влажности почвы
    #define HUMIDITY_MAX 980
    // интервал между проверкой на полив растения
    #define INTERVAL 5000 // 5 секунд
    // переменная для хранения показания влажности почвы
    unsigned int humidity = 0;
    // статическая переменная для хранения времени
    unsigned long waitTime = 0;
    // создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(9);
    void setup(void)
    {
      // начало работы с дисплеем
      qd.begin();
      // пин помпы в режим выхода
      pinMode(POMP_PIN, OUTPUT);
      // пин датчика в режим выхода
       pinMode(DAT_PIN, OUTPUT);
      // выводим AAAA на дисплей
      qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001);
      delay(2000);
    }
    void loop(void)
    {
    //даем питание на силовой ключ датчика почвы
    digitalWrite(DAT_PIN, HIGH);
      // считываем текущее показания датчика влажности почвы
      int humidityNow = analogRead(HUMIDITY_PIN);
      // если показания текущей влажности почвы
      // не равняется предыдущему запросу
      if(humidityNow != humidity) {
        // сохраняем текущие показания влажности
        humidity= humidityNow;
        // и выводим показания влажности на дисплей
        qd.displayInt(humidityNow);
        //отключаем питание датчика почвы
        digitalWrite(DAT_PIN, LOW);
      }
    // если значение датчика влажности меньше допустимой границы
      if (humidity < HUMIDITY_MIN)
      {
        // включаем помпу
        digitalWrite(POMP_PIN, HIGH);
        // ждём 2 секунды
        delay(2000);
        // выключаем помпу
        digitalWrite(POMP_PIN, LOW);
        //даю паузу в 5 секунд
      delay(INTERVAL);
      }
    }
    Но на деле выходит иначе - диод силового ключа горит пока я не сниму хоть какой-нибудь показатель, это странно.
     
  3. user999

    user999 Гик

    Контакт плохой, или питания не хватает. Бывает такое.
    Попробуйте в сетапе написать digitalWrite(DAT_PIN, LOW);
    Если не получится, то точно контакт или питание
     
    Kirguh нравится это.
  4. user999

    user999 Гик

    Правильно, у вас выключение стоит только если новое показание не равно стараму, а если равно, то датчик так и будет включен.
    Код (C++):
    digitalWrite(DAT_PIN, LOW);
    за скобку, которая строчкой ниже
     
    Kirguh нравится это.
  5. user999

    user999 Гик

    и
    Код (C++):
    delay(INTERVAL);
    тоже за скобку, которая ниже его
     
    Kirguh нравится это.
  6. Kirguh

    Kirguh Нерд

    Точно! Спасибо огромное за помощь! Теперь, вроде, все работает как и должно! Ключ загорается на 0.5 секунды - считывает значение и сразу гаснет!


    Код (C++):
    // Подключаем библиотеку для работы с дисплеем
    #include "QuadDisplay2.h"
    // имя пина, к которому подключена помпа
    #define POMP_PIN 4
    //имя пина к которому подключен датчик почвы
    #define DAT_PIN 3
    // имя пина к которому подключён датчик влажности почвы
    #define HUMIDITY_PIN A0
    // минимальный порог влажности почвы
    #define HUMIDITY_MIN 200
    // максимальный порог влажности почвы
    #define HUMIDITY_MAX 980
    // интервал между проверкой на полив растения
    #define INTERVAL 5000 // 5 секунд
    // переменная для хранения показания влажности почвы
    unsigned int humidity = 0;
    // статическая переменная для хранения времени
    unsigned long waitTime = 0;
    // создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(9);
    void setup(void)
    {
      // начало работы с дисплеем
      qd.begin();
      // пин помпы в режим выхода
      pinMode(POMP_PIN, OUTPUT);
      // пин датчика в режим выхода
       pinMode(DAT_PIN, OUTPUT);
      // выводим AAAA на дисплей
      qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001);
      delay(2000);
    }

    void loop(void)
    {
    //даем питание на силовой ключ датчика почвы
    digitalWrite(DAT_PIN, HIGH);
      // считываем текущее показания датчика влажности почвы
      int humidityNow = analogRead(HUMIDITY_PIN);
      // если показания текущей влажности почвы
      // не равняется предыдущему запросу
      if(humidityNow != humidity) {
        // сохраняем текущие показания влажности
        humidity= humidityNow;
        // и выводим показания влажности на дисплей
        qd.displayInt(humidityNow);
       
      }
      //отключаем питание датчика почвы
        digitalWrite(DAT_PIN, LOW);
    // если значение датчика влажности меньше допустимой границы
      if (humidity < HUMIDITY_MIN)
      {
        // включаем помпу
        digitalWrite(POMP_PIN, HIGH);
        // ждём 2 секунды
        delay(2000);
        // выключаем помпу
        digitalWrite(POMP_PIN, LOW);
        //даю паузу в 5 секунд
      }
       delay(INTERVAL);
    }
     
  7. user999

    user999 Гик

    Можете еще вместо строчки
    Код (C++):
    int humidityNow = analogRead(HUMIDITY_PIN);
    Вставить
    Код (C++):
      int humidityNow;
      for(int i=0; i< 100; i++) {
        humidityNow = analogRead(HUMIDITY_PIN);
        delay(10);
        humidityNow += humidityNow;
      }
       humidityNow /=100;
    Показания будут более точные. Будет за секунду 100 показаний считывать и их усреднять
     
    Kirguh нравится это.
  8. Kirguh

    Kirguh Нерд

    Хм, тогда если опустить датчик в воду он выдает на дисплей 13 вместо 750+, как так? Да и почва уже не 200-300, а 2-3 примерно, чому так?
     
  9. mcureenab

    mcureenab Гуру

    Из неточных данных точные не получатся, как их не усредняй.
     
    Kirguh нравится это.
  10. mcureenab

    mcureenab Гуру

    Переменная humidityNow не инициализирована нулем.
     
    Kirguh нравится это.
  11. Kirguh

    Kirguh Нерд

    А вы не могли быть пояснить чуть подробнее, для чайников?
    UPD: Я попробовал разобрать по строкам для себя:

    int humidityNow;
    Обозначали целочисленную переменную
    for(int i=0; i< 100; i++)
    Для нее от нуля до 100 мы производим сложение
    {
    humidityNow = analogRead(HUMIDITY_PIN);

    Собираем 100 показаний
    delay(10);
    Ждем 10мс
    humidityNow += humidityNow;
    Складываем 100 показаний
    }
    Делим на 100 и получаем усредненное, заносим его во humidityNow
    humidityNow /= 100;

    И я все еще не понял - почему так сильно изменились числа.
     
    Последнее редактирование: 29 мар 2017
  12. mcureenab

    mcureenab Гуру

    Код (C++):
    int humidityNow(0);
    Статические переменные по умолчанию инициализированы 0. Автоматические переменные нужно инициализировать явно. Иначе в них может быть любой мусор.
     
    Kirguh нравится это.
  13. Kirguh

    Kirguh Нерд

    Окей, я задал 0, но числа не изменились. Что не так?

    Код (C++):
    // Подключаем библиотеку для работы с дисплеем
    #include "QuadDisplay2.h"
    // имя пина, к которому подключен силовой ключ помпы
    #define POMP_PIN 4
    //имя пина к которому подключен силовой ключ датчика влажности почвы
    #define DAT_PIN 3
    // имя пина к которому подключён датчик влажности почвы
    #define HUMIDITY_PIN A0
    // минимальный порог влажности почвы
    #define HUMIDITY_MIN 350
    // максимальный порог влажности почвы
    #define HUMIDITY_MAX 600
    // переменная для хранения показания влажности почвы
    unsigned int humidity = 0;
    // создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(9);
    void setup(void)
    {
      // начало работы с дисплеем
      qd.begin();
      // пин помпы в режим выхода
      pinMode(POMP_PIN, OUTPUT);
      // пин датчика в режим выхода
       pinMode(DAT_PIN, OUTPUT);
      // выводим AAAA на дисплей
      qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001);
      delay(2000);
    }

    void loop(void)
    {
    //даем питание на силовой ключ датчика почвы
    digitalWrite(DAT_PIN, HIGH);
      // считываем текущее показания датчика влажности почвы
      int humidityNow(0);
      for(int i=0; i< 100; i++) {
        humidityNow = analogRead(HUMIDITY_PIN);
        delay(10);
        humidityNow += humidityNow;
      }
       humidityNow /=100;
      // если показания текущей влажности почвы
      // не равняется предыдущему запросу
      if(humidityNow != humidity) {
        // сохраняем текущие показания влажности
        humidity= humidityNow;
        // и выводим показания влажности на дисплей
        qd.displayInt(humidityNow);
       
      }
      //отключаем питание датчика почвы
        digitalWrite(DAT_PIN, LOW);
    // если значение датчика влажности меньше допустимой границы
      if (humidity < HUMIDITY_MIN)
      {
        // включаем помпу
        digitalWrite(POMP_PIN, HIGH);
        // ждём 3 секунды
        delay(3000);
        // выключаем помпу
        digitalWrite(POMP_PIN, LOW);
        //даю паузу в 5 секунд
      }
      //задержка в 5 секунд - потом цикл по новой
       delay(5000);
    }
     
  14. user999

    user999 Гик

    Переполнение переменной происходит
    Код (C++):
    unsigned int humidityNow = 0;
     
    Kirguh нравится это.
  15. mcureenab

    mcureenab Гуру

    Тут ошибка.
    Код (C++):
     for(int i=0; i< 100; i++) {
        humidityNow = analogRead(HUMIDITY_PIN);
        delay(10);
        humidityNow += humidityNow;
     
    Kirguh нравится это.
  16. mcureenab

    mcureenab Гуру

    Замени то на это

    Код (C++):
     for(int i=0; i< 100; i++) {
        delay(10);
        humidityNow +=  analogRead(HUMIDITY_PIN);
     
    Kirguh нравится это.
  17. Kirguh

    Kirguh Нерд

    Заменил, стало еще забавней. В стакане с водой не показывает больше 67, в воздухе показывает 0. Если намочить самый кончик щупа в момент измерения - можно получить значения в духе -25 или -87 или даже -250.

    Код (C++):
    // Подключаем библиотеку для работы с дисплеем
    #include "QuadDisplay2.h"
    // имя пина, к которому подключен силовой ключ помпы
    #define POMP_PIN 4
    //имя пина к которому подключен силовой ключ датчика влажности почвы
    #define DAT_PIN 3
    // имя пина к которому подключён датчик влажности почвы
    #define HUMIDITY_PIN A0
    // минимальный порог влажности почвы
    #define HUMIDITY_MIN 350
    // максимальный порог влажности почвы
    #define HUMIDITY_MAX 600
    // переменная для хранения показания влажности почвы
    unsigned int humidity = 0;
    // создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(9);
    void setup(void)
    {
      // начало работы с дисплеем
      qd.begin();
      // пин помпы в режим выхода
      pinMode(POMP_PIN, OUTPUT);
      // пин датчика в режим выхода
       pinMode(DAT_PIN, OUTPUT);
      // выводим AAAA на дисплей
      qd.displayDigits(0b00010001, 0b00010001, 0b00010001, 0b00010001);
      delay(2000);
    }

    void loop(void)
    {
    //даем питание на силовой ключ датчика почвы
    digitalWrite(DAT_PIN, HIGH);
      // считываем текущее показания датчика влажности почвы
      int humidityNow(0);

    for(int i=0; i< 100; i++) {
        delay(10);
        humidityNow +=  analogRead(HUMIDITY_PIN);

      }
       humidityNow /=100;
      // если показания текущей влажности почвы
      // не равняется предыдущему запросу
      if(humidityNow != humidity) {
        // сохраняем текущие показания влажности
        humidity= humidityNow;
        // и выводим показания влажности на дисплей
        qd.displayInt(humidityNow);
     
      }
      //отключаем питание датчика почвы
        digitalWrite(DAT_PIN, LOW);
    // если значение датчика влажности меньше допустимой границы
      if (humidity < HUMIDITY_MIN)
      {
        // включаем помпу
        digitalWrite(POMP_PIN, HIGH);
        // ждём 3 секунды
        delay(3000);
        // выключаем помпу
        digitalWrite(POMP_PIN, LOW);
        //даю паузу в 5 секунд
      }
      //задержка в 5 секунд - потом цикл по новой
       delay(5000);
    }
     
     
  18. Kirguh

    Kirguh Нерд

    Пусть Гуру услышит, пусть Гуру придет, пусть Гуру сей тред неприменно прочтет!
     
  19. Kirguh

    Kirguh Нерд

    И сразу я хочу задать очередной глупый вопрос, вот я прикупил дальномер (HC-SR04) и успешно его подключил. Хоче его использовать как вещь для определения уровня воды. Прибор смотрит расстояние до воды и в зависимости от этого что-то делает. Вопрос таков, как мне загнать показание дальномера в переменную, чтобы использовать в дальнейшем? Код ниже, вопрос про датчик влажности (выше по теме) все еще остается открытым.

    Код (C++):

    // Подключаем библиотеку для работы с дальномером
    #include <NewPing.h>
    // Подключаем библиотеку для работы с дисплеем
    #include <QuadDisplay2.h>
    // Задаем имя пина, к которому подключен силовой ключ помпы
    #define POMP_PIN 4
    // Задаем имя пина, к которому подключен силовой ключ датчика влажности почвы
    #define DAT_PIN 3
    // Задаем имя пина, к которому подключен Триг, который посылает звук
    #define trig_pin 9
    // Задаем имя пина, к которому подключено Эхо, принимающее звук
    #define echo_pin 8
    // Задаем имя пина, к которому подключён датчик влажности почвы
    #define HUMIDITY_PIN A0
    // Задаем переменную минимального порога влажности почвы
    #define HUMIDITY_MIN 350
    // Задаем переменную максимального порога влажности почвы
    #define HUMIDITY_MAX 600
    // Задаем максимальную дистанцию, что мы хотим пингануть в сантиметрах (150 см), предел нашего модуля 400-500 см
    #define max_dist 150
    // Создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(10);

    // Задаем переменнуя для хранения показания влажности почвы
    unsigned int humidity = 0;
    // NewPing setup of pins and maximum distance.

    NewPing sonar(trig_pin, echo_pin, max_dist);
    void setup(void) {
    // Включаем пин силового ключа помпы в режим выхода
    pinMode(POMP_PIN, OUTPUT);
    // Включаем пин силового ключа датчика влажности почвы в режим выхода
    pinMode(DAT_PIN, OUTPUT);
    // Начинаем работать с дисплеем
    qd.begin();
    // Open serial monitor at 115200 baud to see ping results.
    Serial.begin(9600);
    // Выводим "Load" на дисплей
    qd.displayDigits(0b11100011, 0b11000101, 0b00000101, 0b10000101);
    }
    void loop(void)
    {
    delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
      Serial.print("Ping: ");
      Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
      Serial.println("cm");
    //даем питание на силовой ключ датчика почвы
    digitalWrite(DAT_PIN, HIGH);
      // считываем текущее показания датчика влажности почвы
      int humidityNow(0);

    for(int i=0; i< 100; i++) {
        delay(10);
        humidityNow +=  analogRead(HUMIDITY_PIN);

      }
       humidityNow /=100;
      // если показания текущей влажности почвы
      // не равняется предыдущему запросу
      if(humidityNow != humidity) {
        // сохраняем текущие показания влажности
        humidity= humidityNow;
        // и выводим показания влажности на дисплей
        qd.displayInt(humidityNow);
     
      }
      //отключаем питание датчика почвы
        digitalWrite(DAT_PIN, LOW);
    // если значение датчика влажности меньше допустимой границы
      if (humidity < HUMIDITY_MIN)
      {
        // включаем помпу
        digitalWrite(POMP_PIN, HIGH);
        // ждём 3 секунды
        delay(3000);
        // выключаем помпу
        digitalWrite(POMP_PIN, LOW);

      }
      //задержка в 5 секунд - потом цикл по новой
       delay(5000);
    }
     
     
  20. mcureenab

    mcureenab Гуру

    наверное датчик влажности почвы должен находится в почве. тела, которые касаются датчика, но не замыкают контакты могут создавать электрические наводки и нарушать работу датчика.