Biercounter project:

Changelog:
[27-april-2010] Foto's toegevoegd (onderaan de pagina)
[10-april-2010] Foto komt ook nog! 
[09-april-2010] Meer uitleg volgt nog! 

In de hoek van "onze woonkamer" a.k.a mijn kamer, hangt een soort trechter(foto komt nog) aan muur waar we dopjes in kunnen gooien als we het biertje openen. Via een buis komt deze dan in een mand terecht. Samen met mijn huisgenoten kwam ik op het idee om in die buis een sensor te plaatsen zodat de bierdopjes geteld worden. 

Het schema:

 

Onderdelenlijst:

MikroC Code:

int counter;
char tekst[7];
int increased = 0;
unsigned char y[4];

void interrupt(){
     if(PIR1.CMIF){             // interrupt from comparators...
        if (CMCON.C2OUT == 1 && !increased)
        {
           counter++;           // increase counter
           increased = 1;
        }
        if (CMCON.C2OUT == 0)
        {
         PIR1.CMIF = 0;          // flag reset
         }
     }
}

void init() {
  VRCON = 0b11001111;           // Set voltage reference register
  CMCON = 0b00100110;           // Enable comparators
  TRISA = 0b11111111;           // Set Port A as input
  TRISB = 0b00000000;           // Set Port B as output
  Delay_ms(100);
  PIE1.CMIE = 1;                // Enable comparator interrupt
  PIR1.CMIF = 0;                // Reset comparator interrupt
  INTCON.PEIE = 1;              // Peripheral interrupt enable bit
  INTCON.GIE = 1;               // Enable global interrupt
}

void loadFromEeprom() {
     y[0] = EEprom_Read(0);
     y[1] = EEprom_Read(1);
     y[2] = EEprom_Read(2);
     y[3] = EEprom_Read(3);

     counter = (y[3]<<24)|(y[2]<<16)|(y[1]<<8)|(y[0]);
     increased = 0;
}

void writeToEeprom() {
    y[0] = counter & 0x000000ff;
    y[1] = (counter & 0x0000ff00) >> 8;
    y[2] = (counter & 0x00ff0000) >> 16;
    y[3] = (counter & 0xff000000) >> 24;
    
    EEprom_Write(0,y[0]);
    EEprom_Write(1,y[1]);
    EEprom_Write(2,y[2]);
    EEprom_Write(3,y[3]);
}

void displayCount() {

    IntToStr(counter,tekst);
    LCD_Out(2,4,tekst);
}

void main() {

  init();

  Lcd_Config(&PORTB, 2, 3, 1, 4, 5, 6, 7);
  LCD_Cmd(LCD_CLEAR);
  LCD_Cmd(LCD_CURSOR_OFF);
  LCD_Out(1,1, "Bierdopjescount");

  loadFromEeprom();
  displayCount();
  
  do {
    if (increased)
    {
      displayCount();
      increased = 0;
      writeToEeprom();
    }
    delay_ms(50);
  } while(1);
}

Foto's

De voorkant:
 

De soldeerkant:
 

In gebruik (was de trimweerstand vergeten voor het contrast dus deze is nog toegevoegd):