Как стать автором
Обновить

Еще одна автоматическая поливалка для цветов на Attiny13A

Это – мой душевный порыв сделать мир немного лучше, особенно той его части, которая ближе всего ко мне. Да, я не новатор, и другие уже предлагали море своих вариантов и тут и там:

  1. Поливаем цветы – просто и быстро
  2. Умная поливалка цветка на микроконтроллере Attiny13A
  3. К вопросу об «умной поливалке» на микроконтроллере
  4. Делаем автополив комнатного цветка на Arduino за 15 минут
  5. Автополив цветов: автоматизируем регулярные задачи
  6. Примеры кода для интернета вещей: умная поливалка

Даже прослеживается какая-то эволюция. Постараемся выстоять со своим вариантом.

В своей реализации я пытался добиться гармонии между фанатизмом и ленью, т.е. сделать все без лишних сложностей (своими руками, никаких [5]). И вот что вышло.

Хороша ложка к обеду, потому нашей целью был умеренный полив по расписанию. Да, как написано в [3], можно обойтись и без микроконтроллеров, но мы не хотим растворять сенсоры в горшках цветов как автор выше, повторяя школьные опыты по электролизу. Поэтому мы будем использовать микроконтроллер.

Мой выбор пал на Attiny13A. Тут несколько факторов:

— автополивалка не для демонстрации, а для реального долгосрочного полива. Arduino([4]) и Edison([6]) для такого жалко, разве что процесс отслеживать по wi-fi, но это уже всем известная «ферма» получится. В результате выбрал, что не жалко.
— если честно, постигать ассемблер не хотелось, а предварительно погуглив, выясняется, что добрые люди постарались и прошиться можно через Arduino Software (IDE), что облегчает жизнь. Ну лично мне.

Потом, само собой, насос. Выбрал из дешевых погружаемый (3-6в, максимальный ток 100 мА, в результате врезал снаружи), у нас не промышленные масштабы, потому справится. Единственный критерий был – разумное потребление тока и напряжение не больше 9 вольт, чб запитаться от батарейки и не мучиться (вариант [2] со смывателем стекла для ВАЗ не годился из-за прожорливости и напряжения питания, для меня это повышение уровня сложности в разы).

Конечно, датчик влажности – FC-28. Плюс – в наличии цифрового выхода; опять же, меньше проблем с таррировками.

Питание – от батарейки, розеток на балконе нет, да и мобильность – это всегда хорошо.

И светодиод – чб понимать, что все работает.

Итого основа:

1. Attiny13A
2. Насос
3. Влагометр FC-28
4. Питание от батарейки
5. Светодиод

Остальные компоненты зависят от фантазии уже лично каждого исполнителя. Я выбрал питание от кроны 9В, но датчик влажности и микроконтроллер 5В, насос 3-6В. Поэтому мне понадобятся 2 стабилизатора напряжения 78L05 (для насоса будет отдельный). И поскольку запитать насос от ножки микроконтроллера напрямую нельзя из-за ограничений по току, нужно будет собрать для него отдельный ключ, я выбрал для этого транзистор 2N7000. Остальное – сопротивление, диоды, конденсаторы – это «бантики», что бы все работало правильно и ничего не сломалось.

И после изысканий и легкой гуглоруки получаем принципиальную схему
Схема

Прошиваем микроконтроллер для работы по следующему алгоритму:

— включились и мигнули светодиодом;
— включили влагометр, подождали 3 секунды, чб стабилизировались показания, сохранили показания, выключили влагометр;
— если сухо – включаем на 12 секунд насос;
— далее с интервалом 10 секунд мигаем светодиодом, чб видно было, что есть питание и все работает, и так полчаса (180 раз);
— через полчаса все начинается заново с включения влагометра (поскольку влагометр и подача воды в разных местах, то ждем полчаса, чб влага распределилась равномерно, а то можем устроить болото).

И сам код
#define hydrometr PB1
#define hydrometrData PB4
#define pump PB0
#define indicator PB2

void setup() {
   pinMode(hydrometr, OUTPUT); // питание на влагометр
   pinMode(pump, OUTPUT); // питание насос
   pinMode(hydrometrData, INPUT); // показания влагометра: 1- сухо; 0- влажно.
   pinMode(indicator, OUTPUT); // индикатор

   digitalWrite(pump, LOW); //выключаем насос
   digitalWrite(hydrometr, LOW); //выключаем влагометр

   digitalWrite(indicator, HIGH); //включаем индикатор
   myDelay(1000);
   digitalWrite(indicator, LOW); //выключаем индикатор
}

void loop() { 
  digitalWrite(hydrometr, HIGH); //включаем влагометр
  myDelay(3000);
  boolean waterSensor = digitalRead(hydrometrData); //показание влагометра
  myDelay(100);
  digitalWrite(hydrometr, LOW); //выключаем влагометр
  
  myDelay(1000);
  
  if (waterSensor == true) { //если влагометр показывает засуху
      digitalWrite(pump, HIGH); //включаем насос
      myDelay(12000);
      digitalWrite(pump, LOW); //выключаем насос
  }

  myDelay(1000);

  indicatorLight();
}

void indicatorLight() {
  byte iStart = 0;
  byte iEnd = 180;
  while(iStart < iEnd){
    digitalWrite(indicator, HIGH); //включаем индикатор
    myDelay(1000);
    digitalWrite(indicator, LOW); //выключаем индикатор
    myDelay(9000);
    iStart++;
  }
}

void myDelay(unsigned long delayMs) {
  unsigned long startMs = millis();
  while(1){
    unsigned long nowMs = millis();
    if ((nowMs - startMs) > delayMs) {
      break;
    }
  }
}


Для прошивки использовался программатор USBasp + Arduino IDE 1.6.6 + профикшеное ядро v0.22 для Attiny13. Прошивал на частоте 1,2.

Несколько фото




Полезные ссылки:

— Советы по прошивке и возможность задать вопросы тут.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.