Akvariumo žuvų šėrykla

Pats dažnokai nebūnu namie, kad ir būnu kartais pamirštu pašerti žuvytes akvariume. Kad jos neliktų alkanos ir nesuėstų savo mailiaus sumaniau padaryti automatinę šėryklą. Internete rastos nesudėtingos sistemos su mechaniniu laikrodžiu ir plastikiniu indeliu netenkino mano poreikių, nepakankamai tikslus dozavimas ir maitinimo laiko nustatymas perdaug sudėtingas ir netikslus. Akvariume naudojama laiko relė junginėjanti lempas, maitinimą nutariau surišti su ja, žuvys pirmą kart pašeriamos praėjus 30 minučių po šviesos įsijungimo, antrą kart po 10 valandų nuo pirmo maitinimo, dar po valandos gesinamos lempos ir išjungiama šėrykla. Surinkta nesudėtinga elektroninė schema su attiny13 mikrovaldikliu. Mechaninius judesius sistemoje atlieka standartinis servo mechanizmas. Šėryklos korpusas ir dozavimo mechanizmas pagamintas iš organinio stiklo, maisto rezervuaras plastikinis užsukamas ~30 ml tūrio indelis. Dozatorius mechanizmas pagamintas iš 6mm storio, o dėžutė su servomechanizmu ir elektronine schema iš 2,5mm storio organinio stiklo. Šėrykla turi du informacinius šviesos diodus, žalias dega visada kai yra maitinimas, raudonas mirkteli kas 5s laukimo režimu ir kas 1s keičiant maisto dozę. Taip pat yra mygtukas, kurį trumpai nuspaudus išpilame vieną pašarų porciją, laikant ilgiau kaip 3s pakeičiame porcijos dydį. Kiek kartų mirkteli diodas nuspaudus mygtuką, tiek dozių maisto sudaro viena maitinimo porcija. Porcijos dydis saugomas mikrovaldiklio EEPROM atmintyje, todėl nustatymai išlieka ir išjungus schemos maitinimą. Dėl vidinio mikrovaldiklio taktinio dažnio generatoriaus netikslumo šėrimo laikas nėra visai tikslus, 18 laipsnių temperatūroje programa skuba ~16s per valandą, bet tokiam prietaisui šis tikslumas yra daugiau negu pakankamas.

m1

m2

Trumpas demonstracinis filmukas

Schema

Maitinimui paimtas 9v transformatorius nuo seno modemo su išmesta nebeveikiančia srovės lygintuvo ir stabilizatoriaus schema. Vietoje jo galima apimti bet kokį kintamos ar pastovios srovės šaltinį, kurio įtampa 7-15V. Nuo didesnės įtampos labiau kais maitinimo stabilizatorius.

schema (1)

Spausdintinė plokštė

Vienpusė spausdintinė plokštė gaminta „lazeriniu-lygintuviniu“ metodu. Plokštės didžioji dalis detalių SMD technologijos, išskyrus maitinimo dalies komponentus. Visos detalės sumontuotos viršutinėje plokštės pusėje, mėlynai pažymėtos dalys – laidai iš apatinės plokštės pusės. Plokštėje yra AVR ISP lizdas mikrovaldiklio programos pakeitimui, jeigu to prireiktų norint pakeisti šėrimų skaičių ar laiką.
isdestymas (1)

Detalių sąrašas

EAGLE Version 5.12.0 Copyright (c) 1988-2011 CadSoft

Part     Value           Device          Package    Library  Sheet

C1       100uF           CPOL-EUTT2D7L   TT2D7L     rcl      1
C2       100uF           CPOL-EUTT2D7L   TT2D7L     rcl      1
C3       1uF             C-EUC1210       C1210      rcl      1
C4       50pF            C-EUC0805       C0805      rcl      1
D1       1N4004          1N4004          DO41-10    diode    1
D2       1N4004          1N4004          DO41-10    diode    1
D3       1N4004          1N4004          DO41-10    diode    1
D4       1N4004          1N4004          DO41-10    diode    1
IC1      TINY13-20SU     TINY13-20SU     8S2        atmel    1
IC2      7805T           7805T           TO220H     linear   1
JP1      AVR-ISP-6VERT   AVR-ISP-6VERT   AVR-ISP-6  avr-7    1
LED1                     LEDSML0805      SML0805    led      1
LED2                     LEDSML0805      SML0805    led      1
PAD1     WIREPAD3,81/1,4 WIREPAD3,81/1,4 3,81/1,4   wirepad  1
PAD2     WIREPAD3,81/1,4 WIREPAD3,81/1,4 3,81/1,4   wirepad  1
R1       1k              R-EU_M0805      M0805      rcl      1
R2       1k              R-EU_M0805      M0805      rcl      1
R3       20k             R-EU_M0805      M0805      rcl      1
R4       10k             R-EU_M0805      M0805      rcl      1
R5       100             R-EU_M0805      M0805      rcl      1
S2       SKHMPSE010      SKHMPSE010      SKHMPXE010 switch   1
SV1                      MA03-1          MA03-1     con-lstb 1

Programa

Programa mikrovaldikliui attiny13 kompiliuota AVR-GCC kompiliatoriumi.

 

#define F_CPU 9600000UL
#define variklis PB0
#define led PB4
#define mygt PB3
#define adresas 1

#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>

// impulso trukmė ir pauzė jei reikia
int kamp[]={780,710,780,710,780,710,780,440,500,440,500,440,500,440,500,440,700,780};

uint8_t laikas = 0;

void irasom( uint8_t n ) // išsaugom naują porcijų skaitliuko vertę
{
  n = ( n / 10 ) - 2;
  eeprom_busy_wait();
  __EEPUT( adresas, n );
}

uint8_t skaitom( void ) // skaitom porcijų skaitliuko vertę iš eeprom
{
  uint8_t rez;
  eeprom_busy_wait();
  __EEGET( rez, adresas );
  if ( rez == 255 ) // jei pradinė reikšmė nenustatyta nustatom minimalią dozę
  {
    rez = 1;
    irasom(31);
  }
  return rez;
}

void pozicija(int p) // formuojame impulsus servo varikliui
{
  for ( int k = 0; k < 16; k++)
  {
    PORTB |= _BV(variklis);
    for ( int j = 0; j < p; j++)
      _delay_us(1);
    PORTB &=~ _BV(variklis);
    _delay_ms(10);
  }
}

void pilam(void) //judesių seka maisto išpylimui
{
  PORTB |= _BV(led); //uždegam diodą
  uint8_t n = skaitom(); //perskaitom nustatymus
  for (uint8_t j = 0; j < n; j++) //kartojam seką tiek kartų, kiek maisto porcijų reikia
    for (int i = 0; i < 18; i++) //vienos porcijos pylimo seka
      pozicija( kamp[ i ] );
  PORTB &=~ _BV(led); //gesiman diodą
}

int laukiam ( int p) //laukiam p minučių arba mygtuko paspaudimo
{
  PORTB &=~ _BV(led);
  for ( int i = 0; i < p; i++ )
  {
    for ( int j = 0; j < 600; j++ )
    {
      if (PINB & _BV(mygt)) //jei mygtukas paspaustas skaičiuojam paspaudimo laiką,
                            //jei ne laukiam ar apdorojam mygtuko paspaudimo laiką
      {
        _delay_ms(101.5); // laukiam 1/10 s (pataisa dėl taktinio dažnio netiklumo)
        if ( laikas == 0 ) // jei mygtukas nebuvo nuspaustas mirktelim kas 5 s
        {
          if ( ( j % 50) == 0 ) //mirktelim kas 5 s
            PORTB |= _BV(led);
          if ( ( j % 50) == 1 )
            PORTB &=~ _BV(led);
        }
        else // jei mygtukas nuspaustas buvo trumpiau 3 s pilam maistą, 
             //jei ilgiau rašom naują reikšmę į eeprom
        {
          if ( laikas < 30 )             pilam();           else             irasom(laikas);           laikas = 0; //mygtuko paspaudimas apdorotas         }       }       else //mygtukas paspaustas       {         laikas++;         if (laikas >= 30) // po 3s pradedam mirksėt
        {
          if ( ( laikas % 10) == 0 ) //mirktelim kas 1 s
            PORTB |= _BV(led);
          if ( ( laikas % 10) == 1 )
            PORTB &=~ _BV(led);
        }
        _delay_ms(101.5);
      }
    }
  }
  return 0;
}

int main(void)
{
  DDRB |= _BV(variklis);
  DDRB |= _BV(led);
  PINB |= _BV(variklis);
  PINB |= _BV(led);
  PORTB &=~ _BV(led);
  PORTB &=~ _BV(variklis);
  PORTB &=~ _BV(mygt);
  laukiam(30); //laukiam 30 min
  pilam();
  laukiam(600); //laukiam 10 h
  pilam();
  laukiam(600); 
  return 0;
}

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *