- UID
- 373967
- 帖子
- 8888
- 主題
- 2609
- 精華
- 0
- 積分
- 1000
- 楓幣
- 3
- 威望
- 977
- 存款
- 34995
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 456 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-26
|
製作心跳圖機器所需的零件包括:
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) {
// 從心跳傳感器讀取心跳數值
// 略
} |
|