---
# System prepended metadata

title: 第十三周周記

---

### 第十三周周記
#### 思考筆記
上禮拜測試之後發現用線綁的方式還是不太穩定 ( 我們有看到老師在群組提供的電梯範例，)，加上每個都要綁線、會晃、要做輪子等等覺得篇麻煩，於是後來印了齒輪組 try try，結果是可行的，不過目前還有找到更簡易版的 3D 模型，下禮拜應該會試試看，然後會拜託管理員讓我們用下面那台精準度更高的列印機，因為上禮拜印的模型有點歪掉，又修了一下才可以動.......，所以樓梯的部分會改成直接放齒輪組去移動，然後印白色的，改用壓克力板切。

另一方面，小人移動的部分我們想說先當 bonus ( 畢竟剩一個禮拜了QQ，主要還是先做樓梯移動 )，不過如果行有餘力，後來想說改成當下一階和目前這階在同一個階層時讓小人的馬達轉動帶動他前進到下一階，然後我們讓階梯都水平相連在一起，這樣就可以解決往下往上的困難又可以達成原本的目的，實作的部分有想過用無線 ( 藍芽傳輸 ) 或有線，但目前還沒時間研究
#### 專案開發
- 感測器與樓梯移動 ( 不包含操控馬達 ) 程式碼，已實測過可行
```
#include "DHT.h"
#define DHTPIN 9 
#define DHTTYPE DHT11
const int lightPin = A0; // 使用A0引腳來讀取光線感應器數據
DHT dht(DHTPIN, DHTTYPE); // 溫溼度
int stairs[7] = {1,1,1,1,1,1,1}; // 樓梯
float l_1, t_1, h_1, l_2, t_2, h_2;
int location=0;

void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0)+ millis()); // 使用類比引腳的讀數作為種子
  dht.begin();  //初始化DHT
}

void setLayer(int i, float first, float sec) {
  int randomValue = random(0, 5);
  int cur_s = stairs[i];
  bool tryMove = true;
  if (first > sec) {
    while (tryMove) {
      if (cur_s - randomValue >= 1) {
        stairs[i] = cur_s - randomValue;
        tryMove = false;
      }
      else {
        randomValue = random(0, 5);
      }
    };
  }
  else {
    while (tryMove) {
      if (cur_s + randomValue <= 5) {
        stairs[i] = cur_s + randomValue;
        tryMove = false;
      }
      else {
        randomValue = random(0, 5);
      }
    };
  };

  Serial.print("stairs: ");
  for (int i = 0; i < 7; i++) {
    Serial.print(stairs[i]);
    Serial.print(" ");
  }
  Serial.println();

  if (stairs[location] == stairs[location+1]) {
    location++ ;
  }
  Serial.print("location: ");
  Serial.print(location);
  Serial.println();
}

void handleLight(float l_1, float l_2) {
  Serial.println("Layer 0: ");
  setLayer(0,l_1, l_2);
  Serial.println("Layer 3: ");
  setLayer(3,l_1, l_2);
  Serial.println("Layer 4: ");
  setLayer(4,l_1, l_2);
}

void handleTemp(float t_1, float t_2) {
  Serial.println("Layer 1: ");
  setLayer(1,t_1, t_2);
  Serial.println("Layer 3: ");
  setLayer(3,t_1, t_2);
  Serial.println("Layer 5: ");
  setLayer(5,t_1, t_2);
}

void handleHumi(float h_1, float h_2) {
  Serial.println("Layer 2: ");
  setLayer(2,h_1, h_2);
  Serial.println("Layer 4: ");
  setLayer(4,h_1, h_2);
  Serial.println("Layer 5: ");
  setLayer(5,h_1, h_2);
}

void loop()
{
  l_1 = analogRead(lightPin); // 讀取光線感應器數據
  h_1 = dht.readHumidity();   //取得濕度
  t_1 = dht.readTemperature();  //取得溫度C

  Serial.print("light1: ");
  Serial.print(l_1);
  Serial.print("\tHumidity1: ");
  Serial.print(h_1);
  Serial.print(" %\t");
  Serial.print("Temperature1: ");
  Serial.print(t_1);
  Serial.println(" *C ");

  if (l_1 - l_2 > 200 || l_2 - l_1 > 400) {
    Serial.println("handleLight");
    handleLight(l_2, l_1);
  }
  if (t_1 - t_2 > 5.0 || t_2 - t_1 > 5.0) {
    Serial.println("handleTemp");
    handleTemp(t_2, t_1);
  }
  if (h_1 - h_2 > 30.0 || h_2 - h_1 > 30.0) {
    Serial.println("handleHumi");
    handleHumi(h_2, h_1);
  }
  delay(10000);

  l_2 = analogRead(lightPin); // 讀取光線感應器數據
  h_2 = dht.readHumidity();   //取得濕度
  t_2 = dht.readTemperature();  //取得溫度C

  Serial.print("light2: ");
  Serial.print(l_1);
  Serial.print("\tHumidity2: ");
  Serial.print(h_1);
  Serial.print(" %\t");
  Serial.print("Temperature2: ");
  Serial.print(t_1);
  Serial.println(" *C ");

  if (l_2 - l_1 > 200 || l_1 - l_2 > 400) {
    Serial.println("handleLight");
    handleLight(l_1, l_2);
  }
  if (t_2 - t_1 > 3 || t_1 - t_2 > 3) {
    Serial.println("handleTemp");
    handleTemp(t_1, t_2);
  }
  if (h_2 - h_1 > 5 || h_1 - h_2 > 5) {
    Serial.println("handleHumi");
    handleHumi(h_1, h_2);
  }

  delay(10000);
}
```
- 參考資源

    - 光敏
[https://cavedu.gitbook.io/cavedu/rk001/module_ui/linkit7697_light](https://)

    - 溫溼度
[https://blog.jmaker.com.tw/dht11-lcd/](https://)