冰楓論壇

標題: Atmel ATtiny2313-20PU 製作心跳圖機器 [打印本頁]

作者: 洪嵐峰    時間: 2023-4-8 08:41
標題: Atmel ATtiny2313-20PU 製作心跳圖機器
製作心跳圖機器所需的零件包括:

ATtiny2313-20PU微控制器
心跳傳感器(例如脈搏氧飽和度傳感器)
OLED顯示屏
電源供應器
電容、電阻和連接線等電子元件
PCB板
ATtiny2313-20PU的連接腳位如下:


          __ __
RESET   -|  U  |-   VCC
        -|     |-   PB0   /OC0A
        -|     |-   PB1   OC0B
        -|     |-   PB2
        -|     |-   PB3   /OC2A
        -|     |-   PB4
        -|     |-   PB5
        -|     |-   AVCC
        -|     |-   GND
        -|_____|-   PB6
請注意:在使用ATtiny2313-20PU微控制器時,必須注意每個腳位的功用和使用方式。建議您在製作前仔細閱讀技術規格書和連接圖。

下面是一個簡單的心跳圖機器程式碼,您可以根據自己的需求進行修改和調整:


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

#define OLED_SDA PB0
#define OLED_SCL PB1
#define OLED_RST PB2

#define OLED_ADDR 0x3C

#define OLED_CMD 0x00
#define OLED_DATA 0x40

void i2c_start(void);
void i2c_stop(void);
void i2c_send_byte(unsigned char byte);
void oled_init(void);
void oled_clear_display(void);
void oled_write_char(unsigned char c);
void oled_write_string(char* str);

int main(void) {
    // 初始化IO端口
    DDRB |= (1<<OLED_SDA) | (1<<OLED_SCL) | (1<<OLED_RST);

    // 初始化OLED顯示屏
    oled_init();
    oled_clear_display();
    oled_write_string("Heart Rate Monitor");

    while (1) {
        // 讀取心跳傳感器的值
        int heart_rate = read_heart_rate();

        // 在OLED顯示屏上顯示心跳數值
        char heart_rate_str[16];
        sprintf(heart_rate_str, "Heart Rate: %d", heart_rate);
        oled_write_string(heart_rate_str);

        // 延遲1秒鐘
        _delay_ms(1000);
    }

    return 0;
}

void i2c_start(void) {
    // 向OLED顯示屏發送I2C啟動信號
    // 略
}

void i2c_stop(void) {
    // 向OLED顯示屏發送I2C停止信號
    // 略
}

void i2c_send_byte(unsigned char byte) {
    // 向OLED

void oled_init(void) {
i2c_start();
i2c_send_byte(OLED_ADDR << 1);
i2c_send_byte(OLED_CMD);
i2c_send_byte(0xAE); // display off
i2c_send_byte(0xD5); // set display clock divide ratio/oscillator frequency
i2c_send_byte(0x80);
i2c_send_byte(0xA8); // set multiplex ratio
i2c_send_byte(0x3F);
i2c_send_byte(0xD3); // set display offset
i2c_send_byte(0x00);
i2c_send_byte(0x40); // set start line
i2c_send_byte(0x8D); // set charge pump
i2c_send_byte(0x14);
i2c_send_byte(0x20); // set memory mode
i2c_send_byte(0x00);
i2c_send_byte(0xA1); // set segment remap
i2c_send_byte(0xC8); // set com output scan direction
i2c_send_byte(0xDA); // set com pins hardware configuration
i2c_send_byte(0x12);
i2c_send_byte(0x81); // set contrast control
i2c_send_byte(0xCF);
i2c_send_byte(0xD9); // set pre-charge period
i2c_send_byte(0xF1);
i2c_send_byte(0xDB); // set vcomh deselect level
i2c_send_byte(0x40);
i2c_send_byte(0xA4); // set entire display on/off
i2c_send_byte(0xA6); // set normal/inverse display
i2c_send_byte(0xAF); // display on
i2c_stop();
}

void oled_clear_display(void) {
i2c_start();
i2c_send_byte(OLED_ADDR << 1);
i2c_send_byte(OLED_CMD);
i2c_send_byte(0x21); // set column address
i2c_send_byte(0);
i2c_send_byte(127);
i2c_send_byte(0x22); // set page address
i2c_send_byte(0);
i2c_send_byte(7);
for (int i = 0; i < 128 * 8; i++) {
i2c_send_byte(0x00); // clear all pixels
}
i2c_stop();
}

void oled_write_char(unsigned char c) {
i2c_start();
i2c_send_byte(OLED_ADDR << 1);
i2c_send_byte(OLED_DATA);
for (int i = 0; i < 6; i++) {
i2c_send_byte(pgm_read_byte(font6x8 + (c - 32) * 6 + i)); // read font data from program memory
}
i2c_send_byte(0x00); // add a space between characters
i2c_stop();
}

void oled_write_string(char* str) {
while (*str) {
oled_write_char(*str++);
}
}

int read_heart_rate(void) {
// 從心跳傳感器讀取心跳數值
// 略
}




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓