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:
- C1 = 100nF
- C2 = 47uF
- R1 = 470 ohm
- R2 = 22k ohm
- IC1 = PIC16F628A
- DIS1 = 16x2 LCD display (HD44780 compatible)
- D1 = SFH309 (IR detector)
- D2 = SFH409 (IR led)
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
In gebruik (was de trimweerstand vergeten voor het contrast dus deze is nog toegevoegd):

