Pull to refresh

Еще одна автоматическая поливалка для цветов на 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.

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




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

— Советы по прошивке и возможность задать вопросы тут.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.