[小專題]救難型機器狗(未完成)
112.10.8
1.
2.影片
[小專題]三合一復健球(未完成)
112.10.08
1.功能
2.程式介紹
#include <Arduino.h>
#include
<SoftwareSerial.h>
#include
<OLED.h>
enum TM7711_Mode
{
diff_10Hz = 1,
Temp = 2,
diff_40Hz = 3,
};
struct Press
{
uint8_t state;
int frep;
unsigned long startTime;
unsigned long countdownTime;
unsigned long diffTime;
};
struct ButtonData
{
bool isStart;
int time;
};
const uint8_t
Start_Button = 2;
const uint8_t
Time_Button = 3;
const uint8_t
Buzzer = 4;
const uint8_t
TM7711_SCK = 5;
const uint8_t
TM7711_DOUT = 6;
const uint8_t BT_RX
= 7;
const uint8_t BT_TX
= 8;
SoftwareSerial
BT(BT_RX, BT_TX);
OLED oled(128, 64);
const uint8_t
Mean_Size = 10;
uint8_t Mean_Count
= 0;
int
data[Mean_Size];
unsigned long
data_sum = 0;
const unsigned long
data_max = 1024;
const unsigned long
data_min = 0;
unsigned long
data_reference = 0;
unsigned long
oled_time = 0;
char *oled_num =
new char[10];
bool data_isUp =
false;
Press press;
ButtonData button;
char BT_data;
void Correction();
int
TM7711read(TM7711_Mode mode);
unsigned long
Averagefilter(int *buf, unsigned long bufmax, unsigned long bufmin);
void Pressjudge();
void
BuzzerMode(bool isStart);
void
OLED_display();
char *int2char(int
num);
void setup()
{
Serial.begin(9600);
// === OLED init ===
oled.begin();
oled.init(2, WHITE);
oled.print(0, 20,
"Initializing...", true);
// === TM7711 init ===
pinMode(TM7711_SCK, OUTPUT);
pinMode(TM7711_DOUT, INPUT);
Correction();
// === Button init ===
pinMode(Start_Button, INPUT);
pinMode(Time_Button, INPUT);
// === Buzzer init ===
pinMode(Buzzer, OUTPUT);
// === BT init ===
BT.begin(9600);
BT_data = 'n';
Serial.println("Initialized");
oled.clear();
oled.print(0, 20, "Initialized",
true);
delay(2000);
oled.clear();
oled.print(0, 20, "Time: 0min",
true);
}
void loop()
{
if (BT.available())
BT_data = BT.read();
if ((!digitalRead(Start_Button) || BT_data ==
'S') && !button.isStart && button.time)
{
oled.clear();
oled.print(0, 20,
"Initializing...", true);
Correction();
Correction();
button.isStart = true;
data_isUp = data_reference > 512 ? true
: false;
press.frep = 0;
press.state = 0;
BT_data = 'n';
BuzzerMode(true);
Serial.println("Start");
BT.print("S");
oled.clear();
oled.print(0, 20, "Start", true);
delay(2000);
press.diffTime = press.startTime =
oled_time = millis();
oled.init(1, WHITE);
OLED_display();
}
else if ((BT_data == '0' || BT_data == '1' ||
BT_data == '2' || BT_data == '3') && !button.isStart)
{
button.time = BT_data - '0';
press.countdownTime = button.time * 60000;
BT_data = 'n';
BuzzerMode(false);
Serial.print("Time: ");
Serial.print(button.time);
Serial.println("min");
oled.clear();
oled.print(0, 20, "Time: ",
false);
oled._print(OLED_char, 2,
int2char(button.time), "min");
oled.display();
delay(250);
}
else if ((!digitalRead(Time_Button))
&& !button.isStart)
{
button.time = (button.time + 1) % 4; // 0, 1, 2, 3
press.countdownTime = button.time * 60000;
// 0s, 60s, 120s, 240s
BT_data = 'n';
switch (button.time)
{
case 0:
BT.print("a");
break;
case
1:
BT.print("b");
break;
case 2:
BT.print("c");
break;
case 3:
BT.print("d");
break;
default:
break;
}
BuzzerMode(false);
Serial.print("Time: ");
Serial.print(button.time);
Serial.println("min");
oled.clear();
oled.print(0, 20, "Time: ",
false);
oled._print(OLED_char, 2,
int2char(button.time), "min");
oled.display();
delay(250);
}
if (!button.isStart || button.time == 0)
return;
if (millis() - press.startTime >=
press.countdownTime) // End
{
button.isStart = false;
Serial.println("End");
oled.clear();
BT.print(press.frep);
oled.init(2, WHITE);
oled.print(0, 20, "End", true);
delay(2000);
BT.print("E");
oled.clear();
oled.print(0, 20, "This time: ",
false);
oled._print(OLED_char, 2,
int2char(press.frep), "times");
oled.display();
BuzzerMode(true);
while (digitalRead(Start_Button))
yield();
oled.clear();
oled.print(0, 20, "Time: ",
false);
oled._print(OLED_char, 2,
int2char(button.time), "min");
oled.display();
delay(250);
}
data[Mean_Count] = TM7711read(diff_40Hz);
data_sum = Averagefilter(data, data_max,
data_min);
Mean_Count = (Mean_Count + 1) % Mean_Size;
Pressjudge();
Serial.print(data_reference);
Serial.print(" ");
Serial.print(data_sum);
Serial.print(" ");
Serial.println(press.frep);
if (millis() - oled_time > 1000 &&
button.isStart)
{
OLED_display();
oled_time = millis();
BT.print(press.frep);
}
delay(25);
}
void Correction()
{
data_sum = 0;
for (uint8_t i = 0; i < 50; i++)
{
data[Mean_Count] = TM7711read(diff_40Hz);
Mean_Count = (Mean_Count + 1) % Mean_Size;
if (i > 10)
data_sum += Averagefilter(data, data_max,
data_min);
delay(25);
}
data_reference = data_sum / 40;
Mean_Count = 0;
}
int
TM7711read(TM7711_Mode mode = diff_10Hz)
{
int buf = 0;
for (int i = 0; i < 24; i++)
{
digitalWrite(TM7711_SCK, HIGH);
buf <<= 1;
delayMicroseconds(5);
if (digitalRead(TM7711_DOUT))
buf |= 1;
digitalWrite(TM7711_SCK, LOW);
}
for (int i = 0; i < mode; i++)
{
digitalWrite(TM7711_SCK, HIGH);
delayMicroseconds(1);
digitalWrite(TM7711_SCK, LOW);
if (mode - i != 1)
delayMicroseconds(1);
}
return buf / 256;
}
unsigned long
Averagefilter(int *buf, unsigned long bufmax = 1024, unsigned long bufmin = 0)
{
unsigned long ret = 0;
for (int i = 0; i < Mean_Size; i++)
{
ret += buf[i];
}
ret /= Mean_Size;
ret = min(ret, bufmax);
ret = max(ret, bufmin);
return ret;
}
void Pressjudge()
{
if (!press.state && millis() -
press.diffTime > 750)
{
if (data_sum > data_reference +
data_reference * 0.75 && !data_isUp)
{
press.state = 1;
press.diffTime = millis();
}
else if (data_sum < data_reference -
data_reference * 0.75 && data_isUp)
{
press.state = 2;
press.diffTime = millis();
}
}
else if (press.state && millis() -
press.diffTime > 300)
{
if ((press.state == 1 && data_sum
> data_reference) &&
(press.state == 2 && data_sum
< data_reference))
return;
press.state = 0;
press.frep++;
press.diffTime = millis();
BuzzerMode(false);
}
}
void
BuzzerMode(bool isStart)
{
if (isStart)
{
tone(Buzzer, 1000, 200);
delay(200);
noTone(Buzzer);
tone(Buzzer, 1000, 200);
delay(200);
noTone(Buzzer);
}
else
{
tone(Buzzer, 1000, 200);
delay(200);
noTone(Buzzer);
}
}
void OLED_display()
{
oled.clear();
oled.print(0, 14, "Remaining time:
", false);
oled._print(OLED_char, 2,
int2char((press.countdownTime - (millis() - press.startTime)) / 1000),
"sec");
oled.print(0, 42, "Press: ",
false);
oled._print(OLED_char, 2,
int2char(press.frep), "times");
oled.display();
}
char *int2char(int
num)
{
sprintf(oled_num, "%d", num);
return oled_num;
}
💠112學年度-五福國中-三年級生活科技
電學實作課程(一)-銲接練習
112.10.05
班級:三年17班
首次銲接練習,於職前對學生教育訓練后,依桌次組別分區操作,老師在旁本查核無安全問題后,開始進行個別銲接,皆安全完成任務。
[ARDUINO程式]-範例(9)-感測器:WATER SENSER
112.10.7
[ARDUINO]感測器:WATER SENSER
一、題目要求:
使用Arduino控制水感測器並使D13 LED在檢測到水源時以0.5秒的間隔閃爍,你可以按
照以下步驟進行操作:
二、程式:
1. 用Arduino控制水感測器並使D13 LED在檢測到水源時以0.5秒的間隔閃爍,你可以按照以下
步驟進行操作:
int waterSensorPin
= 2; // 水传感器连接到D2
int ledPin =
13; // LED连接到D13
void setup() {
pinMode(waterSensorPin, INPUT);
pinMode(ledPin, OUTPUT);
}
int waterValue =
digitalRead(waterSensorPin); // 读取水传感器的值
digitalWrite(ledPin, HIGH); // 检测到水源时,点亮LED
delay(500); // 延时0.5秒
digitalWrite(ledPin, LOW); // 关闭LED
delay(500); // 延时0.5秒
}
}
不亮
const int
waterSensorPin = 2; // 水感測器連接到D2
const int ledPin =
13; // LED連接到D13
void setup() {
pinMode(waterSensorPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
int waterValue =
digitalRead(waterSensorPin); // 讀取水感測器的值
if (waterValue == HIGH) {
digitalWrite(ledPin, HIGH); // 检测到水源时,点亮LED
delay(500); // 延时0.5秒
} else {
digitalWrite(ledPin, LOW); // 没有检测到水源时,关闭LED
}
}
[ARDUINO程式]-範例(8)-感測器:ULTRASONIC
112.10.7
一、題目要求:
使用Arduino和超聲波感測器模組來檢測距離,你可以按照以下步驟進行操作。
二、所需材料:
(一).Arduino板(例如Arduino Uno)/(二).超聲波感測器模組(例如HC-SR04)
三、步驟:
將超聲波感測器模組連接到Arduino。通常,該模組具有4個引腳:VCC、
GND、Trig(觸發)和Echo(迴響)。連接VCC到Arduino的5V引腳,\ GND
連接到GND引腳,Trig連接到一個數字引腳(例如D7),Echo連接到另一個
數位引腳(例如D6)。
四、程式:
const int trigPin =
7; // 超聲波感測器的Trig引腳連接到D7
const int echoPin =
6; // 超聲波感測器的Echo引腳連接到D6
void setup() {
Serial.begin(9600); // 初始化串口通信,用於輸出測量結果
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
long duration;
int distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1; // 計算距離,單位為釐米
Serial.print("距離:");
Serial.print(distance);
Serial.println(" 公分");
delay(1000);
// 延時1秒後進行下一次測量
}
💠[生活科技]-實作篇-三年20班銲接練習
112學年度-五福國中-三年級生活科技
電學實作課程(一)-銲接練習
112.10.06
班級:三年20班
首次銲接練習,於職前對學生教育訓練后,依桌次組別分區操作,老師在旁本查核無安全問題后,開始進行個別銲接,皆安全完成任務。