Potrzebny jest czujnik https://www.aliexpress.com/item/32730415199.html, moduł BT https://www.aliexpress.com/item/33009632983.html i ATtiny13 (można użyć Arduino, np. Nano).
Bajer polega na tym, że wynik zliczania odczytuje się smartfonem z Androidem, teraz dokładnie nie pamiętam, ale aplikacja to jakiś "serial monitor" albo coś w tym stylu.
Tutaj masz na szybko znaleziony przykład https://create.arduino.cc/projecthub/va ... ino-18eadc
A program na ATtiny 13 wygląda tak :
Kod: Zaznacz cały
#define F_CPU 9600000
#include <avr/io.h>
#include <util/delay.h>
#define SOFT_TX_PIN (1<<PB1) // PB1 as TXD
#define SOFT_TX_PORT PORTB
#define SOFT_TX_DDR DDRB
unsigned int count = 0;
char old = 0;
char now = 0;
int main (void) {
PORTB =1;
uart_tx_init (); // инициализация прог. UARTа
while (1) {
now = (PINB & 1);
if (old != now ){
old = now;
if (old == 1){
count++;
uart_print("Current counter value = "); // превед
num_to_str(count, 5); // 0..99999
uart_print("\r\n"); // переход на новую строчку
}
}
}
return 0;
}
void uart_tx_init ()
{
TCCR0A = 1 << WGM01; // compare mode
TCCR0B = (1 << CS01); // prescaler 8
OCR0A = 125; // 9600 baudrate at prescaler 8
SOFT_TX_PORT |= SOFT_TX_PIN;
SOFT_TX_DDR |= SOFT_TX_PIN;
}
// Функция вывода содержимого переменной
void num_to_str(unsigned int value, unsigned char nDigit)
{
switch (nDigit)
{
case 5:
uart_send_byte((value / 10000) + '0');
case 4:
uart_send_byte(((value / 1000) % 10) + '0');
case 3:
uart_send_byte(((value / 100) % 10) + '0');
case 2:
uart_send_byte(((value / 10) % 10) + '0');
case 1:
uart_send_byte((value % 10) + '0');
}
}
void uart_print(char *str)
{
byte i = 0;
while (str[i]) {
uart_send_byte(str[i++]);
}
}
//bitbanged UART transmit byte
void uart_send_byte (unsigned char data)
{
unsigned char i;
TCCR0B = 0;
TCNT0 = 0;
TIFR0 |= 1 << OCF0A;
TCCR0B |= (1 << CS01);
TIFR0 |= 1 << OCF0A;
SOFT_TX_PORT &= ~SOFT_TX_PIN;
while (!(TIFR0 & (1 << OCF0A)));
TIFR0 |= 1 << OCF0A;
for (i = 0; i < 8; i++)
{
if (data & 1)
SOFT_TX_PORT |= SOFT_TX_PIN;
else
SOFT_TX_PORT &= ~SOFT_TX_PIN;
data >>= 1;
while (!(TIFR0 & (1 << OCF0A)));
TIFR0 |= 1 << OCF0A;
}
SOFT_TX_PORT |= SOFT_TX_PIN;
while (!(TIFR0 & (1 << OCF0A)));
TIFR0 |= 1 << OCF0A;
}
Skomplikowanie programu wynika z prostoty mikrokontrolera, ma tak mało zasobów, że trzeba wszystko pisać ręcznie. Na Arduino można użyć sprzętowego UART-a i gotowych bibliotek.