Автополив растений на Attiny10

Всем доброго времени суток. Решил я сделать простейшую систему автополива на Attiny 10. За основу взял код от Гайвера. Там использовался Digispark, то-есть Attiny85. Для такой простой задачи, как по мне ее слишком много, но как знаем - Гайвер за доступность, так что это моё мнение. Код в Attiny 10 занял 416 байт (40%), поместился бы и в Attiny 5 но её у меня нет. Прошивать Attiny 10 нужно по такой схеме с помощью USBasp, она использует свой интерфейс - TPI


Схема подключения очень простая (я собрал на макетке, в место помпы - светодиод на PB0)

Настроек в коде всего 3: Период срабатывания (секунды), Время работы (секунды), Пин помпы. В код все расписал, должно быть понятно

#define PERIOD_TIME 5 // Период таймера в секундах
#define WORK_TIME 2 // Время работы в секундах 
#define MOS_PIN 0 // Пин помпы 

uint32_t mainTimer, myTimer; // Таймеры
bool state; // Состояние помпы

#include <avr/wdt.h> // Подключаем сторожевую собаку
#include <avr/sleep.h> // Подключаем сон
#include <avr/interrupt.h> // Подключаем прерывания 

#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // Функция для выключения АЦП

void setup() {
  for (byte pin = 0; pin < 6; pin++) pinMode(pin, INPUT); // Состояние всех пинов как входы для экономии энергии

  adc_disable(); // Выключаем АЦП
  wdt_reset(); // Сбрасываем собаку
  wdt_enable(WDTO_1S); // Включаем собаку в 1 секунду для максимальной точности

  WDTCSR |= _BV(WDIE); // Включаем прерывания по собаке
  sei(); // Включаем прерывания
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Ставим максимальный сон
}

void loop() {
  mainTimer++; // Увеличиваем таймер

  if (!state) { // Если помпа выключена
    if (mainTimer - myTimer > PERIOD_TIME) { // Если прошел период
      myTimer = mainTimer; // Сбрасываем таймер
      state = true; // Флаг для запуска в true
      pinMode(MOS_PIN, OUTPUT); // Пин помпы как выход
      digitalWrite(MOS_PIN, HIGH); // Жарим по полной 
    }

  } else { // Если помпа включена
    if (mainTimer - myTimer > WORK_TIME) { // Если прошло время
      myTimer = mainTimer; // Сбрасываем тайме
      state = false; // Флаг для запуска в false
      digitalWrite(MOS_PIN, LOW); // Вырубаем помпу
      pinMode(MOS_PIN, INPUT); // Пин помпы как вход
    }
  }

  sleep_enable(); // Включаем сон
  sleep_cpu(); // Спим
}

ISR (WDT_vect) {
  WDTCSR |= _BV(WDIE); // Прерывание вачдога
}

Думаю кому пригодиться, всем до свидания!

Какая разница, что у тебя есть и чего нет?
Раз поместился бы в Attiny 5, то и должен быть на Attiny 5.
Иначе рассуждения про избыточность Attiny 85 явно притянуты за уши.

Attiny 5 стоит дорого на али, на всеядном Чип Дип - 110руб. за штуку, я за 204руб купил 5 штук Attiny 10. Не выгодно получается :frowning:

За избыточность и в правду скорее всего был лишним факт

long с какой целью поставили? Мина - ловушка?

спасибо что заметили, исправил :grinning:

Вот тот самый Чип и Дип на сегодня:

Где Attiny10 по 204 руб. за 5 шт?

Я на Али покупал 10 тиньки, на тот момент 214, потом покупал у другого продавца за 304 (без доставки), сейчас цены от 500руб

Я вот тоже не могу теперь дешевых Atmega32A нигде найти. :sob:

Сравнивать сегодняшние розничные цены с тогдашними мелкооптовыми - так себе аргумент.

Если речь об избыточности, то нафига тут digitalWrite() и pimMode()? Поменяйте на регистры и оно, может, в какую-нибудь Аттини2 вошло бы или что там меньше Тини5?

Возможно потому, что адон не дурак писал, и в нем уже оптимизировано. Или потому, что мы на форуме Arduino а не avrfreaks.

1 лайк

Думаю ничикон нормально написал: GitHub - Nich1con/ATtiny10Core-addon: Addon with standart Arduino functions for ATtiny10Core

Так проще уже на асемблере писать :wink:

Да, согласен. Не знал что центы так вырастут :frowning:

Тиньки 2 не бывает. Вот код pinMode:

void pinMode(uint8_t pin, uint8_t mode) {
  switch (mode) {
    case INPUT:		
      DDRB &= ~ 1 << pin;
      PUEB &= ~ 1 << pin;
      return;
    case OUTPUT:
      DDRB |= 1 << pin;
      PUEB &= ~ 1 << pin;
      return;
    case INPUT_PULLUP:
      DDRB &= ~ 1 << pin;
      PUEB |= 1 << pin;
      return;
  }
}

Написан вполне нормально. Вот digitalWrite:

void digitalWrite(uint8_t pin, bool state) {
  if (state) {
    PORTB |= 1 << pin;
  } else {
    PORTB &= ~1 << pin;
  }
}

Тоже самое

И где тут ассемблер? Всего-то запись в порт.

Не то же самое. У вас всего один пин, а значит переменную можно заменить константой. Код для константы будет короче и быстрее.

Вообще, не понятна ваша реакция. Это же Вы сами завели разговор об “избыточности” - а значит вам должны быть интересны советы, как эту избыточность ещё уменьшить.
Если вы выложили код, чтобы им все восторгались и не смели критиковать - надо было сразу так и написать:)

1 лайк

Вот вот. Сначала простейшую, а затем глядишь, и датчики появятся, и , RTC, и меню с расписанием))

Да пора уже свой писать начинать))

P.S. А в целом норм, с почином, так сказать

Нет конечно, критикуйте, а то зачем тогда я его выложил сюда?) Делал проще - вот так и получилось, да и понять pinMode новичку как по мне проще чем всякие PORTB

Да вот скоро один проект буду делать, тоже выложу, посмотрите. Попробую в нем все сам сделать :grinning:

1 лайк