---
# System prepended metadata

title: 社交距離測距儀
tags: [社群專案, ' FablabTainan']

---

---
tags: 社群專案, FablabTainan,
---
# 社交距離測距儀

----------
:::info
[TOC]
:::

----------
# 一、專案介紹

## 專案簡介
因應武漢肺炎需保持社交距離,以超音波測距模組加attiny85製作提醒社交距離的配戴式偵測器


## 授權方式

（創用CC授權）

----------
# 二、專案合作人

## 發起人：
- 詹富貴

## 合作人：
- 
（有興趣參與共筆的人,可以直接在此列上你的大名！）


----------
# 三、實作討論
## 試作1.0
* 構想1:控制器用ATTiny85,以遙控器用的12V的電池作為電源,超音波模組作為量測距離的元作,最後由蜂鳴器模組發出聲音及ATTiny85的LED作為提醒,己在量測範圍內,並保留一個按鈕作為其他功能的備用輸入.

![試作1.0](https://i.imgur.com/ot2HWzc.jpg)
* 試作後發現幾個問題
1. 遙控器用的12V的電池,電容量太小(目前查到只有55mAh),用電源供應器直接供電看跑多少電流,最大會到50mA,最少也有20mA,所每次一上電就瞬間被吸乾,無法啟動ATTiny85
2. 由於這次的ATTiny85有6個點的設計,想把所有腳位全用完,因此把預留的按鈕接到5腳位上,但其實這個腳位是reset,所以上電後程式一直無法跑,最後找到是如果要用[reset當GPIO](http://projectsfromtech.blogspot.com/2013/04/using-reset-pin-as-io-on-attiny8545.html)的話需要一需特殊的設定才能用,但因為還多了一個腳位,最後將預留的按鈕移過去,reset還是當reset



## 試作2.0
* 藉由1.0的試作,找出大概的問題,電源改用3.7V的口香糖鋰聚合物電池,加個升壓充電保護三合一的充電板作為電源,且為了讓成品好作及縮小體積,畫了電路並用CNC試作.
![原理圖](https://i.imgur.com/zR3OXi7.png)
[原理圖](https://drive.google.com/file/d/1pLIdncWv5ZIu6wNqu-GLLRlGdJcNXemY/view?usp=sharing)

![線路圖](https://i.imgur.com/ZmlB1xm.png)
[線路圖](https://drive.google.com/file/d/1_SFCv88eCxg3-79VW_dUt2TcQ_Y10ft0/view?usp=sharing)

* 用CNC試作電路板
![](https://i.imgur.com/S16oNlq.jpg)
![](https://i.imgur.com/x5Mor0Z.jpg)
![](https://i.imgur.com/zoSom0F.jpg)
![](https://i.imgur.com/azq7LCb.jpg)

* 作好後電路後,再用雷切作個外殼包起來,一開始是以御守為概念,但最後電路有點太厚了,變的不太像了.
![](https://i.imgur.com/AGKNLOT.jpg)
![](https://i.imgur.com/4Th80Iz.jpg)
![](https://i.imgur.com/qlxxdMV.jpg)
[外殼雷切檔](https://drive.google.com/file/d/1JXDLt9HN4hk2iLT7N0c8lrEW4XxhATmQ/view?usp=sharing)
* 最後測試效果,距離量測算準確,大約在上下左右30度以內都能順利接收,只是因為超音波無法辨識人或物體,有偵測到就會叫,最後只是一個很吵的玩具.



# 四、程式碼
v1.0
:::danger
#include <NewPing.h> //Iclud Arduino Pin Library,https://www.14core.com/didispark-attiny85-with-ultrasonic-hc-sr04-sensor/

#define buzzer 0//蜂鳴器(SDA),0
#define led 1//板上led,1
#define zerobutton 2//歸零鈕(SCL)
//5(reset)
unsigned long zero_time[2] = {0, 0};//延遲暫存值
unsigned long led_time[4] = {0, 0, 0, 0}; //led延遲暫存值
unsigned long sonar_time[2] = {0, 0};//超音波延遲暫存值
uint8_t sensorzero[2] = {150, 0}; //超音波歸零值
bool bi_switch = 1;
#define MAX_DISTANCE 300 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(4, 3, MAX_DISTANCE); //(TRIGGER_PIN, ECHO_PIN, DISTANCE)

void setup()
{
  //Serial.begin(9600);
  pinMode(zerobutton, INPUT);
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
}

void loop()
{
  /*連續取值*/
  sonar_time[0] = millis();
  if (sonar_time[0] - sonar_time[1] > 500)//每0.5秒取一次
  {
    sensorzero[1] = sonar.ping_cm();//超音波現在值
    //Serial.println(sensorzero[1]);
    sonar_time[1] = sonar_time[0];
  }

  /*偵測開始*/
  if (sensorzero[1] > 0) //0:設定值,1:現在值
  {
    if (sensorzero[1] > sensorzero[0] * 0.7 && sensorzero[1] <= sensorzero[0] * 1 )//1~1.5米
    {
      Detect(500, bi_switch);
    }
    else if (sensorzero[1] <= sensorzero[0] * 0.7 )//1米
    {
      Detect(100, bi_switch);
    }
    else
    {
      digitalWrite(led, LOW);
      digitalWrite(buzzer, LOW);
    }
  }
}

/*偵測輸出*/
void Detect(int delay_time, bool bi)
{
  led_time[0] = millis();
  if (led_time[0] - led_time[1] > delay_time)
  {
    digitalWrite(led, HIGH);
  }
}
:::




