Автополивщик растений на Arduino (Iskra Neo) не работает

Тема в разделе "Arduino & Shields", создана пользователем Gvozd, 12 авг 2015.

  1. mag

    mag Нуб

    я хочу сделать автополивалку только у меня будет без дисплея и с релюхой. Не знаю, надо ли, что то менять в этом исходном скетче?
     
  2. ostrov

    ostrov Гуру

    У вас пропущена ЗАКРЫВАЮЩАЯ скобка, о чем компилятор говорит прямым текстом. Возможно, скетч скопировали не полностью или рука дрогнула и стерла что нибудь. Или полностью сюда копипасту из вашего окна или ищите сами.
     
  3. mag

    mag Нуб

    да? вот пожалуйста :

    #include "QuadDisplay.h"

    const int HUMIDY_MIN = 200;
    const int HUMIDY_MAX = 700;

    void setup(void)

    char intDigit(unsigned int val, char pos)
    {
    char buf[6];
    sprintf(buf, "%04u", val);
    return buf[3-pos]-'0';
    }

    unsigned int intDigitSet(unsigned int val, char pos, char d)
    {
    char buf[6];
    sprintf(buf, "%04u", val);
    buf[3-pos] = '0'+d;
    return atoi(buf);
    }

    unsigned int readHumidy(void)
    {
    static unsigned int oldval = 0;
    static unsigned int res = 0;
    static unsigned int stability[4] = { 0, 0, 0, 0 };
    char i;
    unsigned int val = analogRead(A0);
    for(i = 0; i < 4; i++) {
    if(intDigit(oldval, i) != intDigit(val, i)) {
    oldval = intDigitSet(oldval, i, intDigit(val, i));
    stability = 0;
    }
    else {
    if(stability < 10) stability++;
    else res = intDigitSet(res, i, intDigit(val, i));
    }
    }
    return res;
    }

    void loop(void)
    {
    static unsigned long wait = millis() + 60000;
    static unsigned int oldhumidy = 0;
    static unsigned long stability = 0;
    unsigned int humidy = readHumidy();
    if(humidy != oldhumidy) {
    oldhumidy = humidy;

    displayInt(3, humidy);
    }
    if(wait != 0 && wait-millis() > 10) {
    return;
    } else wait = 0;
    if(humidy < HUMIDY_MIN) {
    digitalWrite(2, HIGH);
    analogWrite(5, 50);
    delay(1500);
    digitalWrite(2, LOW);
    digitalWrite(5, LOW);
    wait = millis() + 3*60000;
    }

    Скопировал у себя. Подскажите пожалуйста если можете...
     
  4. ostrov

    ostrov Гуру

    Слово "тэг" о чем нибудь говорит?

    Отсутствует закрывающая скобка у loop() и вообще отсутствует setup(), как он будет ножками дрыгать без инициализации?
    Код (C++):
    #include "QuadDisplay.h"

    const int HUMIDY_MIN = 200;
    const int HUMIDY_MAX = 700;

    void setup(void) {
    }

    char intDigit(unsigned int val, char pos)
    {
      char buf[6];
      sprintf(buf, "%04u", val);
      return buf[3 - pos] - '0';
    }

    unsigned int intDigitSet(unsigned int val, char pos, char d)
    {
      char buf[6];
      sprintf(buf, "%04u", val);
      buf[3 - pos] = '0' + d;
      return atoi(buf);
    }

    unsigned int readHumidy(void)
    {
      static unsigned int oldval = 0;
      static unsigned int res = 0;
      static unsigned int stability[4] = { 0, 0, 0, 0 };
      char i;
      unsigned int val = analogRead(A0);
      for (i = 0; i < 4; i++) {
        if (intDigit(oldval, i) != intDigit(val, i)) {
          oldval = intDigitSet(oldval, i, intDigit(val, i));
          stability = 0;
        }
        else {
          if (stability < 10) stability++;
          else res = intDigitSet(res, i, intDigit(val, i));
        }
      }
      return res;
    }

    void loop(void)
    {
      static unsigned long wait = millis() + 60000;
      static unsigned int oldhumidy = 0;
      static unsigned long stability = 0;
      unsigned int humidy = readHumidy();
      if (humidy != oldhumidy) {
        oldhumidy = humidy;
        displayInt(3, humidy);
      }
      if (wait != 0 && wait - millis() > 10) {
        return;
      } else wait = 0;
      if (humidy < HUMIDY_MIN) {
        digitalWrite(2, HIGH);
        analogWrite(5, 50);
        delay(1500);
        digitalWrite(2, LOW);
        digitalWrite(5, LOW);
        wait = millis() + 3 * 60000;
      }
    }
    А библиотека для дисплея установлена?
     
  5. mag

    mag Нуб

    Спасибо Вам. Если честно я вообще не понимаю в этом коде ничего. Попробывал Ваш код, но опять какие то ошибки:
    Код (C++):
    Arduino: 1.6.3 (Windows 7), Плата"Arduino Nano, ATmega328"

    irrigator.ino: In function 'unsigned int readHumidy()':

    irrigator.ino:34:17: error: incompatible types in assignment of 'int' to 'unsigned int [4]'

    irrigator.ino:37:23: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

    irrigator.ino:37:36: error: lvalue required as increment operand

    Ошибка компиляции.

      Это сообщение будет содержать больше информации чем
      "Отображать вывод во время компиляции"
      включено в Файл > Настройки
     
  6. ostrov

    ostrov Гуру

    Потому что вы просто взяли готовый код и случайным образом выкинули из него часть строк. Так его не редактируют. И еще у меня подозрение, что библиотека у вас таки не установлена.
     
  7. mag

    mag Нуб

    Подскажите мне пожалуйста как и чего нужно сделать? что бы это все вкинуть наконец в это ардуино... и начать сборку и эксперементы.... Какие мне надо библиотеки? и как правильно нужно ваш код скопировать и вкинуть в ардуино?
     
  8. ostrov

    ostrov Гуру

    Если нужен минимал, то просто датчик влажности (а то и два гвоздя его заменяющие) и водяной насос. При одном значении от датчика насос включается, при другом выключается. Разумеется, эти значения должны быть немного разными, первое меньше второго. То есть скетч строк на несколько и пишется минут за несколько.
     
  9. mag

    mag Нуб

    Да вы все правильно поняли. Мне нужно все так как вы сказали. можете помочь мне в этом вопросе? единственное у меня там еще релюха будет которая будет включать насос... Мне нужен рабочий скейтч и наверное небольшое описание... Если можно конечно
     
  10. MDV

    MDV Гик

    Уважаемый, просто писать код за вас могут в другом разделе. На форуме вам могут помочь разобраться в проблеме.
    Исходя из того что вы описали до финала ещё далеко.
    Понятно то, что хотите получить, но не понятно, что есть в наличии и как это скоммутировано. Другими словами хотите получить помощь сформулируйте проблему и опишите что её вызвало, иначе помощь будет адекватна вопросу.
    Вставьте в сообщение текст скетча опишите что с чем соединено и какая проблема
     
    Tomasina нравится это.
  11. Gvozd

    Gvozd Нуб

    Убрал дисплей, но не пробовал на дуине.
    Код (C++):
    // использовалась ИСКРА НЕО
    #define RELAY_PIN 4 // пин подключения реле
    const int HUMIDY_MIN = 200; // влажность МИН
    const int HUMIDY_MAX = 700; // влажность МАКСИМУМ

    void setup(void)
    {
    pinMode(RELAY_PIN, OUTPUT); // пин реле выход
    }
    char intDigit(unsigned int val, char pos)
    {
      char buf[6];
      sprintf(buf, "%04u", val);
      return buf[3-pos]-'0';
    }
    unsigned int intDigitSet(unsigned int val, char pos, char d)
    {
      char buf[6];
      sprintf(buf, "%04u", val);
      buf[3-pos] = '0'+d;
      return atoi(buf);
    }
    unsigned int readHumidy(void)
    {
      static unsigned int oldval = 0;
      static unsigned int res = 0;
      static unsigned int stability[4] = { 0, 0, 0, 0 };
      char i;
      unsigned int val = analogRead(A0);
      for(i = 0; i < 4; i++) {
        if(intDigit(oldval, i) != intDigit(val, i)) {
          oldval = intDigitSet(oldval, i, intDigit(val, i));
          stability[i] = 0;
        }
        else {
          if(stability[i] < 10) stability[i]++;
          else res = intDigitSet(res, i, intDigit(val, i));
        }
      }
      return res;
    }
    void loop(void)
    {
      static unsigned long wait = millis() + 10000;
      static unsigned int oldhumidy = 0;
      static unsigned long stability = 0;
      unsigned int humidy = readHumidy();
      if(humidy != oldhumidy) {
        oldhumidy = humidy;
     
      }
      if(wait != 0 && wait-millis() > 10) {
        return;
      } else wait = 0;
     
    if (humidy < HUMIDY_MIN)
      {
        digitalWrite(RELAY_PIN, HIGH);
        delay(10000);
      }
      else if (humidy > HUMIDY_MAX)
      {
        digitalWrite(RELAY_PIN, LOW);
      }
      wait = millis() + 10000;
    }
     
     
  12. Gvozd

    Gvozd Нуб

    Если реле будет включать 220 вольт, то и контакты реле должны выдерживать это напряжение и потребляемую силу тока (Амперы). В моей поливалке реле управляется с дуины 5 в, само реле 9-ти вольтовое, а включает оно напряжение 220 В для насоса. На фото само устройство. DSC01551.JPG DSC01552.JPG
     
  13. tio

    tio Нуб

    Здравствуйте, я хотел собрать автополивщик растений с сайта амперки, вроде все соединил правильно и скетч с сайта загрузил. он прошивается на arduin uno. датчик всё показывает правильно, а помпа не качает. уже голову сломал, в чем может быть проблема, подскажите пожалуйста. может что не так подслединил (файлы фото поделки прикрепляю)
    01.jpg 02.jpg 03.jpg
     
    Последнее редактирование: 29 сен 2016
  14. MDV

    MDV Гик

    Для начала проверь изменяется ли сигнал на управлении мосфетом
     
  15. tio

    tio Нуб

    Я так понимаю что когда помпа должна включатся то мосфет должен подавать напряжение на плюс и минус. Получается с тройки шилд напряжение на мосфет приходит на S и V (я тестером проверил 4,8 вольта), а + и - не замыкаются на синем клемнике. (может в скетче что не так ?)
     
    Последнее редактирование: 30 сен 2016
  16. Limoney

    Limoney Гик

    S - управляющий сигнал вкл\выкл - желтый провод
    На фото вы меряете напряжение на мосфете. Грубо говоря, мосфет можно рассматривать подобно выключателю. Как бы меряете напряжение между контактами выключателя, а источник тока не подключен.
    Права принадлежат Амперке
    http://wiki.amperka.ru/продукты:troyka:mosfet

    Нагрузка
    Модуль предназначен для коммутации нагрузки постоянного тока напряжением до 30 В и током до 12 А. Силовой ключ ставится в разрыв проводника, идущего от нагрузки к отрицательному контакту источника питания. При этом колодка под винт, отмеченная знаком «−» должна соединяться напрямую с отрицательным контактом источника питания. Колодка отмеченная знаком «+» соединяется с нагрузкой.
     
  17. MDV

    MDV Гик

    Давай по порядку
    1. Проверяй схему. В скетче управление с пин4 у тебя если фотка правильная подключение управлением мосфетом к пин3
    2. Как писал ранее проверь изменяется ли напряжение на управляющем пине
    3. Если не изменяется смотри скетч в противном случае смотри мосфет и его коммутацию
     
  18. tio

    tio Нуб

    Вот сейчас я подключил так:
    1) дисплей подключил на пин 3 (как указано на картинке).
    2) мосфет подключил на пин 4
    3) загрузил скетч с сайта в ардуин уно.
    После того как я загрузил скетч, датчки у меня показывает 350 (значит он работает верно) и если показания датчика равны 350, я так понимаю что на мосфет должено прийти напряжение чтобы помпа включилась пока показания датчика не станут равны 700 после чего он должен автоматически отключится, на мосфет напряжение не приходит (картинка-02).
    А теперь у меня вопросы по скетчу: когда я в скетче я меняю параметр displayInt(3, 0); например на displayInt(4, 0); (куда у меня подключен мосфет, то напряжение на мосфете появляется (картинка-01)).
    Почему не подается напряжение на мосфет когда показания датчика равны = 350, может что в скетче не так или в моём подключение ?
     

    Вложения:

    • 01.jpg
      01.jpg
      Размер файла:
      71,8 КБ
      Просмотров:
      455
    • 02.jpg
      02.jpg
      Размер файла:
      307,8 КБ
      Просмотров:
      457
  19. Limoney

    Limoney Гик

    Напряжение на мосфет не приходит. Через мосфет течет ток.
    Когда Вы подаете сигнал включить силовой ключ на плате Troyka-модуль должен загореться светодиодик. Светодиодик загорается?
     
  20. tio

    tio Нуб

    он загорается если я в скетче меняю параметр displayInt(3, 0); например на displayInt(4, 0);, или вместо дисплея подключай мосфет.
    мне не понятно, я собрал всё как на картинках с сайта амперки, и залил скетч с той же странички, почему у меня не работает поделка.
    а есть у вас полностью собранная фотография рабочей поделки автополива и скетч который в неё залит ?
     
    Последнее редактирование: 4 окт 2016