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

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

  1. Kirguh

    Kirguh Нерд

    Здравствуйте, уважаемые обитатели этого славного форума. Я только вкатываюсь в само понятие Ардуино и буду задавать здесь много странных, глупых и абсурдных вопросов.
    Вопрос №1
    Вот у меня есть:
    http://amperka.ru/product/soil-moisture-sensor
    http://amperka.ru/product/troyka-quad-display
    http://amperka.ru/product/arduino-uno
    Бессчетное количество проводов всех цветов и размеров
    BreadBoard
    Вот я могу:
    Вывести на дисплей 4 цифры
    Вот я сделал:
    Подключил дисплей
    (http://wiki.amperka.ru/_media/продукты:troyka:troyka_quad_spi.png Вот по этой картинке, но без шилда, напрямую)
    Подключил датчик
    Вопрос:
    Как вывести на дисплей показания датчика?
     
  2. mcureenab

    mcureenab Гуру

    Kirguh нравится это.
  3. Kirguh

    Kirguh Нерд

    Да, скетч и библиотеку я нашел и успешно вывел на дисплей пару чисел. Но я все еще не осознаю - как вывести на дисплей показания датчика влажности почвы.
     
  4. NikitOS

    NikitOS Король шутов Администратор

    покажите код знаю как но примера этого нет
     
  5. rkit

    rkit Гуру

    Почитайте литературу по С++.
     
  6. user999

    user999 Гик

    Вот так выводить в сериал порт
    Код (C++):
    #define H_DATA A0 // Подключаем пин датчика на A0

    void setup() {
      Serial.begin(9600); // Активируем Сериал порт
    }

    void loop() {
            float humidity = analogRead(H_DATA); // Получаем значение с пина
            humidity = (1.0 - humidity / 102300.0) * 100.0; // Конвертируем полученное значение в проценты
            Serial.println(String(humidity, 2)+" %"); // Выводим в сериал порт
            delay(1000); // Ждем секунду и повторяем все заново
    }
    На монитор сами выведите, раз цифры уже получилось вывести
     
    Kirguh нравится это.
  7. user999

    user999 Гик

    Но это не точные показания будут. Я циклом брал 100 показаний за секунду и их усреднял. Это во-первых, а во-вторых включал на эту секунду датчик с помощью реле, а все остальное время он был обесточен, так как он может быстро окислиться и выйти из строя
     
    Kirguh нравится это.
  8. Kirguh

    Kirguh Нерд

    Окей, я понял основной посыл, тогда позвольте задать еще один вопрос.
    Вопрос №2
    Мне следует подключить датчик влажности через силовой ключ - чтобы я мог подавать на него питание раз в 5-10 минут (чтобы датчик прожил как можно дольше)? Как это сделать, если отверстие 5V занято силовым ключом для помпы? Следует использовать breadboard?
     
  9. rkit

    rkit Гуру

    Паяльник следует использовать для реальных проектов.
     
  10. Kirguh

    Kirguh Нерд

    Паяльник, это хорошо, но на этапе создания первого прототипа - хочу обойтись без него. В дальнейшем он, безусловно, понадобиться. И тем не менее - ответье, пожалуйста на мой второй вопрос, если вас не затруднит это.
     
  11. rkit

    rkit Гуру

    Для прототипов бредборд. Для того он и нужен.
     
  12. Kirguh

    Kirguh Нерд

    Так я могу так сделать? Или эту проблему принято решать иначе?
     
  13. user999

    user999 Гик

    Конечно. Есть даже такие, на которых целые полосы выделены под питание [​IMG]
     
    Kirguh нравится это.
  14. Kirguh

    Kirguh Нерд

    Спасибо!
     
  15. Kirguh

    Kirguh Нерд

    Вопрос №3
    Вот я подключил два силовых ключа, ключ с помпой воткнул в 4-ый, ключ для датчика воткнул в 3. Оба ключа получают питание через breadboard из отверстий шилда 5v и gnd. Как мне теперь грамотно подключить датчик влажности почвы? Питание в силовой ключ, а передачу данных - куда? Оставить там, где и была - в разъеме передачи данных (S) в A0 (Речь идет об этом шилде http://amperka.ru/product/arduino-troyka-shield )?
     
  16. Kirguh

    Kirguh Нерд

    Код (C++):
    // Подключаем библиотеку для работы с дисплеем
    #include "QuadDisplay2.h"
    // даём разумное для пина, к которому подключена помпа
    #define POMP_PIN        4
    //имя пина к которому подключен датчик почвы
    #define DAT_PIN        3
    // даём разумное для пина, к которому подключён датчик влажности почвы
    #define HUMIDITY_PIN    A0
    // минимальный порог влажности почвы
    #define HUMIDITY_MIN    600
    // максимальный порог влажности почвы
    #define HUMIDITY_MAX    700
    // интервал между проверкой на полив растения
    #define INTERVAL        5000
    // переменная для хранения показания влажности почвы
    unsigned int humidity = 0;
    // статическая переменная для хранения времени
    unsigned long waitTime = 0;
    // создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(9);
    void setup(void)
    {
      // начало работы с дисплеем
      qd.begin();
      // пин помпы в режим выхода
      pinMode(POMP_PIN, OUTPUT);
      // выводим 0 на дисплей
      qd.displayInt(0);
    }
    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 ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) {
        // включаем помпу
        digitalWrite(POMP_PIN, HIGH);
        // ждём 2 секунды
        delay(2000);
        // выключаем помпу
        digitalWrite(POMP_PIN, LOW);
        // приравниваем переменной waitTime
        // значение текущего времени плюс 3 минуты
        waitTime = millis();
      }
    }
    Вот я попробовал сделать так, как описал выше - но красный огонек на силовом ключе от датчика почвы не загорается, где я ошибся? Сам код я взял готовый отсюда:
    http://wiki.amperka.ru/projects:irrigator
     
  17. Kirguh

    Kirguh Нерд

    Может проблема в том, что я не поставил туда задержку? А в какое место ее надо ставить? Успеет ли датчик собрать показания?
     
  18. Kirguh

    Kirguh Нерд

    UPD: Дал задержку в 2 секунды, теперь датчик все красиво считывает и все работает, хотя силовой ключ датчика не горит. Вопрос - правильно ли я воткнул задержку? Как правильно подбирать задержку? Что она вообще дает? Разве без нее команда digitalWrite(POMP_PIN, HIGH) не будет работать - пока я не скажу digitalWrite(POMP_PIN, LOW)?

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

    user999 Гик

    У вас получилось так. Подали питание на датчик, подождали 2 сек. ничего не делая. Считали показания, отключили. Поставьте не 2000, а 500. Этого хватит. Либо, если хотите уж 2 сек. ждать то через millis().
     
    Kirguh нравится это.
  20. user999

    user999 Гик

    Только у вас включается датчик в каждом цикле loop. Смысл так делать? Можно в конце loop поставить delay(INTERVAL);, а проверку на интервал
    Код (C++):
    (waitTime == 0 || millis() - waitTime > INTERVAL) &&
    убрать. И этот кусок тоже
    Код (C++):
    waitTime = millis();
    .
    Тогда получится, что при включении платы включится ключ, подождет 0.5 сек, снимет показания и выключится, если влажность низкая, то польет 2 сек., и будет ждать 5 сек., потом снова
     
    Kirguh нравится это.