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

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

  1. Kirguh

    Kirguh Нерд

    Сейчас проверю на почве, но до этого с водой он отлично работал.
     
  2. Kirguh

    Kirguh Нерд

    Сухая почва 0
    Мокрая почва началась с -162 и убывает дальше до -274, потом загорается 268, это как так?
     
  3. Kirguh

    Kirguh Нерд

    Достал из земли, получил 0, вставил в землю и вот значения подряд (они отрицательные!):
    -276
    -279
    -281
    -282
    -284
    -285
    -286
    -287
    -291
    -292
    -293
    Дошло до -309 и идет дальше вниз.
     
  4. Kirguh

    Kirguh Нерд

    Достал из горшка на -317 и вставил в воду. Заметил, что если погружать самый кончик, то значения будут в духе:
    -91
    -97
    -103
    А если опустить в воду до середины, то:
    24
    19
    16
     
  5. mcureenab

    mcureenab Гуру

    Отрицательных значений не должно быть ни при каких условиях. analogRead возвращает числа от 0 до 1023. Может быть дисплей криво подключен или библиотека чудит.
     
    Kirguh нравится это.
  6. mcureenab

    mcureenab Гуру

    Библиотека QuadDisplay2 неявно использует пины SCK и MOSI.

    Код (C++):
    QuadDisplay::QuadDisplay(uint8_t pinCS)
    {
        _pinCS = pinCS;
        _pinSCK = SCK;
        _pinDI = MOSI;
    }
     
    Kirguh нравится это.
  7. Kirguh

    Kirguh Нерд

    Хм, а как тогда быть? Все подключено, вроде, верно.
     
  8. mcureenab

    mcureenab Гуру

    Для отладки добавьте вывод переменной:

    Код (C++):

        humidityNow /=100;
        Serial.println(humidityNow);
     
     
  9. mcureenab

    mcureenab Гуру

    Это я мысли высказываю.
    Вот распиновка для MOSI и SCK. У вас Arduino UNO?

    https://www.arduino.cc/en/Reference/SPI
     
  10. Kirguh

    Kirguh Нерд

    Да, Уно, официальней некуда. На ней стоит шилд от Амперки.
     
  11. Kirguh

    Kirguh Нерд

    Сделал

    Код (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;
       Serial.println(humidityNow);
      // если показания текущей влажности почвы
      // не равняется предыдущему запросу
      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);
    }
     

    Сунул в воду (до середины), показания монитора и экрана совпали, вот лог монитора:
    Ping: 17cm
    0
    Ping: 14cm
    23
    Ping: 25
    41
    Ping: 27
    41
    Ping: 24
    47
    Сунул во влажную землю (конец) получил совпадение монитора и лога, вот лог (пинг я не стал указывать, он нам не нужен):
    143
    163
    159
    158

    Почему все стало так?
     
  12. mcureenab

    mcureenab Гуру

    Должно быть так:

    [​IMG]

    Пин SS ( CS ) можно выбрать другой (например 9) и свой выбор передать в .
    Код (C++):
        QuadDisplay qd(9);
    SS (?, например 9) -> CS
    MOSI (11) -> DI
    SCK (13) -> прямоугольный импульс.
     
  13. mcureenab

    mcureenab Гуру

    Здесь явно другие пины задействованы

    [​IMG]
     
  14. Kirguh

    Kirguh Нерд

    Такс, сейчас расскажу как у меня.
    У меня сей монитор подключен по 6 проводам.
    CS, V и G подключены как на картинке выше, где монитор подключается к шилду, но к 10, а не к 9.
    А DI, неподписанный контакт и Прямоугольный импульс у меня подключены иначе, а именно:
    DI к D0
    Неподписанный к DI
    Прямоугольный к прямоугольному
    (Эти три контакта в нижнем правом углу шилда.)
    Надо иначе подключить?
    На картинке мое подключение, только у меня к 10, а на картинке к 9.
     

    Вложения:

    Последнее редактирование: 17 апр 2017
  15. mcureenab

    mcureenab Гуру

    Да. Так правильно.
     
    Kirguh нравится это.
  16. Kirguh

    Kirguh Нерд

    Ну так у меня так и подключено, почему же тогда столь странные результаты?
     
  17. mcureenab

    mcureenab Гуру

    Бывает. То скетч не тот загрузят, то еще что. Из того что я увидел должно работать.
    если без отладки снова глючить начнет, придется глубже копать
     
  18. Kirguh

    Kirguh Нерд

    И как быть? Прост отказаться от среднего значения и мерить так, как мерил раньше? И такой вопрос - как мне занести данные пинга в переменную, чтобы потом в зависимости от значения этой перменной совершать те или иные действия? (Посмотрите сообщение 39 в этой теме)
     
  19. Slavdej

    Slavdej Нерд

    Всем доброго времени суток, я так же зелёный пока в написании скетчей для ардуино, но я быстро учусь...
    Подсказал бы кто то в каком направлении двигаться.
    Прикупил недавно GSM shield Sim900 для ардуино уно и уже собрал из этого маленькое чудо под названием " Не тронь АКБ " а то выйду тихонько и укушу.
    НУ в общем всё даже работает если только не одно НО.
    На сайте амперки я нашёл скетч управления исходящими вызовами с кнопки( в моём случае это концевик под капотом, только вот беда, он не доработан и расчитан на тест шилда.
    Мне немного повезло и я нарыл инфу и добавил функцию delay(15000).
    Теперь звонит каждые 15 секунд, а не однократно как было изначально прописано в скетче.
    А вот в чём собственно вопрос друзья: Как доработать скетч чтоб не использовать делей, но при этом создать определённый цикл, который будет повторяться если вызываемый абонент сбросил или недоступен.
    НУ или не повторяться а звонить в таком случае на другой номер.
    ЗАранее благодарю за помощь.
    Прилагаю скетч оригинал и слегка доработанный мной.


    Код (C++):
    Call_button.ino
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
    int btnPin = 12;
    boolean prevBtn = LOW;
    void setup()
    {
        gprsSerial.begin(19200);
    }
    void loop()
    {
        boolean currBtn = digitalRead(btnPin);
        if (prevBtn != currBtn && currBtn == HIGH) {
            //сразу после нажатия кнопки начинаем звонить по заданному номеру
            gprsSerial.println("ATD + +79031034424;");
        }
        prevBtn = currBtn;
    }
    Это оригинал.

    Код (C++):

    SoftwareSerial gprsSerial(7, 8);
    int btnPin = 12;
    boolean prevBtn = HIGH;
    void setup()
    {
        gprsSerial.begin(19200);

      //Включаем GPRS Shield, эмулируя нажатие кнопки POWER
      pinMode(9, OUTPUT);
      digitalWrite(9, HIGH);    // Подаем High на пин 9
      delay(3000);              // на 3 секунды
      digitalWrite(9, LOW);     // и отпускаем в Low.
      delay(5000);              // Ждём 5 секунд для старта шилда
    }
    void loop()
    {
        boolean currBtn = digitalRead(btnPin);
        if (prevBtn != currBtn && currBtn == LOW) {
            //сразу после нажатия кнопки начинаем звонить по заданному номеру
            gprsSerial.println("ATD + +380686617468;");
      delay(10000);
         }
          prevBtn = currBtn;
    }    
           
     
    А вот это с моими криворукими доработками)
     
  20. Kirguh

    Kirguh Нерд


    Ну так создайте отдельную тему?