Авторизация
Зарегистрироваться

Клон Digispark. Тот же ATtiny85, только с USB


То, о чем говорили большевики… хотя стоп. Это не совсем то, о чем говорили большевики. Это новый подход к прототипированию устройств на ATtiny85 в среде Arduino. А ATtiny85 — это как раз то, что отлично подходит для многих вещей, где полноценные Arduino-совместимые платы вроде Pro Mini, Uno и, тем более, Mega избыточны. Причем конкретно эта штука хороша тем, что на ней можно быстро, без паутины проводов и программаторов обкатать код, который потом будет трудиться в чем-то готовом.

И, да, я сейчас именно о теме электронных конструкторов, а не о хардкорной микроэлектронике и низкоуровневом программировании, до которых вряд ли когда-нибудь доберусь.





Небольшая политинформация. ATtiny85 — небольшой микроконтроллер с приличными возможностями и приятными особенностями, включая:

— 8 КБ памяти для программного кода, 512Б памяти для исполняемого кода
— 6 цифровых пинов
— 4 входа ADC
— 2 выхода PWM
— аппаратное прерывание
— частота от 1 МГц до 20 МГц
— питание от 1,8В до 5,5В (в зависимости от модификации)
— потребляемый ток — от 0,1 мкА при 1,8В в режиме максимальной экономии энергии
— выпускается (помимо прочих) в миниатюрном SOIC8 и более удобном для начинающих DIP-корпусах

Даташит на случай, если я что-то переврал.

Вообще это семейство также включает ATtiny25 и ATtiny45 — c 2КБ (128Б) и 4КБ (256Б) памяти для программного кода (исполняемого кода) соответственно. Легко видеть, почему я отдаю предпочтение ATtiny85: максимум памяти.

Казалось бы — этот контроллер идеальный кандидат в заместители Arduino, когда нужно миниатюрное, автономное и долгоживущее (от одного комплекта батарей) устройство. Например, так любимый нами всеми метеодатчик.

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

С программатором, предположим, да — завершаются (при условии, что есть нужная колодка). Но если его нет, а есть Arduino, то для каждой прошивки к ATtiny85 нужно подключать 6 (!) проводов. Конечно, со временем я научился делать это не за шесть операций, а всего лишь за четыре.

Но все равно очень утомительно.

И на этом фоне разработка парней из Digistump, которые придумали, как сделать так, чтобы ATtiny85 можно было без проблем программировать через USB, выглядит фантастически привлекательно. Решение, насколько я могу судить, комбинированное — немного согласующей обвязки для USB, плагин для среды Arduino и хитроумный бутлоадер (micronucleus tiny85) в микроконтроллере.

По их собственным словам, штука работает на грани возможного, поэтому не факт, что будет всегда и на все сто процентов совместима с любым USB-оборудованием. Кроме того, минималистический подход в схемотехнике выливается в полное отсутствие защит: фактически перед нами голый микроконтроллер.

Отсюда рекомендации: тщательно проверять полярность подключения питания и, по возможности, подключать контроллер к компьютеру через промежуточный USB-хаб. Чтобы в случае чего умер только хаб, а не порт компьютера.

Несмотря на эти ограничения, получившаяся у них плата Digispark оказалась настолько хороша, что стала эталонным дизайном вроде Arduino. Благо схемы, рисунок платы и софт эти товарищи раздают совершенно бесплатно.

По крайней мере только этим можно объяснить феноменальное количество всевозможных клонов Digispark в китайских магазинах. Клоны эти во многом идентичны, и различаются разве что конструктивом USB-разъема для подключения к компьютеру. Где-то он интегрирован на плату — как у плоских флешек. Где-то — реализован популярным microUSB.

Второй вариант (о котором речь) мне кажется более рациональным. Во-первых, не надо беспокоиться о наличии свободного места для подключения платы. Во-вторых, при активной отладке не нужно постоянно теребить далеко не вечный разъем у компьютера или хаба. В третьих, постоянно подключенный к компьютеру кабель USB-microUSB можно использовать и в других целях.

Итак, безымянная плата ATTINY85 Microcontroller Development Board на основе дизайна Digispark. Здесь мы видим самый обычный ATtiny85 20SU, то есть чип с рабочим диапазоном напряжений 2,7В — 5,5В и максимальной частотой 20 МГц в корпусе SOIC8.

Пинов отрезали ровно девять штук — под число контактов. Не больше, не меньше:





Размеры платы примерно 18х22 мм.

На плате, помимо прочего, размещается стабилизатор напряжения LM78L05. По этой причине питать контроллер можно двумя путями: напряжением до 5В при подключении к пину 5V и до 10В при подключении к пину Vin (через стабилизатор). В теории, если верить даташиту стабилизатора, он может выдержать и до 35В, но, вероятно, недолго.



Кроме удобного питания на плате удобно выведены и подробно подписаны пины контроллера. С лица — цифровые, со спины — по протоколу и аналоговым функциям. В общем, не заблудишься.





Для чего все это может пригодиться? Как и говорил — для прототипирования. То есть, для отладки железа и кода перед финальной сборкой. Например, с моими кривыми руками отладка может включать несколько десятков «заливок» кода в контроллер, что при упомянутых выше четырех операциях с проводами (что также подразумевает постоянный контроль правильности подключения) становится мягко говоря утомительным.

Здесь же — подключил один провод, залил код, отключил — проверяешь. Не понравилось — для изменений нужен тот же один провод. Красота.

Но для начала нужно подготовиться, что несложно. В первую очередь напаиваем гребенку для макетирования:



Теперь устанавливаем своеобразный плагин для среды Arduino (поддерживается начиная с версии 1.6.5). Процесс подробно описан в Wiki Digispark.

Открываем настройки:



Вставляем в поле Additional Boards Manager URLs строку
http://digistump.com/package_digistump_index.json
:



Переходим в меню Инструменты — Boards Manager:



В выпадающем списке Type выбираем Contributed, а затем щелкаем по Digistump AVR Boards, при этом появится кнопочка Install, которую и нажимаем:





Начнется скачивание и установка софта и драйверов. Говорим, что согласны на все:





Наконец все готово:



Выбираем рекомендованную для начинающих плату Digispark (Default — 16,5mhz):



Можно вбить классическую «мигалку» из примеров самих Digistump:



В отличие от классических плат Arduino, эту плату не нужно подключать к компьютеру перед загрузкой прошивки. Наоборот, сначала нужно запустить загрузку из среды Arduino и дождаться приглашения к подключению контроллера. Вот теперь — можно.

Таймаут на загрузку — 60 секунд:



Связано это с особым режимом работы загрузчика: при старте контроллера он ждет загрузки кода через USB в течение 5 секунд, а потом переключается в режим исполнения имеющегося в памяти контроллера кода.

Иными словами, если контроллер подключить к компьютеру до приглашения, то спустя пять секунд он начнет выполнять имеющийся код (если есть), а чтобы загрузить новый, нужно отключить и снова подключить плату к компьютеру.

Загрузка пошла:



Готово:



При прототипировании также следует иметь в виду и другие важные отличия данной платы от Arduino.

Пины 3 и 4 используются для USB, поэтому если они также необходимы в финальном проекте, то подключенную к ним для отладки периферию лучше отключать на время загрузки новой версии прошивки. Также надо иметь в виду, что к пину 3 подключен подтягивающий резистор 1,5К, необходимый для того же самого USB. Т.е. на этом пине по умолчанию будет далеко не ноль.

Кроме того, пин 1 (физический) в Digispark, в принципе, доступен к использованию, в то время как у классического ATtiny25/45/85 он предназначен для сигнала Reset, который требуется при прошивке. То есть, следует иметь в виду, что с прицелом на простой перенос кода на ATtiny85 (например) нежелательно использовать пин 1 (физический) в своем коде.

На всякий случай: нежелательно не равно «запрещено». По крайней мере, умельцы сообщают, что при использовании физического пина 1, впоследствии придется пользоваться уже не самым простым высоковольтным программатором.

А помимо ограничений ATtiny85 (поддерживаются не все библиотеки и не все команды языка) есть и ограничение по памяти для программного кода, которой в версии Digispark 6КБ (а не 8КБ, как у «голого» ATtiny85).

Для тех, кто задумывается об использовании данных плат в готовых устройствах сообщаю, что на примере «Пищаля» потребление в активном режиме при напряжении 5В — около 30 мА. В режиме предположительно максимально глубокого сна, на который я способен уговорить контроллер по советам умных людей — 13,38 мА.

На примере «мигалки» получилось 30 мА при погашенном мигающем светодиоде и 35,5 мА — при горящем.

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

Где бы мне могла помочь эта плата? Да уже на самом деле в уйме, уйме мест, где работают крохи ATtiny85. Давайте считать.

Сигнализатор открытого дверного замка «Пищаль» (он же — «Трындец»)

Необходимость в этой штуке стала неотвратимой после того, как я стал систематически забывать закрывать входную дверь. Причин множество: сумки, мешающиеся коты, усталость в конце концов.

Пищалка, батарейка, контроллер, микрик — ничего лишнего:



Об этой проблеме я вспоминал уже когда ложился спать, а вставать лишний раз только чтобы узнать, закрыта дверь или открыта, очень не нравилось. Итог — ATtiny85 с пьезокерамической пищалкой, микропереключателем и батарейкой CR2032.



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

Код

// Код сна: http://donalmorrissey.blogspot.ru/2010/04/sleeping-arduino-part-5-wake-up-via.html
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

volatile int f_wdt=1;
#define alPin 1 // пин пищалки
#define alTime 38 // таймаут для сигнала в 8-секундных интервалах = alTime*8
boolean alarm = false; // флаг включения сигнала
byte alTimeOut = 0; // счетчик таймаута

// www.technoblogy.com/show?KX0
#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off) 
#define adc_enable() (ADCSRA |= (1<<ADEN)) // re-enable ADC

ISR(WDT_vect)
{
  if(f_wdt == 0)
  {
    f_wdt=1;
  }
}

void enterSleep(void)
{
pinMode(alPin, INPUT);

set_sleep_mode(SLEEP_MODE_PWR_DOWN); 

sleep_enable();

sleep_mode();

sleep_disable(); 

power_all_enable();

pinMode(alPin, OUTPUT);
digitalWrite(alPin, LOW);

}

void setup() {

adc_disable();

/*wdt_enable(WDTO_8S);
WDTCR |= _BV(WDIE);
*/

 /*** Setup the WDT ***/

  /* Clear the reset flag. */
  MCUSR &= ~(1<<WDRF);

  /* In order to change WDE or the prescaler, we need to
   * set WDCE (This will allow updates for 4 clock cycles).
   */
  WDTCR |= (1<<WDCE) | (1<<WDE);

  /* set new watchdog timeout prescaler value */
  WDTCR = 1<<WDP0 | 1<<WDP3; /* 8.0 seconds */

  /* Enable the WD interrupt (note no reset). */
  WDTCR |= _BV(WDIE);

pinMode(alPin, OUTPUT);
tone(alPin, 300, 500);
delay(500);

}

void loop() {

if(f_wdt == 1) {
  if (alarm == false) {
    if (alTime > alTimeOut) { // если время таймаута не прошло
          alTimeOut++; // увеличиваем счетчик
          f_wdt = 0; // переключаем флаг признака просыпания
        } else {
          alarm = true; // иначе разрешаем сигнал
        }
    }
}
    if (alarm == true) {
      makeSound();
    } 
  if (f_wdt == 0) {
    enterSleep();
  }
}

void makeSound() {
  tone(alPin, 450, 250);
  delay(350);
  tone(alPin, 750, 250);
  delay(3000);
}



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



Иными словами, если забыть закрыть дверь, то через пять минут звуковой сигнал об этом напомнит. Ну почти как в холодильниках с подобной функцией. Отличие только в том, что «Пищаль» наблюдает за замком, а уж что там с дверью — это его не волнует.

Ну и еще нюанс: при включении (считай открытии двери) контроллер издает однократный писк. Это чтобы знать, что конструкция работает, как и батарейка.

Все идеально поместилось внутри дверной коробки. И уже неоднократно доказало свою пользу.

Автомат света «Артефакт»

Хотя я очень гордился простым решением для автосвета в гардеробе, когда свет включался контроллером по сигналу с беспроводного датчика открытия двери (из обычной беспроводной сигнализации), концепция себя изжила.



Во-первых, сама конструкция подразумевала, что нельзя просто так открывать и закрывать дверь, поскольку каждое открытие-закрытие переключало свет. То есть, необходимо было контролировать положение двери. Неудобно.

Во-вторых, со временем начались какие-то заскоки то ли у датчика двери, то ли у контроллера. В общем, срабатывать конструкция стала через раз, а причину я так и не нашел. Если что — батарейку в датчике менял, антенну крутил. Но что толку — до контроллера меньше полутора метров, а — не работает.

Стало очевидно, что дороги назад нет: надо менять сам принцип. Под это дело купил в Fix price несколько различных светильников (на корпуса), разломал дачный фонарик на солнечной батарейке под датчик света, в хозяйственном подвале приобрел батарейные отсеки под элементы ААА, в запасах откопал резервный передатчик на 433 МГц и популярный датчик движения HC-SR501.



Собрал все это воедино и вот именно здесь мне бы и понадобилась отладочная плата. Поскольку код я мучил довольно долго и сам замучился капитально, хотя задача не такая уж и сложная.

Код

// Код сна: http://donalmorrissey.blogspot.ru/2010/04/sleeping-arduino-part-5-wake-up-via.html
// Библиотека Livolo: http://forum.arduino.cc/index.php?topic=153525.0

#include <avr/sleep.h>
#include <avr/power.h>
#include <livolo.h>

#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off) 
#define adc_enable() (ADCSRA |= (1<<ADEN)) // re-enable ADC

#define txPin 1 // пин передатчика
#define txPowerPin 0 // питание передатчика
#define intPin 2 // пин прерывания
#define lightPin A2 // пин датчика света (цифровой пин 4, физический пин 3)
#define sparePin 3 // пустой пин (аналоговый пин 3, физический пин 2)
#define lightTimeOut 60000 // таймаут выключения света
#define lightTreshold 55 // порог уровня света для включения (датчик свет/тьма) 
unsigned long lightTime; // счетчик таймаута до выключения света

// УПРАВЛЕНИЕ Livolo
Livolo livolo(txPin);

void intHandler() {

  while(analogRead(lightPin) < lightTreshold) {
  
      lightsOn(); // выключение света, если он включен
      
  }

  lightTime = millis();
 
}

void enterSleep()
{
  
 pinMode(txPin, INPUT);
 pinMode(txPowerPin, INPUT);

  GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
  PCMSK |= _BV(PCINT2); // Use PB2 as interrupt pin
 
 adc_disable();
  
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  
  sleep_enable();
  
  sleep_mode();
  
  /* The program will continue from here. */
  
  /* First thing to do is disable sleep. */
  sleep_disable();
  
 power_all_enable();
 adc_enable();
 
  pinMode(txPin, OUTPUT);
  digitalWrite(txPin, LOW);
  pinMode(txPowerPin, OUTPUT);
  digitalWrite(txPowerPin, LOW);
}

void setup()
{
  /* Setup the pin direction. */
  pinMode(intPin, INPUT);
  pinMode(lightPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(sparePin, INPUT);
  digitalWrite(txPin, LOW);
  pinMode(txPowerPin, OUTPUT);
  digitalWrite(txPowerPin, LOW);
  attachInterrupt(0, intHandler, CHANGE);
  lightTime = millis();

}

void loop()
{

if ((millis() - lightTime) > lightTimeOut) {

  while(analogRead(lightPin) > lightTreshold) {
  
      lightsOn(); // выключение света, если он включен
      delay(1500);
  }
  
  enterSleep();
 
 } 
}

void lightsOn() {
 digitalWrite(txPowerPin, HIGH);
 noInterrupts();
 livolo.sendButton(6400, 80);
 interrupts();
 digitalWrite(txPowerPin, LOW);
  
}



Зато результат — симпатичная пирамидка, которая стоит на одной из полок и кажется, что ничего не делает. А на самом деле происходит следующее: контроллер спит до обнаружения движения, а когда его увидит, то оценивает уровень освещенности. Если света мало — включает, если много — ничего не трогает. Свет включается по радио, через выключатели Livolo.



Если нет никакого движения в течение минуты с включения света, контроллер свет выключает, потому что считает, что люди уже ушли. И после этого сразу же засыпает для экономии энергии.

Потребление в спящем режиме — около 60 мкА (с учетом датчика движения), в активном — около 8-9 мА.



Плюс конструкции по сравнению с «глупым» датчиком двери и в том, что если вдруг забудешь, что внутри автомат света и включишь свет вручную, то при открытии двери свет не выключится — такова логика «Артефакта».

Из той же логики растет недостаток: если свет включить вручную и не заходить, то свет не выключится, пока кто-то не зайдет.

Датчик протечек «Капель»

Это, если честно, не совсем удачная идея. То есть, железка удалась, но ее применение — нет. Дело в том, что в сантехническом шкафу однажды обнаружилась очень неприятная штука: ползучая протечка. Иными словами, соединение подтекало так, что это было особо незаметно, однако в итоге воды набралось столько, что стали возмущаться соседи снизу.

После этого я стал регулярно заглядывать в сантехшкаф, внимательно осматривая соединения и его «дно», и параллельно думал о том, как бы автоматизировать процесс. Теоретически меня могла бы спасти «нечеткая логика», то есть не совсем традиционное использование обычного метеодатчика.

Я рассуждал так: при протечке, которая не приводит к срабатыванию «затапливаемого» датчика, все же должна заметно повыситься влажность. И это повышение можно трактовать как сигнал к действию.

Придумано — сделано. Благодаря популярному датчику температуры и влажности ATtiny85 превратился в «Капель». Аппарат на макетной плате простоял в сантехническом шкафу две недели. Этого мне хватило для сбора статистики по влажности, которая, как оказалось, гуляет там в довольно широких пределах.

Но проблема оказалась не в пределах. Собственно, я для того и собирал статистику, чтобы понять порог срабатывания сигнализации. Проблема оказалась в том, что при натурном тесте (мокрая тряпка в сантехническом шкафу) влажность особенно не изменилась.

В общем, от «Капели» я отказался, но метеодатчик, который может передавать данные на Народный Монитор через домашний контроллер — остался. Точнее, остался код, а вот сам прибор я разобрал, поскольку стал заниматься «Артефактом».

Код

// Код сна: http://donalmorrissey.blogspot.ru/2010/04/sleeping-arduino-part-5-wake-up-via.html
// Основа для радиопротокола: http://thomasolson.com/PROJECTS/SC2262/
// Библиотека DHT: http://learn.adafruit.com/dht/downloads

/*
 * Sketch for testing sleep mode with wake up on WDT.
 * Donal Morrissey - 2011.
 *
 */
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

#include "DHT.h"

#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off)
#define adc_enable()  (ADCSRA |=  (1<<ADEN)) // re-enable ADC

volatile int f_wdt=1;
byte timeOut = 0;

#define txPin 1 // пин передатчика
#define sensorPower 4 // питание датчика
#define sensorPin 3  // пин датчика
#define DHTTYPE DHT22
#define txPower 0 // питание передатчика
#define alPin 2 // пин пищалки
#define interval 25 // число 8-секундных интервалов между отправками, около 200 секунд

#define PULSESHORT 450  // confirmed
#define PULSELONG  1350
#define PULSESYNC  13950 // Aproximately 10.67 times PULSELONG

byte param = 0; // тип данных (температура/влажность)
unsigned long myData; // данные к отправке
byte i = 0;
boolean leak = false;

DHT dht(sensorPin, DHTTYPE);


/***************************************************
 *  Name:        ISR(WDT_vect)
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Watchdog Interrupt Service. This
 *               is executed when watchdog timed out.
 *
 ***************************************************/
ISR(WDT_vect)
{
  if(f_wdt == 0)
  {
    f_wdt=1;
  }
}


/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Enters the arduino into sleep mode.
 *
 ***************************************************/
void enterSleep(void)
{
  
 digitalWrite(txPin, LOW);
 digitalWrite(sensorPower, LOW); // выключаем датчик
 digitalWrite(txPower, LOW); // выключаем передатчик
 pinMode(sensorPower, INPUT);
 pinMode(txPower, INPUT);
 pinMode(txPin, INPUT);
 pinMode(alPin, INPUT);
 pinMode(sensorPin, INPUT);
  adc_disable();
  
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   /* EDIT: could also use SLEEP_MODE_PWR_DOWN for lowest power consumption. */
  sleep_enable();
  
  /* Now enter sleep mode. */
  sleep_mode();
  
  /* The program will continue from here after the WDT timeout*/
  sleep_disable(); /* First thing to do is disable sleep. */
  
  /* Re-enable the peripherals. */
  power_all_enable();
  
 pinMode(sensorPower, OUTPUT);
 pinMode(txPower, OUTPUT);
 pinMode(txPin, OUTPUT);
 digitalWrite(txPin, LOW);
 digitalWrite(sensorPower, HIGH); // включаем датчик
 digitalWrite(txPower, HIGH); // включаем передатчик
 digitalWrite(sensorPin, INPUT_PULLUP); // включаем датчик
}



/***************************************************
 *  Name:        setup
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Setup for the serial comms and the
 *                Watch dog timeout. 
 *
 ***************************************************/
void setup()
{

    /*** Setup the WDT ***/
  
  /* Clear the reset flag. */
  MCUSR &= ~(1<<WDRF);
  
  /* In order to change WDE or the prescaler, we need to
   * set WDCE (This will allow updates for 4 clock cycles).
   */
  WDTCR |= (1<<WDCE) | (1<<WDE);

  /* set new watchdog timeout prescaler value */
  WDTCR = 1<<WDP0 | 1<<WDP3; /* 8.0 seconds */
  
  /* Enable the WD interrupt (note no reset). */
  WDTCR |= _BV(WDIE);

pinMode(sensorPower, OUTPUT);
pinMode(txPower, OUTPUT);
pinMode(txPin, OUTPUT);
digitalWrite(txPin, LOW);
digitalWrite(sensorPower, HIGH); // включаем датчик
digitalWrite(txPower, HIGH); // включаем передатчик
  dht.begin();
  getWeather();
}



/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Main application loop.
 *
 ***************************************************/
void loop()
{
 if (leak == false) {
  if (f_wdt == 1)
  {
   if (timeOut > interval) {
    getWeather();
    timeOut = 0;
    } else {
       timeOut++;
       }
    
    // Don't forget to clear the flag. 
    f_wdt = 0;
    
    // Re-enter sleep mode. 
    
    enterSleep();
  }
  else
  {
    // Do nothing. 
  }
 } else {
  digitalWrite(alPin, HIGH);
  delay(750);
  digitalWrite(alPin, LOW); 
 }
}

// ПОЛУЧЕНИЕ И ОТПРАВКА ПОГОДЫ
void getWeather()

{


  delay(3000);
  
  int h = dht.readHumidity()*10;
  // Read temperature as Celsius (the default)
  int t = dht.readTemperature()*10;

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    rcSend(133331);
    return;
  }
      
      if (t < 0) {
        myData = 15101000 + abs(t);} // температура = код датчика + признак температуры + знак температуры + температура
//        myData = abs(myData);} // температура = код датчика + признак температуры + знак температуры + температура        
        else {
            myData = 15100000 + t;} // температура = код датчика + признак температуры + знак температуры + температура 
//            myData = DHT.temperature*10;} // температура = код датчика + признак температуры + знак температуры + температура             

       rcSend(myData);           

       delay(1000);

// теперь отправляем влажность

    myData = 15110000 + h; // влажность = код датчика + признак влажности + влажность
//       myData = DHT.humidity*10; // влажность = код датчика + признак влажности + влажность       
       rcSend(myData); // отправляем влажность
       
   if (h > 700) { // если влажность больше 70% - поднимаем тревогу
    rcSend(3502421); 
    leak = true;
   }
}


static void rcSend(long remoteCode) {
  
  for(int repeat=0; repeat<4; repeat++){

   for (byte i = 24; i>0; i--) { // transmit remoteID
    byte txPulse=bitRead(remoteCode, i-1); // read bits from remote ID
     // Serial.print(txPulse);
      switch (txPulse) {
    
        case 0:  // 00
          ookPulse(PULSESHORT,PULSELONG);
          //ookPulse(PULSESHORT,PULSELONG);
          break;
      
        case 1:  // 11
          ookPulse(PULSELONG,PULSESHORT);
          //ookPulse(PULSELONG,PULSESHORT);
          break;
      } // switch
    } // for loop
    ookPulse(PULSESHORT,PULSESYNC); // S(ync)
  //  Serial.println();
  } // repeat
}

static void ookPulse(int on, int off) {
  digitalWrite(txPin, HIGH);
  delayMicroseconds(on);
  digitalWrite(txPin, LOW);
  delayMicroseconds(off);
}



Корректор не только осанки «Позиционер»

Об этой штуке я рассказывал в цветах и красках. В применении к прототипированию хочу сказать, что здесь упрощенная загрузка кода мне тоже очень бы помогла, поскольку «Позиционер» я отлаживал как-то очень долго.



Разумеется, что внутри у него все тот же самый ATtiny85.

На будущее

В планах, которые неизвестно когда сбудутся, переключатель освещения «Ротор». Очень хочется, знаете, такой портативный арт-объект с круглой, наподобие регулятора громкости в аудиотехнике, ручкой, вращение которой переключает свет во всей квартире.

То есть, крутишь в одну сторону — сначала включается фоновый свет, потом половина верхнего, потом — вторая половина верхнего. Крутишь в другую — все гаснет в обратной последовательности.

Даже заготовил концепт-версию кода под это дело. И успел вляпаться в борьбу с дребезгом контактов у энкодера, выяснив, что аппаратное подавление этой гадости очень эффективно.

Однако до финала еще далеко.

Возвращаясь к отладочной плате. Если спросите, купил бы я себе эту штуку сам, отвечу — однозначно бы купил. Собственно, уже и собирался.
Планирую купить +141 Добавить в избранное +100 +191
свернуть развернуть
Комментарии (141)
RSS
+
avatar
  • btx
  • 10 декабря 2015, 08:42
0
От arduino до программирования без него — один шаг, особенно при желании углубиться в процессы
+
avatar
  • sav13
  • 10 декабря 2015, 09:08
+1
Если убрать загрузчик, то ценность USB на борту упадет до минимума.
Будет обычнавя тинька
+
avatar
  • LynXzp
  • 24 декабря 2015, 03:06
+1
С чего бы? (У меня вообще привычка через программатор arduino программировать, начинал с китайских которые не программируются или RESET нужно жать) USB используется как COM порт для отладки принтами, не говоря уже об полезной передачи данных/управления. Можно взять обычную тиньку и присоединить/припаять переходник? Ну это уже паять/лепить, а в начале про программирование было.

Часто забывают про одно преимущество Arduino — это готовые wolrd wide стандартизованные платы. Скетч (hex) и схему скинул — и мальчик в африке собрал твою схему.

Единственное чего меня бесят дуины так это контакты и монтажные платы. Без пайки/закрученных контактов глюки можно ловить до посинения

https://aliexpress.com/item/item/NANO-3-0-controller-Terminal-Adapter-for-NANO-terminal-expansion-board-for-arduino-Nano-version-3/32539440729.html
+
avatar
+2
Сколько хитрых и интересных вещей в голове у автора!
+
avatar
  • Motto
  • 10 декабря 2015, 12:31
+1
Самое главное откуда столь много свободного времени на их реализацию.
+
avatar
  • spc
  • 10 декабря 2015, 12:37
0
Если бы много :) Я, по-моему, тот же примитивный Пищаль не одну неделю делал :(
+
avatar
  • harusame
  • 29 сентября 2019, 02:02
0
Здравствуйте. А можно мне схему «Пищаль» (он же — «Трындец»)? А то я частенько забываю закрывать входную дверь. На сколько хватает батарейки?
+
avatar
  • spc
  • 29 сентября 2019, 14:17
0


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

Вообще, все зависит от того, насколько часто открывается дверь, и насколько долго остается в открытом состоянии. Потому что Пищаль работает только когда дверь открыта. В остальное время он просто физически отключен от батарейки. В идеале все это должно быть довольно близко к времени саморазряда батареи.
+
avatar
  • Efnir
  • 12 октября 2020, 19:31
0
А как саму плату от 1 банки лития питать? На 5V ногу подавать 3-4,2В, будет ли стабильно работать?
+
avatar
  • spc
  • 13 октября 2020, 01:03
0
Ваш вопрос под схемой, которая к 5 вольтам отношения не имеет. Эта схема на «голом» контроллере, который работает от другого напряжения. Плату в сборе я использовал только для отладки устройства.

Если вы хотите собрать пищалку на плате, то я не могу гарантировать, что она будет работать от 4 В.
+
avatar
  • Yaguar
  • 10 декабря 2015, 17:52
+1
Нужно просто начать!
+
avatar
  • Motto
  • 10 декабря 2015, 20:44
0
А потом будешь плакать и кончать © Н.Н. Носов «Витя Малеев в шклое и дома».
Лежит самобеглая тележка на ардуине, код долабать некогда и паук на 18 сервах, там всё еще более запущено.
+
avatar
  • sav13
  • 10 декабря 2015, 09:02
+6
Возвращаясь к отладочной плате. Если спросите, купил бы я себе эту штуку сам, отвечу — однозначно бы купил. Собственно, уже и собирался.
А зачем вам платы на тиньке, если платы на меге дешевле стоят?
И танцев с бубном для программирования в среде Ардуино там не нужно.

Я во тоже прикупил Attiny13 — сейчас даже не знаю, что сними делать
+
avatar
  • spc
  • 10 декабря 2015, 09:17
+1
Затем, к примеру, что на Mega библиотека RC-Switch будет работать. А на ATtiny85 — не целиком. Поэтому код на меге отработает, а при загрузке в рабочую тиньку — встанет. В такой ситуации по моему мнению логичнее отлаживаться на плате с целевым контроллером.
+
avatar
  • sav13
  • 10 декабря 2015, 09:22
+3
И еще выкинуть загрузчик и сэкономить на программной памяти. Но тогда USB на плате бесполезен

Или в готовом устройстве ставить мегу )))

Я пока вижу в тиньке одно преимущество — низкое потребление. Остальное, включая размеры SMD микросхем и цену — мизер
+
avatar
0
низкое потребление
Наконец-то узнал преимущество тинек
+
avatar
  • Alber
  • 10 декабря 2015, 18:43
0
Применять их разумно только для минимизации размеров и энергопотребления. В основном в датчиках.
+
avatar
  • Serg32
  • 10 декабря 2015, 10:37
0
Я дигиспарки на али брал по 1,3 $, конечно дороже нет смысла брать. Меньше чем за 4$ можно взять плату с stm32
+
avatar
0
О, в 1Кб вмещается код для управления семисегментником через драйвер от MAXim, код приемника данных от метеостанции и вывод всего этого на тот же семисегментник. А 78L05 ужасен, просто ужасен. Он, кажется потребляет только на собственные нужды 7 мА.
+
avatar
  • Zhenya88
  • 10 декабря 2015, 09:37
+2
Хороший обзор, полезный. Спасибо.
+
avatar
  • dop2000
  • 10 декабря 2015, 09:44
0
А чем она лучше/хуже arduino mini? К компьютеру подключать сложно, потребление, как выяснилось, не такое уж и низкое.
Ну да, много памяти. Но для описанных в обзоре проектов много памяти и не нужно.
+
avatar
  • yurok
  • 10 декабря 2015, 10:07
0
памяти мало как раз

нужно для отладки кода, если в готовом устройстве планируете такой контроллер использовать
+
avatar
  • dop2000
  • 10 декабря 2015, 10:14
0
А, там 512 байт, я прочитал, как 512 килобайт. Еще удивился :)
+
avatar
  • spc
  • 10 декабря 2015, 10:21
0
К компьютеру, кстати, подключается проще, чем Pro Mini. Поскольку не нужен преобразователь COM-USB (четыре провода, между прочим).

Ну а лучше тем, что, повторюсь, что плата упрощает (легко интегрировать в Arduino, легко подключать к компьютеру) отладку именно что на целевом контроллере, поскольку ATmega328 (часто используемый в Pro Mini/Uno и т.п.) заметно отличается по возможностям. И не факт, что рабочий на ATmega код будет работать и на ATtiny.
+
avatar
  • dop2000
  • 10 декабря 2015, 10:45
0
Спасибо, я понял, наконец. Это не плата для поделок, как ардуина, а скорее инструмент для прототипирования. А сам проект потом собирается на крохотном голом контроллере.
+
avatar
  • sav13
  • 10 декабря 2015, 10:49
0
Лучше 5 проводов, тогда Reset тыкать не нужно.
Но этот тоже нужно туда сюда втыкать при программировании
+
avatar
0
Бесплатная доставка! 1 шт. Digispark kickstarter совет по развитию ATTINY85 для Arduino usb использования микро контактного коннектора
https://aliexpress.com/item/item/Free-shipping-1pcs-Digispark-kickstarter-development-board-ATTINY85-module-for-Arduino-usb-use-Micro/32560977044.html
(from AliExpress Android). 1.22$

взял таких парочку, светодиодов помигал)) лежат для ws2812 удобно подключать.
+
avatar
  • batal
  • 10 декабря 2015, 10:19
+1
Ладно название, но у вас весь пост как буд-то из гугл транслейта…
+
avatar
  • stels
  • 10 декабря 2015, 11:20
0
знать бы еще как али от этого гуглтранслейта отвадить((
+
avatar
  • spc
  • 10 декабря 2015, 11:31
0
Это просто. Если заходите, а Ali встречает подобием русского, то справа вверху жмете на ссылку Go to Global site:



Правда если при этом были на странице товара, то Ali перекинет на главную страницу, что неудобно.
+
avatar
  • DDimann
  • 10 декабря 2015, 13:19
+5
А кроме того — при любом нечаянном движении — типа открыл ссылку, которая вела на.ру — и все, начинай сначала.
Грамотные они очень, очень облегчают нам жизнь.
Так облегчают, что никакого мата уже не хватает…
+
avatar
  • EngelS
  • 10 декабря 2015, 15:25
+1
в AdBlock\uBlock добавьте пользовательский фильтр «ru.aliexpress.com» И не будет случайных переходов. :)
+
avatar
  • Vipeg
  • 10 декабря 2015, 16:10
+2
Да, и он просто не будет открываться. Вариант немного не торт.
Для Лисы поставил себе плагин Redirector. Там можно ставить редиректы по маске. Поэтому меня всегда перенаправляет теперь на Global.
Настроек на 5 секунд, профита — на годы.
+
avatar
  • fidelich
  • 13 декабря 2015, 23:00
0
Земной поклон за Redirector! C ali разобрался. А на работе ещё несколько заготовок уже «думаются»
+
avatar
  • sav13
  • 10 декабря 2015, 16:49
0
И половина ссылок с этого сайта не будет работать. Или больше
+
avatar
0
Переходите на «глобал сайи» с помощью средней кнопки(под колесиком). Рядом откроется вкладка с глобалом на стартовой, но для верности ее перепроверить. Потом возвращаетесь на исходную страницу и в адресном окне удаляете все от начала до aliexpress. Далее ENTER и вуаля ваша исходная на аГлицком…
+
avatar
  • sav13
  • 10 декабря 2015, 10:54
0
У продавца 1 заказ, нулевой рейтинг. Страшно брать
Хотя у него Pro Mini на 328 атмеге за $1.3
+
avatar
0
Продавец без рейтинга, всего два заказа данного товара, и цена вдвое ниже чем в среднем по рынку… Я бы не хотел играть роль «каркающего ворона», но, имхо, перспективы в плане получения этой посылки несколько туманны.
+
avatar
  • Okmor
  • 10 декабря 2015, 17:31
0
Здесь продавец, скорее всего, обманывает.
На всех таких дешевых лотах много комментариев, что товар не соответствует описанию.

Почти всегда приходит не под кабель, а с разведенным штекером USB на самой плате.
+
avatar
  • Alber
  • 10 декабря 2015, 19:59
+3
Я понять не могу, почему при поиске на Али, некоторые позиции не показываются при сортировке по цене. Например эта ссылка не выходит при поиске «Digispark» и сортировке по цене. Хрень какая-то…
+
avatar
  • vismyk
  • 10 декабря 2015, 20:21
+2
Тамошний поиск это нечто. Пытался найти поиском официальный магазин LD — устал через несколько страниц. ;) Недавно случайно наткнулся на платы на STM32F1 по 2,60, но магазин не запомнил, а теперь поиском тоже найти не могу. :(
+
avatar
  • tklim
  • 10 декабря 2015, 10:13
0
>>Для тех, кто задумывается об использовании данных плат в готовых устройствах сообщаю, что на примере «Пищаля» потребление в активном режиме при напряжении 5В — около 30 мА. В режиме предположительно максимально глубокого сна, на который я способен уговорить контроллер по советам умных людей — 13,38 мА.
Тут точно нет ошибки?
Судя по даташиту, при 3В и 1Мгц должно быть порядка 0,6..1мА в ждущем режиме (idle). Может, конечно LM7805 на себя все берет.
+
avatar
  • spc
  • 10 декабря 2015, 10:27
0
Влияние обвязки можно проверить только одним способом — всю ее оттуда сдуть, чего я пока не планирую ) Но есть другие соображения.

Из практики: ATtiny85 на 8 МГц в активном режиме потребляет 8-9 мА. Вариант Digispark по предложенному «дефолтному» варианту работает на частоте 16,5 МГц. Это первое, что может влиять.

Второе — светодиоды. Светодиод питания не отключается в принципе (если его не выпаять, конечно). А судя по потреблению «мигалки», один светодиод кушает порядка 5 мА.

То есть, теоретически, даже если не брать в расчет частоту, то можно получить потребление как минимум 20 мА в активном режиме. Другое дело, что клон Digispark почему-то не лег спать — вот этого я вообще не понимаю. Ну или лег, но я недооцениваю потребление тока остальными компонентами, которые не спят.
+
avatar
  • tklim
  • 10 декабря 2015, 11:07
0
ну я к сожалению не сильно дружу с ардуиной, но думаю, 16,5 — это исключительно для УСБ, а сам проект можно хоть на 1М сделать (8 / 8)
Опять же, в ардуине я так и не осилил управление энергосбережением. Но в чистом С — в режиме powedown — там вообще доли микроампер. Idle — будет ну 1, ну может, 2ма.
+
avatar
  • spc
  • 10 декабря 2015, 11:12
0
Разумеется. Просто я измерял ток именно платы, поскольку вдруг у кого-то возникнет непреодолимое желание использовать ее уже в готовом устройстве.

Однако в этом случае все прелести платы только при использовании для отладки кода. Иначе, если посмотреть на список плат, можно видеть, что другие варианты Digispark на 8 МГц и 1 МГц не умеют USB.
+
avatar
  • tklim
  • 10 декабря 2015, 11:32
0
Я может, неправильно выразился, но у ATTINY нет 16,5МГц. Есть внутренний генератор на 6,4 или 8. Я не вникал в суть V-USB для даных устройств, но наверняка используется одна из данных частот + корректировка. Так что даже если не менять фьузы, то программно в основном коде можно сделать CLKDIV8, что даст 1МГц или 800КГц
+
avatar
  • spc
  • 10 декабря 2015, 11:45
0
Поскольку ровно то же самое написано в спецификации контроллера, я даже не знаю, что сказать. Могу только процитировать Digistump:

When the digispark boots up, it uses the USB signal to calibrate its clock to 16.5mhz. When powered by an external power supply this doesn't happen and the clock speed is closer to 16.0mhz, with roughly 10% accuracy.
+
avatar
  • sav13
  • 10 декабря 2015, 10:51
+2
У меня Pro Mini в режиме сна на 350мкА уходила. Правда при питании минуя стабилизатор и с демонтированными светодиодами
+
avatar
  • Aostspb
  • 10 декабря 2015, 11:27
0
Pro Mini в режиме сна
Наверняка еще и с перешитым на optiboot загрузчиком… :)
+
avatar
  • sav13
  • 10 декабря 2015, 11:44
0
Не без этого. Иначе таймеры все глючат
+
avatar
  • bosrait
  • 10 декабря 2015, 10:15
+3
Автор вы молодец!
Впервые в истории сайта по п.18 отработали полученный товар многократно, самым подробным обзором.
Спасибо.
+
avatar
  • spc
  • 10 декабря 2015, 10:27
0
И вам спасибо за отзыв )
+
avatar
  • eonpulse
  • 10 декабря 2015, 15:21
+6
Не впервые, у kirich замечательные обзоры по п.18
+
avatar
0
Пищалку проще и логичнее сделать на NE555.
Если прикручивать к ней мозги, так только в случае использования связи, когда уже ушел из дома (или лежишь засыпаешь) и захотелось узнать — а закрыта ли дверь? Залез через смарт/смс и убедился, что да, закрыл. :)
+
avatar
  • spc
  • 10 декабря 2015, 10:52
+1
Дело вкуса. Если я правильно понимаю идеологию NE555, то для такой «пищалки» нужно два корпуса, каждый — с его минимальной обвязкой (пара резисторов и конденсатор). В такой ситуации мне проще и логичнее заменить «лишние» детали кодом. Тем более, что «Пищаль» после включения старается проводить большую часть времени во сне (потребление 4 мкА), а в схеме с таймерами по меньшей мере один после включения схемы будет работать постоянно, что выльется в 2-3 мА.
+
avatar
+1
Чего? Ригелем давим и отключаем питание схемы. А когда открыт, пищим через длинные промежутки. Итого потребление в режиме закрытого замка=саморазряду батареи.
+
avatar
  • spc
  • 10 декабря 2015, 13:32
0
Т.е. одна NE555 может быть и генератором звуковой частоты и таймером?
+
avatar
0
Т.е. в режиме сна можно ничего не потреблять (в принципе, как и на тиньке).
А по таймеру — здесь разжовано.
+
avatar
  • spc
  • 10 декабря 2015, 13:56
0
Там по сути подстрочный перевод, из которого для меня не следует, что одна NE555 может быть и таймером и генератором. А если она этого делать не может то, мне не подходит: во первых, у меня пьезокерамика без встроенного генератора; во-вторых, даже если бы там был генератор, то вслушиваться в возможный писк с интервалом в 5 минут (например) — издевательство над собой.
+
avatar
0
Именно на 555 небыл упор в моем ответе. Я лишь заострил внимание на потребелении в «режиме сна».
А пищалку можно сделать на одновибраторе, триггерах Шмидта, счетчике и еще десятке однокорпусных решений. Ни одним 555-м, как говорится.
Пикаем одну секунду, через одну минуту, начиная с момента подачи питания. А питание начинает подаваться отводом ригеля.
p.s. еще раз, я не против впихивания контроллеров в любые безделушки, но потребление в режиме сна убирается в 0 (саморазряд батареи) снятием питания. На этом принципе живут многие пульты управления. В момент нажатия кнопки подается питание на контроллер, он его подхватывает и отправляет код, по таймеру сам у себя обрубывает питание. И до следующего нажатия — ни кто ничего не потребляет.
+
avatar
  • spc
  • 10 декабря 2015, 14:13
0
Теперь я вашу точку зрения понял, спасибо.
+
avatar
  • sav13
  • 10 декабря 2015, 14:13
0
А почему не собрать на двух 555? Цена явно будет меньше на порядок, чем у одной тиньки
+
avatar
  • spc
  • 10 декабря 2015, 14:32
0
В такой ситуации мне проще и логичнее заменить «лишние» детали кодом.
+
avatar
+1
Для этого есть NE556 — два-в-одном. Но наверное компактнее будет сделать на одном NE555(одновибратор) плюс вибратор на однопереходном транзисторе.
+
avatar
  • bazis13
  • 11 декабря 2015, 11:11
+1
потому что экономить 50-70 центов, когда тратишь дни на разработку… странно как-то.
Во-вторых, когда захочется большего, pro-mini скорей всего подойдет.
У меня замок на Uno шлет уведомления в pushbullet. Пищат все телефоны и компы )
+
avatar
0
Генератором не может. Есть биперы же копеечные.
А у вас тинька играет Моцарта разве?
+
avatar
  • spc
  • 10 декабря 2015, 14:11
0
Ну я не настолько эстет. Просто два тона, чтобы уж совсем там не уснуть рядом с дверью.
+
avatar
  • kalobyte
  • 10 декабря 2015, 10:50
0
автор так и не понял, что это за плата
быдлодуина тут не нужна, эта плата заточена под использование софтового усб
изначально это был проект littlewire.cc/
заливаеш туда прошивку и у тебя получается готовый мост усб-интерфейсы спи, и2ц и еще куча всего
а софт ты пишеш на сях с использованием функций или классов, которые автор littlewire.cc/ создал
или же можеш сам дописать на другом языке usb custom request

плюс и основное назначение этой платы — управлять периферией, не заморачиваясь на знание регистров мк

плату однозначно стоит брать, но она не будет работать с чипсетами нвидиа, что-то там у них с усб наверчено
хотя я бы не отказался от такой платы на стм32ф103
+
avatar
  • ABATAPA
  • 10 декабря 2015, 14:07
0
Они в Linux видны?

P. S.: Нашёл на старом сайте: There's no need to install any drivers.
+
avatar
  • kalobyte
  • 10 декабря 2015, 17:21
0
для работы с усб надо libusb
#if defined(LINUX)
   32    #include <usb.h>                             // this is libusb, see http://libusb.sourceforge.net/
   33 #else
   34    #include <lusb0_usb.h>               // this is libusb, see http://libusb.sourceforge.net/
   35 #endif
   36 #include "opendevice.h"                 // common code moved to separate module
   37 #include "littleWire_util.h"
   38 #include <stdio.h>
+
avatar
  • Vipeg
  • 10 декабря 2015, 10:52
+3
Сигнализатор открытого дверного замка «Пищаль»
Если сядет батарейка, Вы будете уверены, что дверь заперта. Но, как понимаете, напрасно. Думаю, имело бы смысл при отпирании двери контроллеру издавать короткий «бип», а только потом ждать 5 минут и пищать при незапертой двери. Через некоторое время Вы привыкните к «бипу» при отпирании. Следовательно, когда при отпирании «бипа» не будет, Вы таким образом узнаете, что пора менять батарейку.
Куда контроллер тратит такую уйму энергии — пока не понимаю
Когда я изучал возможность питания «стандартных» Nano от батареек, я пришел к выводу, что организация энергосбережения в них есть занятие неблагодарное. И причиной тому, в первую очередь, «прожорливость» линейного стабилизатора питания. Что касается обозреваемого сабжа, в подробности не углублялся, но существует вероятность той же проблемы. Разумеется, по поводу высокого энергопотребления из-за высокой частоты работы сабжа Вы правы — зависимость прямая.
Что же касается датчика протечек — тут только прямой контакт с водой. Я недавно реализовывал некоторую схему, связанную с датчиками уровня воды. Есть схемотехническое решение. Если интересно — могу поделиться.
+
avatar
  • spc
  • 10 декабря 2015, 11:01
0
Если сядет батарейка, Вы будете уверены, что дверь заперта. Но, как понимаете, напрасно. Думаю, имело бы смысл при отпирании двери контроллеру издавать короткий «бип», а только потом ждать 5 минут и пищать при незапертой двери.
Приятно видеть, что головы работают в одном направлении :) Процитирую и себя тоже:

Ну и еще нюанс: при включении (считай открытии двери) контроллер издает однократный писк. Это чтобы знать, что конструкция работает, как и батарейка.
+
avatar
  • Vipeg
  • 10 декабря 2015, 11:02
0
Ай эм сорьте :) Видимо, не заметил. Читал на работе, сосредоточиться тяжело :)
+
avatar
  • spc
  • 10 декабря 2015, 12:54
0
Только что заметил про датчики протечек. Если схема не запредельной сложности и адекватна для описанных «ползучих» протечек, когда все намокает не сразу, а в течение длительного времени и чтобы не опутывать каждую трубу проводами-сенсорами, то, конечно, интересно и буду очень признателен.
+
avatar
  • Vipeg
  • 10 декабря 2015, 13:13
+1
Вот как эта схема выглядела изначально (не моя).

Проблема в ней в том, что как самостоятельное устройство она работает неплохо, но она не без недостатков. Самая большая проблема в ней в том, что когда датчики слегка загрязняются, сигнальные светодиоды начинают еле-еле светиться. То есть нет чёткого «нуля» и единицы". Для соединения с контроллером вместо светодиода я использовал вход оптопары. Вот схема.

По схеме нюансы следующие (да простит меня ksiman):
Дело в том, что проблема с нечётким срабатыванием не была решена, поэтому я использовал КТ361 (ну просто красивенькие транзисторы, дань уважения к прошлому). После чего применил компаратор, который напряжения до 4 вольт игнорирует (считает нулём). Если больше — принимает решение, что это единица. Следовательно, я отсеял аппаратно все проблемы с «нулями-единицами» для контроллера. На выходе компаратора нужна подтяжка к плюсу. Я понял это слишком поздно, поэтому повключал подтяжку в самой ардуине (у меня 9-канальное устройство). Транзистор КТ361 вроде можно заменить на что-то похожее, а вот C945 — нет. Проверено на горьком опыте.
По габаритам 1 канал не очень большой — 60х13мм. Вот фотка из обзора про заказ плат (верхняя часть посередине).


Что касается датчиков. Они должны замкнуться каплей воды. В Вашем случае я конкретно не понял, что имелось ввиду под «ползучей» протечкой, возможно как раз сползающие капли вдоль трубы. В таком случае на трубу «одеть» кольцо из скотча, например, если трубы токопроводящие, и из оголённой проволоки от витой пары на скотче сделать 2 параллельных кольца, расположенные, например, в миллиметре друг от друга. Капля, сползая, «закоротит» эти 2 кольца из проволоки. Надеюсь, у меня получилось объяснить про эти кольца.
+
avatar
  • spc
  • 10 декабря 2015, 13:30
0
Спасибо — любопытная штука, но, к сожалению, не мой случай.
+
avatar
+3
ИМХО USBasp +avrdude (avrdudeprog, кто любит GUI) решает все проблемы за 114 рублей. Эта штука поддерживает почти весь спектр продукции атмел, фьюзы, чип ид и т.д.

При этом у Вас освобождается место от бутлоадера (а при таком кол-ве места каждый байт на вес золота) + не надо плясок с плагинами + Вы не зависите от среды. Удобность ничуть не меньше.
+
avatar
  • spc
  • 10 декабря 2015, 11:10
+2
Согласен. Но все дело в том, что от среды я завишу не по причине отсутствия программатора. Тут как в Простоквашино: средства у нас есть…

Ну а так как я по причинам интеллектуального свойства привязан к Arduino, то и выбираю решения для этой среды. И, да, я понимаю, что особо гордиться тут нечем.
+
avatar
+1
Что это за причины интеллектуального свойства? Использование сторонних библиотек? Дак все библиотеки там в виде исходников — подключай и используй напрямую. Безо всяких проблем.

Единственно — заливать надо будет через программатор — но бонусов это больше дает.
+
avatar
  • spc
  • 10 декабря 2015, 11:27
+3
Ума не хватает — вот и вся причина. Ну и еще одна причина, конечно, то, что ресурсов контроллера хватает на мои фантазии.
+
avatar
  • AFCrio
  • 11 декабря 2015, 10:12
0
На плате по ссылке пайка ужаснейшая.
+
avatar
  • glink0ln
  • 10 декабря 2015, 11:15
0
Спасибо за обзор. А теперь говна на вентилятор:
1. Самый жирный минус платы — 2 шима. RGB ленту уже толком не запитать.(да, можно софтовый, но нет :) )
2. Для ws281* тоже с таким количеством озу будет крайне сложно работать.
3. Стоимость выше чем у nano с одноименных сайтов.
4. На кой хер там преобразователь? Для типичных решений спокойно можно запитать и от 2 АА/ААА, одной li-pol при немного заниженной частоте.
+
avatar
  • spc
  • 10 декабря 2015, 11:28
0
Преобразователь меня тоже в тупик поставил. Тоже не понимаю, зачем он там. Но, видимо, клиент всегда прав.
+
avatar
  • kalobyte
  • 10 декабря 2015, 12:46
0
2. Для ws281* тоже с таким количеством озу будет крайне сложно работать.
если бы автор понял смысл этой платы, то у тебя не было бы таких вопросов

мой камент конечно же никто не прочитал
mysku.club/blog/china-stores/36691.html#comment1175483
+
avatar
  • glink0ln
  • 10 декабря 2015, 13:14
0
Спасибо, прочитал ваш коммент. Действительно, на littlewire.cc/ все разжовано. Плата действительно собрана «не от балды», а под конкретную реализацию идеи.
+
avatar
0
Самый жирный минус платы — 2 шима
там ещё инвертированные выходы подключаются/отключаются и у двух шимов по два регистра OCR[01][ab], должно получиться три шима вывести, один инвертировать только придется, хотя если быстро переключать может и нормально будет
+
avatar
+3
При цене Arduino Pro Mini в полтора доллара, в сабже смысла не вижу вообще никакого, кроме как получить на обзор по п.18.
Ног меньше, памяти меньше, стоит дороже.
Можно было бы использовать в качестве интерфейса между компом и самодельной периферией, но программная реализация USB и к такому варианту использования заставляет относиться настороженно.

Но справедливости ради вынужден признать, что п.18 отработан многократно.
+
avatar
  • Mortal
  • 10 декабря 2015, 11:56
+1
Согласен тоже…
вот недавно обзор был про-мини 168 за 1.30$
mysku.club/blog/aliexpress/36695.html

и дешевле и круче на порядок… к нему докупается USB-serial адаптер и хоть 100 штук про-мини покупай
Тем более если а Атини нет выигрыша по энергопотреблению, то нафиг он нужен??? только ради габаритов?
про-мини можно запустить на внутреннем кварце на 8 мегагерцах, что уменьшит энергопотребление
+
avatar
  • ksiman
  • 10 декабря 2015, 12:16
0
Этот Digispark реально имеет 5 портов, шестой используется как Reset. Его конечно можно фьюзами переключить с Reset на P5, но тогда внешний программатор к нему уже не подключить.
Ещё особенность — в начале в течение 5 секунд работает загрузчик и только потом запускается Ваша программа
+
avatar
  • spc
  • 10 декабря 2015, 12:22
0
Про первое я не стал писать по той причине, что как раз для Digispark внешний программатор неактуален. Но давайте, действительно добавлю в текст. Поскольку при переносе на отдельный ATtiny85 это будет играть роль.

Ну и внешний программатор, как сообщают в интернетах, подключить все равно можно. Правда уже — высоковольтный, обычным не обойдешься.

Вторая особенность в тексте описана.
+
avatar
  • ksiman
  • 10 декабря 2015, 12:42
0
Ну и внешний программатор, как сообщают в интернетах, подключить все равно можно. Правда уже — высоковольтный, обычным не обойдешься.
Проще выкинуть, чем искать этот программатор :)
Вторая особенность в тексте описана.
Точно, теперь нашёл
+
avatar
  • ksiman
  • 10 декабря 2015, 12:46
0
Эта платка при подключении по USB может прикыдываться мышкой и клавиатурой.
+
avatar
  • sav13
  • 10 декабря 2015, 13:09
0
Прямо как леонардо? Здорово.
Хотя если данная функция не использутся, плюс превращается в минус, так как драйвер начинает при перепрошивке «прыгать» и иногда подвисает
К тому же Arduino Mini (клон леонардо) у меня не захотел жить в USB30 порту. Хорошо что два USB20 на ноуте есть
+
avatar
  • ksiman
  • 10 декабря 2015, 13:42
0
Прямо как леонардо? Здорово.
По другому.
Она программно эмулирует порт USB 1.1
+
avatar
0
В релизе IDE 1.6.6 оно ведёт себя не совсем хорошо, выдавая в консоль:
Warning: platform.txt from core 'Digistump AVR Boards' contains deprecated recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}". Consider upgrading this core.
Warning: platform.txt from core 'Digistump AVR Boards' contains deprecated recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}". Consider upgrading this core.
Очень раздражает. Как всегда, что-то продвинули в IDE и теперь ворчим на плагин.

И да, вот этот клон поинтересней — не требует дополнительного кабеля: ebay.com/itm/221558382938
+
avatar
  • Sanja
  • 10 декабря 2015, 15:15
+3
А я взял более брутальный вариант. Текстолит толстый, отличный — в USB разъёме держится надёжно:

+
avatar
  • glink0ln
  • 10 декабря 2015, 15:43
+1
+
avatar
0
С бесплатной доставкой везде
Ну и самая удобная NANO (с микро-USB разъемом)
+
avatar
  • Sanja
  • 10 декабря 2015, 19:34
0
Ну, Nano-то у меня в столе валяются без счёта, как карамельки :)
+
avatar
0
Эта карамелька в удобной обертке (микроUSB, а не мини, как в оригинале)
+
avatar
0
Что-то я торможу сегодня. Эту платку можно заюзать в качестве программатора, чтобы прошить флеш-память на роутере не выпаивая? Ткните в мануал, если есть.
+
avatar
  • ksiman
  • 10 декабря 2015, 19:54
0
Нет, нельзя
+
avatar
  • 086dx66
  • 14 декабря 2015, 11:52
+1
делал аналогичный пищаль, но на TCRT5000+геркон+аттини13+кнопка(для калибровки в закрытом состоянии т.к. у ригеля 2 положения по длине)
мерял расстояние до ригеля

переоценивать полезность девайсе невозможно
особенно когда мелкие бегают тудя сюда :)
выносной блок с пищалкой как раз внутри квартиры чтобы хорошо было слышно если не закрыл
+ посадил на постоянку на бп от свитча старого

макс высота была до упора ригеля 14мм





+
avatar
  • 086dx66
  • 14 декабря 2015, 12:05
0
у тебя такой

микропереключатель был?
+
avatar
  • spc
  • 14 декабря 2015, 13:01
0
Да, такой
+
avatar
  • 086dx66
  • 14 декабря 2015, 19:36
+1
на скотч двухсторонний крепил?
а поменьше типа как верх на датчиков препятствий не видел? ну и тут контакты другие

по любому должны стоить копейки, тока найти не могу
находил еще типа
+
avatar
  • 086dx66
  • 14 декабря 2015, 20:00
0
нашел на али
оказалось надо искать Limit Switch
+
avatar
  • spc
  • 14 декабря 2015, 22:58
0
Прошу прощения, я имел в виду — по концепции такой. На самом деле вот такой. Собственно, я там все и покупал. Дорого, конечно, зато ждать меньше, чем месяц и все в одном месте.

Крепится к внутренней части дверной коробки магнитом, который приклеил к торцу выключателя. Гораздо меньше мороки, чем со скотчем: проще подогнать по месту и потом, если что, без проблем вся конструкция извлекается.
+
avatar
  • 086dx66
  • 15 декабря 2015, 06:54
0
спасибо за инфо.
долго пробовал всякие варианты с кнопками различной высоты, как вариант геркон рассматривал с магнитом на ригеле, концевик от двери авто и т.д.
но идея с кнопкой отключаемая ригелем в данной ситуации идеальна :)
запилю родителям такой на проверку

п.с.
слышно нормально его?
внутри двери все таки пищалка стоит
я специально выносную делал
+
avatar
  • spc
  • 15 декабря 2015, 23:35
0
С магнитным креплением в моем случае получилось хорошо еще и потому, то ригель выполняет финальное позиционирование при первом «проходе». Т.е. можно поставить выключатель чуть выше — ригель его сдвинет в оптимальное положение, главное, чтобы совсем в торец не толкнул, а то улетит все.

Пищалка не орет, конечно. И не только потому, что в двери: 3В ей объективно недостаточно, чтобы развернуться на полную мощность. Но то, что мне нужно — делает.

В тишине перед сном ее неплохо слышно. В остальное время нельзя не заметить, когда проходишь мимо входной двери.
+
avatar
  • 086dx66
  • 14 декабря 2015, 14:16
+1
еще один мегаполезный девай на тиньке
датчик открытия холодильника
знаю на навороченных оно уже встроенное идет
а тут получается за копейки доработать любой можно
п.с. уже полгода живет на 2 батарейках
спит правда по 8сек постоянно


+
avatar
  • 086dx66
  • 14 декабря 2015, 14:29
+1
и венец творения :)
датчик движения прикрученный к двойной лампе+rtc (на тиньке 85 правдла из-за rtc насколько помню не смог в 1кб впихнуть)+фоторезистор чтоб не включать если уже другой свет включен
п.с. мегадевайс установлен в туалете и уже 100 раз оправдал себя
днем горит правый, вечером и ночью левый
поставил 1w лампу! зеленую! (купил в офлайне — huahui дикое название, еще найти не могу нигде )


потом твердотельное реле поставил, надоело щелкать обычное


потом он трансформировался в
только на этом фото нет еще rtc и провода от витухи на rgb светодиод идут
+
avatar
  • 086dx66
  • 15 декабря 2015, 06:49
0

а вот так ночью
1w как оказалось для туалета само то и не слепит и все видно
п.с. местами уже поменял ночную и дневную лампу после переделки контроллера
+
avatar
  • ringo
  • 14 декабря 2015, 21:27
0
Можно ли из этой платы сделать драйвер фонарика? Такой фонарик не ручной, а комнатный я бы применил и походный.
А также видеосвет для зеркальной камеры. Управлять яркостью трех 3 ватт светодиодов+ показывать заряд батареи миганием. Одно нажатие 1 светодиод, два нажатия 2 сетодиода, и на 3 все три горят.
+
avatar
  • spc
  • 14 декабря 2015, 22:54
0
Вот чего не знаю — того не знаю. Но мне кажется, что смысла нет, поскольку думаю, что лучше сразу использовать готовый драйвер (или собрать свой из более подходящих компонентов).
+
avatar
  • 086dx66
  • 15 декабря 2015, 06:48
0
ДРАЙВЕР НЕТ!
управление драйвером ДА! samopal.pro/led-friver-controller/
если в 13 тиньку код не влезет — возьмешь 85, по размеру они одинаковые
ножек хватит если использовать тот же max7219, но нужно смотреть индикаторы
7219 управляет только если!!! общий катод!!!
или юзать 74HC595

я б взял такой индикатор

ebay.com/itm/111805091482 (ничего не заню про этого продавца)
или
ebay.com/itm/351586427315 у этого много чего брал
ищет на ебай по 10 Segment LED
+
avatar
  • 086dx66
  • 14 января 2016, 08:34
0
Привет ну что сделал видеосвет?
Кстати в качестве индикатора дешевле раз в 10 использовать rgb диод.емли будешь брать бери рассеянный duffused называется от него свет мягкий
идет
Вот кстати видеосвет
samopal.pro/ring-flash-led/
+
avatar
0
Вот так «до умопомрачения простой код» у Вашей пищалки… Для меня это просто «код». Боюсь представить, как выглядит обычный код в Вашем же понимании, не говоря уже о «сложном».
+
avatar
+1
Пару дней гуглил, но так и не нашел информации, за исключением небольшого польского форума, где Digispark + Little Wire применяли-бы в OpenWRT. Такая связка дает интересные возможности для домашней автоматики с любым роутером, имеющим USB порт. Пришлось написать скрипты для сборки самому. Если кому-то это будет интересно — буду только рад. Код на GitHub в папках littlewire и micronucleus. Да-да, теперь прошивки на Digispark можно менять и прямо с роутера ;) Ну и там много всего разного еще для самоделкиных. В своем блоге я еще постараюсь это дело расписать красиво. Пока там самое ценное — подборка ссылок по теме.
+
avatar
0
Есть вопрос по поводу перепрошивки загрузчика. Хочу заменить загрузчик в диджиспарке на новую(другую) версию. Программатора нет, есть только ардуино нано. Это возможно? Или облом из-за отключеного резета и надо сначала сбрасывать фьюзы програматором?
+
avatar
0
он сам себя умеет шить, программатор может понадобиться только в случае ошибки при прошивке, я перешивал на версию без задержки, где бутлоадер джампером включается
+
avatar
0
Поделись инструкцией, пожалуйста.
+
avatar
0
емнип шил как обычную прошивку:
C:\Users\alpha-user\AppData\Roaming\Arduino15\packages\digistump\tools\micronucleus\2.0a4/launcher -cdigispark --timeout 60 -Uflash:w:micronucleus.hex:i

запускаешь, подключаешь когда попросит, ну как обычно

а саму прошивку собирал из исходников, параметры редактируются в этом файле, собираешь, оно пишет размер и ещё раз пересобираешь изменив тут адрес загрузчика(см комментарии там как считать)

готового hex'а к сожалению не осталось т.к. винт накрывается и виртуальная машина где я собирал уже канула в лету

а, вот ещё вспомнилось в ветке 1.11 скрипт через который нужно прошивку пропустить
+
avatar
0
Парни, я дико извиняюсь, поскольку не спец… Уже второй вечер сел искать, как же понять какой контакт у этой платы куда? На атмель8, например, нагугли картинку и успешно разобрался где там аналоговые пины где цифровые, а тут как понять??
В статье написано
на плате удобно выведены и подробно подписаны пины контроллера. С лица — цифровые, со спины — по протоколу и аналоговым функциям. В общем, не заблудишься.
, однако как-то это слишком уж поспешно написано ))
Мне надо то А0 вход и пару цифровых выходов знать где…
Что на лице, что со спины ведь пины запаяны в одно целое и их не 12, а реально 6шт… Что значит Р0 и Р4, например, на лицевой части?
+
avatar
  • spc
  • 13 июля 2017, 23:59
+1
Самый простой способ — набрать в гугле Attiny85 и посмотреть картинки распиновки чипа. Там все, как на ладони. Собственно, как и на маркировке платы.

Посмотрите еще раз фото обратной стороны платы. Все пины PB0 — PB4 могут использоваться как цифровые. Пины PB2 — PB4 — еще и как аналоговые. Имея такой опыт, как у вас, A0 (PB5) я бы на всякий случай трогать не стал, поскольку на нем еще функция reset. Поэтому рекомендую обойтись, скажем PB2 как A1, а из оставшихся часть задействовать как цифровые пины.

На лицевой стороне, полагаю, просто нумерация по порядку, не имеющая прямого отношения к функциональности. А вот на спине — как раз все функции (ADC, к примеру — это и есть указание на возможность использования в «аналоговом» режиме).
+
avatar
0
Спасибо. Жаль здесь в обзоре расчёт на профи ))
Нашел на офсайте вроде распиновку,
Pin outs:

All pins can be used as Digital I/O
Pin 0 → I2C SDA, PWM (LED on Model B)
Pin 1 → PWM (LED on Model A)
Pin 2 → I2C SCK, Analog In
Pin 3 → Analog In (also used for USB+ when USB is in use)
Pin 4 → PWM, Analog (also used for USB- when USB is in use)
Pin 5 → Analog In


Собсна почему я и полез на пятый пин…
но пока ваш вариант проверить не вышло т.к. простейший скетч мой с вращением сервы чего-то ошибку выдаёт, возможно чего-то не хватает в среде ардуино, которую я посвежей из-за этого модуля поставил.
+
avatar
  • spc
  • 17 июля 2017, 15:53
0
Обзор наоборот от любителя любителю :) Профи как раз в комментариях написали, для чего, собственно, эта плата и нужна (не для отладки, а для эмуляции всяких интерфейсных штуковин).

Если нужна помощь с ошибкой в скетче, присылайте сообщение об ошибке — если получится, то обязательно помогу.
+
avatar
  • mcGreg
  • 20 сентября 2017, 11:07
0
Вчера тоже с пинами разгребался, этот список куда как не полный. Но то, что пины на плате отличаются от распиновки на микросхеме это однозначно. самому это понадобилось потому, что хочу некоторые процессы в доме автоматизировать. Для начала прицепил ардуинку нану и слепил включение уличного освещения. На очереди стало автоматизация наполнения ёмкости водой (два геркона верхний и нижний уровень). Но в планах ещё более сложная автоматика с извращениями, поэтому рещил простые вещи перекинуть на тиньку. Взял две с микро юсб и две с папой на плате. В одной спокойно можно уместить оба вышеописанных процесса. По пинам красиво получается: Pin 0 — нижний геркон, Pin 1 — верхний геркон, Pin 2 — фоторезистор, Pin 3 — включение реле освещения, Pin 4 — Включение насоса на закачку. Кстати по герконам, без разницы какой верхний, какой нижний, включение по двум замкнутым, выключение по двум разомкнутым. Скетч почти ничего не весит, под переменные 19 байт.
Вот только столкнулся с проблеммой, ардуинка под линуксами запрограммилась без проблем, а вот тинька корявится. Кто знает как правильно дрова поставить под убунтой для этой хрени?
+
avatar
  • mcGreg
  • 21 сентября 2017, 09:56
0
Вобщем убунта не хочет пока тиньки прошивать, на работе под виндой прошил.

скетч простенький:

int Svet = A1;
unsigned int SvetIntens = 0;

void setup() {
  pinMode(0, OUTPUT);//реле прожектора
  pinMode(1, OUTPUT);//реле водяного насоса колодца
  pinMode(2, INPUT);//датчик освещённости
  pinMode(3, INPUT);//Геркон верхнего поплавка
  pinMode(4, INPUT);//Геркон нижнего поплавка
 
}

void loop() {
  SvetIntens = analogRead(Svet);
  if (SvetIntens > 160) digitalWrite(0, HIGH);//выключение прожектора (ярко)
  else if (SvetIntens < 100) digitalWrite(0, LOW);//включение прожектора (тёмно)
  if (digitalRead(3)&&digitalRead(4)) digitalWrite(1, HIGH);//выключение насоса, попловки всплыли
  else if ((!digitalRead(3))&&(!digitalRead(4))) digitalWrite(1, LOW);//включение насоса, попловки упали
  {delay(2000);
  }
}

предвижу вопрос по поводу уровней включения выключения ))
шилд с релюхами имеет такую особенность, включается нулём выключается единицей.
Фоторезистор цепляется между пином и плюсом, с того же пина к минусу можно вторнуть подстроечный резистор килов на 10
герконовые пины подтягиваются резисторами к единице, герконы втаркиваются между пином и минусом.

вот и все расклады, если кому пригодится, пользуйтесь)
+
avatar
  • Genn0k
  • 19 апреля 2018, 16:05
0
попытался этим скетчем подключить вместо датчика освещенности — датчик движения RCWL-0516. как-то не корректно всё работало. Не подскажите ли где (и как?) подкорректировать код, что бы можно было использовать RCWL-0516 датчик. И еще. Почему-то иногда реле насоса само включается при подключении тиньки, хотя герконы отключены. Пассы с герконами не всегда помогают. Спустя некоторое время может выровняться всё само. Пока тестирую. Но если подключить в живую, боюсь перельет емкость при запуске.
+
avatar
  • Genn0k
  • 13 декабря 2017, 11:04
0
К Новому году я на клоне собрал вот такие очки, может кому пригодится. Еще несколько фото Очки имеют несколько световых эффектов. Код здесь:
// https://youtu.be/_hnk5jNTudk Low power NeoPixel goggles example. Makes a nice blinky display
    // with just a few LEDs on at any time.
     
    #include <Adafruit_NeoPixel.h>
        
    #define PIN 0
     
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(48, PIN);
     
    uint8_t mode = 0, // Эффект по умолчанию
    offset = 0; // Position of spinny eyes
    uint32_t color = 0xFF0000; // Start red
    uint32_t prevTime;
    //Путь пикселей при змейке - 48 всего
    byte sine1[] = {43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,47,46,45,44,3,2,1,0,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4};
    byte sine2[] = {43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,47,46,45,44,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,1,2,3};

    void setup() {
    pixels.begin();
    pixels.setBrightness(120); // Пол яркости
    prevTime = millis();
    }
     
    void loop() {
    uint8_t i;
    uint32_t t;
    int r = random(255);
    int g = random(255);
    int b = random(255);

     
    switch(mode) {
   case 0: // Хаотичные блики - вспышки разных диодов в разное время!
      i = random(48);
      pixels.setPixelColor(i, color);
      pixels.show();
      delay(15);
      pixels.setPixelColor(i, 0);
      break;
   case 1: // Spinny wheels (Вращение 3 по 3 покругу)
      for(i=0; i<24; i++) {
      uint32_t c = 0;
      if(((offset + i) & 7) < 2) c = color; // 4 pixels on...
      pixels.setPixelColor( i, c); // Первое очко
      pixels.setPixelColor(47-i, c); // Второе очко (инверсия)
      }
      pixels.show();
      offset++;
      delay(80);
      break;
   case 2: // rainbow
     uint16_t i, j;
     for(j=0; j<256; j++) {
      for(i=0; i<24; i++) {
       pixels.setPixelColor(i, Wheel((i+j) & 255));
       pixels.setPixelColor(47-i, Wheel((i+j) & 255));
       }
      pixels.show();
      delay(80);
  }
        break;
   case 3: // Zmeyka1
       for(i=0; i<48; i++) {
        pixels.setPixelColor(sine2[i], pixels.Color(0, 0, 0));
          for (byte j=0; j<8; j++){
            pixels.setPixelColor(sine2[(j+i+1)%48], Wheel((i+j) & 255)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
      break;
   case 4: // Zmeyka2
      for(i=0; i<48; i++) {
        pixels.setPixelColor(sine1[i], pixels.Color(0, 0, 0));
          for (byte j=0; j<8; j++){
            pixels.setPixelColor(sine1[(j+i+1)%48], Wheel((i+j) & 255)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
       break;
   case 5: // rainbowCycle
      for(j=0; j<256; j++) { // 5 cycles of all colors on wheel
       for(i=0; i<24; i++) {
        pixels.setPixelColor(i, Wheel(((i * 256 / pixels.numPixels()) + j) & 255));
        pixels.setPixelColor(47-i, Wheel(((i * 256 / pixels.numPixels()) + j) & 255));
        }
       pixels.show();
       delay(80);
}
         break; 
}
     
    t = millis();
    if((t - prevTime) > 8000) { // Каждые< 8 seconds...
    mode++; // Следующий уровень
    if(mode > 5) { // Если последний уровень
    mode = 0; // Уровни сначала
    color >>= 8; // Следующий цвет R->G->B
    if(!color) color = 0xFF0000; // Сброс на красный
    }
    for(i=0; i<48; i++) pixels.setPixelColor(i, 0);
    prevTime = t;
    }
}


// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
   return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
   return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
   WheelPos -= 170;
   return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
} 
    


Немного подкорректировал под себя. Не сильно разбираюсь в программировании. Но если кто сможет облегчить код и добавить еще эффектов буду только признателен! Питать можно от мини липо на 4,2 вольта. Я запитываю от небольшого повербанка.
+
avatar
0
У AlexGyver на ютубе аналогичные очки есть проект. Только там очки сварщика и лента встроена.
+
avatar
  • Genn0k
  • 17 апреля 2018, 12:25
0
теперь они выглядят вот так.
+
avatar
0
Здравствуйте, автор! Хорошая статья и проекты. Подскажите несведущему в Ардуино, исходя из этого текста: «Связано это с особым режимом работы загрузчика: при старте контроллера он ждет загрузки кода через USB в течение 5 секунд, а потом переключается в режим исполнения имеющегося в памяти контроллера кода.

Иными словами, если контроллер подключить к компьютеру до приглашения, то спустя пять секунд он начнет выполнять имеющийся код (если есть), а чтобы загрузить новый, нужно отключить и снова подключить плату к компьютеру.», можно ли сделать так, что при включении Digispark, он сразу начал исполнять код, не дожидаясь 5 секунд? Делал этот проект mysku.club/blog/diy/66309.html и никак не могу добиться стабильной работы устройства, так как после перезагрузки или выключения компа сей девайс отказывается работать, пока не переподключишь его.
+
avatar
  • spc
  • 19 ноября 2018, 09:34
0
Добрый день, насколько я могу судить, существует как минимум несколько вариантов, как запускать код без задержки, однако так как я ни одним не пользовался, то не могу рассказать по шагам, что там и как.

Вот здесь видео, а здесь небольшой текст, почти подтверждающий видео, но не совсем (в тексте человек пишет, что для того, чтобы все получилось, при запуске micronucleus.exe нужно еще добавить параметр run).

Обратите внимание, что при этом пин P0 используется при программировании (для программирования его нужно будет подключать к земле). Возможно, из-за этого придется внести изменения в загружаемую программу (например, использовать вместо P0 подходящий свободный пин контроллера).
+
avatar
0
Спасибо! Нашел информацию о том, что можно прошить аттини85 напрямую, программатором USB ISP, без бутлогера. Но после этого, в качестве Digispark, контроллер уже не будет работать, а мне и не надо. То есть, прошиваться через свой USB уже не будет, а будет только исполнять зашитую программу.Могу ошибиться, но как я понял, в Digispark заливают файл с расширением ino, а через USB ISP контроллер будет принимать только hex файлы. Или же можно будет напрямую залить туда файл ino?
+
avatar
  • spc
  • 19 ноября 2018, 16:54
0
К сожалению, здесь уже не помогу. Тут для меня темный лес.

Только предположения. И в первую очередь по поводу того, что вы вообще хотите. Прежде всего потому, что Digispark от обычного ATtiny85 прежде всего (насколько я понял) отличается загрузчиком, который в числе прочего позволяет пользоваться контроллером как USB HID-устройством (т.е. прикидываться устройствами ввода на шине USB — клавиатурой там, или мышкой).

Обычный загрузчик Arduino этого не умеет. Поэтому если вы собираетесь использовать USB-функции, то мне кажется, что без загрузчика с функциями USB HID не обойтись, каким бы способом вы ни загружали свой код в контроллер (будь то USB ISP или стандартная процедура).
+
avatar
0
Через usb isp дигиспарк не получится прошить, т.к. пин резет там отключен. Востановить можно только через высоковольтный программатор типа фьюзбит доктора. Для прояснения своих вопросов рекомендую посмотреть вот этот ролик. Можешь автору написать свои вопросы. Еще у него есть 6 часовой стрим на канале, где он пытался делать эту педаль, но в итоге 6 часов пытался прошить тиньку и разрулить драйвера. www.youtube.com/watch?v=6eKDV1BrQrc
+
avatar
  • ybxtuj
  • 13 декабря 2018, 13:32
-1
дорого
слишком дорого
купил такуюже как тут почитал повертел в руках чо то неохота связываться с кастылями для неё
+
avatar
  • ybxtuj
  • 13 декабря 2018, 14:59
-1
в общем решил подключить как и иговорил гиблая затея
в диспечере устройств то появляется то ищезает дигит бутлоадер и так бесконечно

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.