2023年10月7日 星期六

[小專題]救難型機器狗(未完成)

 [小專題]救難型機器狗(未完成)

112.10.8

1.




2.影片





[小專題]磁浮列車(未完成)

 [小專題]磁浮列車

112.10.08

一.說明


二.影片



[小專題]三合一復健球(未完成)

 

[小專題]三合一復健球(未完成)

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;

}

 

💠[生科]-實作-三年17班銲接練習

 

💠112學年度-五福國中-三年級生活科技

電學實作課程()-銲接練習

112.10.05

班級:三年17

  首次銲接練習,於職前對學生教育訓練后,依桌次組別分區操作,老師在旁本查核無安全問題后,開始進行個別銲接,皆安全完成任務。













 

[ARDUINO程式]-例(9)-感測器:WATER SENSER

 [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);

}

 void loop() {

  int waterValue = digitalRead(waterSensorPin);  // 读取水传感器的值

   if (waterValue == HIGH) {

    digitalWrite(ledPin, HIGH);  // 检测到水源时,点亮LED

    delay(500);                   // 延时0.5

    digitalWrite(ledPin, LOW);   // 关闭LED

    delay(500);                   // 延时0.5

  }

}

 2. 使用Arduino控制水感測器,並使D13 LED在檢測到水源時以0.5秒的間隔閃爍,反之D13 LED

    不亮

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

 [ARDUINO程式]-範例(8)-感測器:ULTRASONIC

112.10.7

一、題目要求:

      使用Arduino和超聲波感測器模組來檢測距離,你可以按照以下步驟進行操作。

二、所需材料:

 ().Arduino板(例如Arduino Uno/().超聲波感測器模組(例如HC-SR04



步驟:

     將超聲波感測器模組連接到Arduino。通常,該模組具有4個引腳:VCC

  GNDTrig(觸發)和Echo(迴響)。連接VCCArduino5V引腳,\ 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班銲接練習

 💠[生活科技]-實作篇-三年20班銲接練習

112學年度-五福國中-三年級生活科技

電學實作課程()-銲接練習

112.10.06

班級:三年20

  首次銲接練習,於職前對學生教育訓練后,依桌次組別分區操作,老師在旁本查核無安全問題后,開始進行個別銲接,皆安全完成任務。