2013/09/18

Arduino練習:壓力感測器(Force-Sensitive Resistor)

類比輸入的形式非常多,譬如我之前寫過的可變電阻光敏電阻,這一篇則是壓力感測器(Force-Sensitive Resistor),顧名思義,加諸不同的力量(擠壓、重量),便會得到不同的電阻,進而改變從Arduino類比輸入腳位所讀取到的電壓值。

這是我向Adafruit買的壓力感測器,型號是Interlink 402,圓形部分半徑1/2吋可感測壓力,有兩支腳,可插入麵包板。


所謂壓力感測器(Force-Sensitive Resistor),其實就是個電阻,根據施加的壓力,其電阻值會改變,此產品的規格如下,無壓力時電阻幾近無限大,施加壓力後,電阻就會變小。


不過施加壓力的力道與電阻之間的變化關係,並非線性。


底下是電路圖,接法跟可變電阻很像,壓力感測器有兩支腳,其中一支接5V,另一支除了串聯10k歐姆電阻接地外,也接到Arduino的類比輸入腳位A0。

我另外從Arduino數位腳位11(具PWM)接了一個LED,將根據壓力感測器的讀數控制LED的亮度。


線路完成後的照片。


以上是硬體線路部分,底下是軟體程式的部份。

// 首先定義腳位
#define led_pin 11
#define fsr_pin A0

void setup()
{
  Serial.begin(115200);
  pinMode(led_pin, OUTPUT);
}

void loop()
{
  int fsr_value = analogRead(fsr_pin); // 讀取FSR
  int led_value = map(fsr_value, 0, 1023, 0, 255); // 從0~1023映射到0~255
  analogWrite(led_pin, led_value); // 改變LED亮度
  Serial.println(fsr_value);
  Serial.println(led_value);
  Serial.println("-------------");
  delay(100);
}

Arduino類比腳位的解析度是10位元(0~1023),而PWM腳位則是8位元(0~255),所以程式中使用map進行映射。

完成後,平時FSR電阻無限大,A0會讀到接地(電壓0V),所以LED不亮;若輕輕按壓FSR,LED就會微亮,用力擠壓FSR的話LED就會更亮一點。

此種壓力感測器價格低、容易使用,但不精確,不可用來偵測確實的力道或重量,而是應該取出幾個範圍,譬如無壓力、有點壓力、中等壓力、很大的壓力、等等,然後加以運用。

174 comments:

  1. 對不起我是門外漢~我想請問一下~
    1.壓力感測器的那兩隻腳~是否可以接線再讓它長一點~
    2.如果我要感側的表面是微濕潤(例如口內黏膜)是否可行??
    謝謝您的詢問 感激

    ReplyDelete
    Replies
    1. 1. 可以。
      2. 不知道耶,試試看吧。

      Delete
    2. http://www.icshop.com.tw/product_info.php/products_id/9752
      Flexiforce壓力傳感器(max:45kg)
      那像這種有標記最大值的壓力感測器是否就可以根據我們所壓出的力量數據化??
      謝謝您的答覆~感激

      Delete
    3. 這產品比這篇的FSR來得好,也比較貴;應該比較穩定,而且已校正過,根據文件有1, 25, or 100磅可選用。

      > 根據我們所壓出的力量數據化?
      可以啊,不過其輸出應該也是對數logarithmic、而非線性linear,
      你給的產品網頁裡有下載資料表的網址,看看裡面有沒有壓力與輸出的表囉。



      Delete
    4. 謝謝你的回覆~我會仔細看資料表~感激

      Delete
    5. 對不起我第一次接觸這類的電子零件
      想請問 FSR400 的電阻要用多少的?

      Delete
    6. short answer:一樣。

      long answer:要看你想量到多少的電壓,在官方文件http://learn.adafruit.com/system/assets/assets/000/010/126/original/fsrguide.pdf中,Figure 9畫出使用100k、47k、30k、10k、3k時的圖形。

      Delete
  2. 你好~我想要請教
    此件施加的壓力與電阻之間的關係
    是可以改變的嗎?
    例如說我只希望感測100g-200g間的壓力變化去調整電阻
    謝謝

    ReplyDelete
    Replies
    1. 你手上的產品跟我手上的產品,即便同一家公司同一型號,施以同樣力量後,仍會有相當大的誤差。
      即便是只使用你手上的產品,施以同樣力量後,也可能得到不同的值,也會有誤差。
      100g-200g對本文章中的感測器來說,是很小的範圍。我"猜測"很難做得很準確。

      想做的話,步驟應該是,接上電路,施以100g-200g之間的力量,然後看輸出值是否範圍夠大,調整分壓電路中另一個電阻的值,使其更明顯。

      Delete
    2. 請問一下我是初學者,為何接地還要加一個10k電阻呢?

      Delete
    3. 形成分壓電路。

      Delete
    4. 沒有外接電阻,讀薄膜傳感器兩隻腳,要麼永遠是5V,要麼永遠是0V。沒意義了

      Delete
  3. 您好,我是位剛接觸Arduino的初學者

    因近期有項專題製作,需要作出的項目類型,與版大您的做法類似

    我需要的是,當我壓(按)的越大力的時候,我亮的LED燈會越多顆(暫估5顆)

    請問我的程式設計上,需要怎麼做修正(如果以版大上述分享的程式為例的話)

    不好意思,問了麻煩的問題,還望版大不吝賜教,謝謝!!

    ReplyDelete
    Replies
    1. 根據這篇的作法,先測出不按的時候、Arduino類比腳位讀取到的數值,然後測出以最大力氣按壓時的數值,再切成一段一段,譬如5段。

      然後在loop()裡,不斷讀取數值,根據該數值落於哪一段,點亮相對應數量的LED燈。

      Delete
    2. loop()裡應該怎麼打... 我嘗試了多次都沒成功
      謝大大

      Delete
  4. 抱歉,請問一下
    如果我是買FSR400型號之感測器
    依照您的程式碼無法作動.
    程式碼該如何修改呢..
    抱歉 是這方面新手

    ReplyDelete
    Replies
    1. 請附上清楚的電路圖照片,以及程式碼,
      另外註明使用哪一塊Arduino板子。

      Delete
  5. 請問一下 這個我電路做出來是可以用的 壓越大力也會越亮,請問一下那這個要如何讓LED燈能固定亮著不要滅掉呢? 然後再壓一次就暗掉 這個要如何用Arduino做到

    ReplyDelete
    Replies
    1. 請參考
      Arduino練習:以開關切換LED明滅狀態
      http://yehnan.blogspot.tw/2012/02/arduinoled.html

      Delete
  6. http://www.rakuten.com.tw/shop/icshop/product/368030200137/
    您好我想請問這種的傳感器是否能夠跟arduino連動呢?
    (不好意思我是新手幾乎什麼都不懂><)
    我跟組員想要LED燈亮然後有壓力之後燈熄滅
    不知道Arduino能不能做到...?
    謝謝!

    ReplyDelete
    Replies
    1. 可以。

      此產品利用重量去改變電阻值,量測重量而沒有拉力的話,可使用5V以及串聯一個電阻作分壓。
      與連接一般的光敏電阻、壓力感測器、等等,都差不多。

      Delete
  7. 請問可以教我怎麼用壓力感測器控制震動馬達動嗎

    ReplyDelete
    Replies
    1. 有問題請留言,盡量回答。

      震動馬達只有停跟震兩種狀態嗎?
      那就從壓力感測器讀取數值,設定界限,超過就震,沒超過就停。

      Delete
    2. 是的,請問可以教我怎麼設定界線嗎?本人剛接觸arduino

      Delete
    3. 就在程式裡定義變數,設定界限的值。
      至於值要設多少,先測試壓力感測器,得知多少壓力會得到多大的輸入值,然後根據你的需求,取其中一個值。

      當然,也可以取其中一個範圍,而不是單一固定值。不過這樣一來,程式就要改寫。

      Delete
    4. 請問可以教我怎麼取其中一個範圍嗎?

      Delete
    5. 施加不同力量到你的壓力感測器,讀取讀數,
      看你想要哪個力量範圍(對應到讀數範圍)

      Delete
  8. 葉先進,請教一下,我用壓力感測器測試傳到手機是OK的,但如果我增加了測量外部電池的analog1 之後,我手機端就會產生bug,請問要怎麼解決? 關於手機端我是傳輸了字串才開始接收到壓力感測器的值,但我增加delay的動作,就不會發生此問題,這是我的Arduino程式碼:

    // 首先定義腳位
    #define fsr_pin A0
    #define voltage_pin A1
    #include // 引用程式庫

    // 定義連接藍牙模組的序列埠
    SoftwareSerial BT(8, 9); // 接收腳, 傳送腳
    void setup() {
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    BT.begin(9600);
    }

    void loop() {
    int fsr_value = analogRead(fsr_pin); // 讀取FSR
    int voltage_value = analogRead(voltage_pin); // 讀取FSR
    BT.println(fsr_value);
    if(voltage_value >756)
    {
    digitalWrite(4, HIGH); // turn the LED on (HIGH is the voltage level)
    digitalWrite(5, HIGH); // turn the LED on (HIGH is the voltage level)
    digitalWrite(6, HIGH); // turn the LED on (HIGH is the voltage level)
    }
    if(voltage_value =523)
    {
    digitalWrite(4, LOW); // turn the LED on (HIGH is the voltage level)
    digitalWrite(5, HIGH); // turn the LED on (HIGH is the voltage level)
    digitalWrite(6, HIGH); // turn the LED on (HIGH is the voltage level)
    }
    if(voltage_value = 325)
    {
    digitalWrite(4, LOW); // turn the LED on (HIGH is the voltage level)
    digitalWrite(5, LOW); // turn the LED on (HIGH is the voltage level)
    digitalWrite(6, HIGH); // turn the LED on (HIGH is the voltage level)
    }
    if(voltage_value < 100)
    {
    digitalWrite(4, LOW); // turn the LED on (HIGH is the voltage level)
    digitalWrite(5, LOW); // turn the LED on (HIGH is the voltage level)
    digitalWrite(6, LOW); // turn the LED on (HIGH is the voltage level)
    }

    }

    ReplyDelete
    Replies
    1. > 我手機端就會產生bug,請問要怎麼解決?
      什麼bug?

      > 關於手機端我是傳輸了字串才開始接收到壓力感測器的值,
      從你的程式碼看不到「傳輸了字串」這部份。

      > 但我增加delay的動作,就不會發生此問題
      delay增加在哪?

      Delete
    2. 我後來解決了

      // 首先定義腳位
      #define fsr_pin A0
      #define voltage_pin A1
      #include // 引用程式庫

      // 定義連接藍牙模組的序列埠
      SoftwareSerial BT(8, 9); // 接收腳, 傳送腳
      void setup() {
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      BT.begin(9600);
      }

      void loop() {
      while (BT.available() > 0){
      int fsr_value = analogRead(fsr_pin); // 讀取FSR
      BT.println(fsr_value);
      delay(100);
      }

      int voltage_value = analogRead(voltage_pin); // 讀取外部電池

      if(voltage_value >756)
      {
      digitalWrite(4, HIGH); // turn the LED on (HIGH is the voltage level)
      digitalWrite(5, HIGH); // turn the LED on (HIGH is the voltage level)
      digitalWrite(6, HIGH); // turn the LED on (HIGH is the voltage level)
      }
      if(voltage_value >=523 && voltage_value <= 756)
      {
      digitalWrite(4, LOW); // turn the LED on (HIGH is the voltage level)
      digitalWrite(5, HIGH); // turn the LED on (HIGH is the voltage level)
      digitalWrite(6, HIGH); // turn the LED on (HIGH is the voltage level)
      }
      if(voltage_value > 325 && voltage_value <=523 )
      {
      digitalWrite(4, LOW); // turn the LED on (HIGH is the voltage level)
      digitalWrite(5, LOW); // turn the LED on (HIGH is the voltage level)
      digitalWrite(6, HIGH); // turn the LED on (HIGH is the voltage level)
      }
      if(voltage_value < 100)
      {
      digitalWrite(4, LOW); // turn the LED on (HIGH is the voltage level)
      digitalWrite(5, LOW); // turn the LED on (HIGH is the voltage level)
      digitalWrite(6, LOW); // turn the LED on (HIGH is the voltage level)
      }

      }

      Delete
  9. 請問有8051的程式碼嗎

    ReplyDelete
  10. 請問上面程式碼的Serial.begin(115200);
    115200是什麼數值呢?

    ReplyDelete
  11. 不好意思,我是初學者,可以請教你
    1.不管哪一種Arduino,程式語言都可以通用嗎?,我是使用Blueduino rev2
    2.當我的arduino和電腦連接時,在Arduino IDE裡打完程式後,要點選哪一個鍵才是把程式傳給arduino呢?... 那要怎樣才可以得知有執行成功?

    ReplyDelete
    Replies
    1. 1. Blueduino說它相容於Arduino,所以答案是yes。
      根據網路上找到的資訊,Arduino IDE應該選板子「LilyPad USB」。
      2. Arduino IDE左上方的「向右箭頭」按鈕;或是選單「草稿碼-上傳」。
      若最後出現上傳完畢或完成等字樣,就代表上傳動作成功。

      Delete
    2. 謝謝你!
      我還想請問你 如果只想測試壓力感測器的話 程式該怎麼打呢?

      Delete
    3. #define fsr_pin A0
      void setup() {
      Serial.begin(115200);
      // put your setup code here, to run once:

      }

      void loop() {
      int fsr_value=analogRead(fsr_pin);
      Serial.println(fsr_value);

      // put your main code here, to run repeatedly:

      }

      這樣的程式來測試壓力感測器是否正確?

      Delete
    4. 對。

      另外,這篇文章不是也有程式嗎?

      Delete
    5. 我在測試時 壓了壓力感測器後 視窗上只顯示1023,我該怎麼知道他的數值?

      Delete
    6. 數值就是1023啊。

      你電路接錯了吧。

      Delete
  12. 你好,因為我也有買同一款感測器但是測試出來發現精準度不夠,所以想請問您有沒有推薦比較精準的壓力感測器,希望能精準測出較小範圍例如100~200g那種。

    ReplyDelete
    Replies
    1. 不清楚,無法回答。

      Delete
    2. 此類型的壓力感測器,規格書都會強調不應作為定量的測量。其誤差常介於正負5~25之間。

      Delete
  13. 你好,上述程式有成功執行過了
    接下來我想使用藍芽模組,讓主端的壓力感測器
    能讓從端的LED發亮
    請問該如何使上述程式分成兩部份呢?(藍芽主與從端部分已經成功互相連線)

    ReplyDelete
    Replies
    1. > 上述程式有成功執行過了
      哪裡的程式?

      > 請問該如何...
      不懂問題所在。什麼叫做分成兩部分?
      既然已成功連線,就可由主端根據壓力感測器的數值,傳出命令交由從端控制LED亮滅。

      Delete
    2. 本篇的程式
      因為裡面有些參數是互相呼應的
      所以不懂該如何分成兩部分
      意思是目前程式無法讓LED正常工作
      我是參考這篇文章去改的

      Delete
    3. 嗯,主端的程式碼應該跟這篇差不多,但要把
      analogWrite(led_pin, led_value);
      改成經由藍牙向從端發送led_value,

      從端從藍牙收到該值後,以之修改LED的明暗度。

      另外要加大delay的值,譬如每五秒就是delay(5000);,才不會過快。

      Delete
  14. 現在問題是不知道為何在程式及腳位都沒有錯誤的情況下
    會亮到其他不相干的LED
    我是設定PIN腳11
    可是他對PIN腳13的LED有反應 11的則不會動作

    ReplyDelete
    Replies
    1. > 在程式及腳位都沒有錯誤的情況下
      既然你都說沒有錯誤,那我也不知道。

      程式碼?

      Delete
    2. 主端部分:
      int fsr_value = analogRead(fsr_pin); // 讀取FSR
      int led_value = map(fsr_value, 0, 1023, 0, 255); // 從0~1023映射到0~255

      BT.print(val);
      BT.print(led_value);

      if (buttonstate == HIGH) {
      val = '1';
      }
      if (buttonstatea == HIGH) {
      val = '2';
      }
      if (buttonstatea == LOW && buttonstate == LOW) {
      val = '0';
      }
      從端部分:
      if (BT.available()) {
      val = BT.read();

      if(led_value>0){
      analogWrite(LED_PINc, led_value); // 改變LED亮度
      delay(100);
      }
      從端剩下的就是很單純按按鈕讓LED亮( if val==? 哪個就會亮這樣)

      Delete
    3. 從你給的程式碼,看不出問題。

      Delete
  15. 請問壓力感測器的圓形感測區,
    有沒有辦法增加面積?

    ReplyDelete
    Replies
    1. 自己沒辦法吧。

      買大一點的?

      Delete
  16. This comment has been removed by the author.

    ReplyDelete
  17. 請問怎麼把壓力感測的放進陣列裡面呢?
    (沒有限定要測幾次,希望讀到幾次放幾個)

    ReplyDelete
    Replies
    1. 事先不知道幾次的話,要用動態記憶體配置。

      Delete
  18. Anonymous12/4/16 22:15

    請問壓力感測器有兩隻腳,為何要串連一個電阻後才可接地?運用何種原理?

    ReplyDelete
  19. Anonymous12/4/16 22:15

    請問壓力感測器有兩隻腳,為何要串連一個電阻後才可接地?運用何種原理?

    ReplyDelete
  20. 請參閱拙作《Arduino輕鬆入門》第4章,
    主要原理就是「4.1 分壓器」,裡頭有詳細說明。

    ReplyDelete
    Replies
    1. Anonymous13/4/16 13:14

      可是這個書沒有電子版的吧。我就想知道這一個問題,能否在這裡回復呢?或者email給我?

      Delete
    2. 我寫成文章
      http://yehnan.blogspot.tw/2012/02/arduino_21.html
      與書籍《Arduino輕鬆入門》,
      原因之一就是不想重複回答問題。

      可搜尋關鍵字「arduino 分壓 類比」,
      譬如底下這些分享文章:
      http://yhhuang1966.blogspot.tw/2015/10/arduino.html

      http://www.digikey.tw/zh/articles/techzone/2012/feb/arduinos-analog-functions-how-to-use-them-in-your-next-design

      http://swf.com.tw/?p=729

      http://dshps.blogspot.tw/2015/03/blog-post_17.html

      Delete
    3. Anonymous13/4/16 13:28

      謝謝

      Delete
  21. 你好 我想請問一下 我想要做一個壓力感測計次的裝置 請問一下這個程式碼有辦法做到 數值低於多少算一次 高於多少不算 累進的方式嗎?

    ReplyDelete
    Replies
    1. 訂出你要的範圍,低數值與高數值,
      並且訂出當壓力小於低數值後,應維持多少時間才計次一次,
      超過該時間後,要不要重複計次,

      訂出種種相關規格,
      然後改寫程式。

      Delete
  22. 你好,我想問您,如果想要用arduino透過藍芽連接的話,在arduino上的藍芽code要怎麼寫呢?

    ReplyDelete
    Replies
    1. 查藍牙模組的文件,看如何連接,如何控制。
      HC-06藍牙模組的話,使用序列埠介面,下達AT指令。

      Delete
    2. 我是使用BlueDuino Rev2,這個板子本身內建就有BLE。
      那我這樣打是對的嗎?

      #include
      #include
      SoftwareSerial mySerial(11,12);

      void setup() {
      Serial.begin(9600);
      mySerial.begin(9600);
      }

      Delete
    3. BlueDuino Rev2的CC254x藍牙模組,經由硬體序列埠Serial1與ATMega32U4溝通。

      詳細介紹請看
      http://wiki.aprbrother.com/wiki/BlueDuino_rev2

      這裡有範例程式
      https://github.com/AprilBrother/BlueDuino-Library/tree/master/examples

      Delete
    4. 我想問你 硬體序列埠和軟體序列埠的差別是什麼?

      Delete
    5. 顧名思義,硬體序列埠就是由電子晶片提供序列傳輸功能,
      軟體序列埠,是由軟體程式模擬出來的。

      Delete
  23. 這樣是不是100k是最好的?

    ReplyDelete
  24. 這一款壓力感測 最大重量能夠感測到10kg, 請問如果施加大於10kg的力量,此感測器會壞掉(破裂之類的)嗎??

    ReplyDelete
  25. 請問 我用Mega2560電路跟您的接法一樣
    程式碼也都相同 可是這樣LED卻不會亮
    可以請問是什麼原因嗎

    ReplyDelete
    Replies
    1. 程式未燒錄成功?LED壞了?壓力感測器壞了?

      Delete
    2. 程式上傳有成功,LED也是正常的
      可是壓力感測器剛買的,不知道怎麼測試是否正常

      Delete
    3. 我後來又把LED的程式碼部分刪掉,測是壓力感測是正常的
      後來再把LED的部份加回去,是可以測到值可是沒有辦法改變LED亮度
      LED線路應該是正確的,我有先run過一次

      Delete
    4. show me the code.

      Delete
    5. led串聯的電阻弄錯了?

      Delete
    6. 我的code跟你這篇文章的一樣
      會不會是壓力值太小,無法驅使LED亮起來呢?
      妳測出來的壓力範圍大概再多少左右LED可以亮?

      Delete
    7. 大概是吧。

      忘了。

      Delete
    8. 我用手壓測出來大概70幾左右 不知道正不正常

      Delete
    9. 這個出來的數值 可以轉換成力的數值嗎?(幾克重幾克重這樣子
      因為我想作一個測量力然後可以計數這樣 計數的部分可以請問該怎麼寫嗎

      Delete
    10. 70幾是哪個?如果是fsr,算很小。
      何不改程式碼?加大放大倍率不就好了?

      > 轉換成力的數值嗎?
      文章中有張對應圖。

      Delete
  26. 放大倍率後可以控制LED亮暗了 謝謝!
    文章中那個圖,我該怎麼把0-1023那數值轉成力的大小?

    ReplyDelete
    Replies
    1. 從0~1023轉成電壓,根據你接的分壓電路,算出FSR受力時的電阻,再從圖查出對應的力。

      Delete
  27. 我想請問一下~如果我要在86Duino上加上排成要怎麼加呢?
    我想要的功能是我要讓馬達一邊運作一邊收他的資料。

    ReplyDelete
    Replies
    1. 我沒有86Duino。

      同時做兩件事情,有很多種方式。

      馬達是哪種馬達? 重要的是程式庫應提供非阻斷式API。

      Delete
    2. 能用四個感測器來秤重嗎

      Delete
    3. 可以用四個,
      可以秤重,
      但不準吧,我想。

      Delete
    4. 那請問您有建議用甚麼原件結合Arduino來秤重嗎??

      Delete
    5. This comment has been removed by the author.

      Delete
  28. 請問我要讓壓力感測器當開關使用 壓一下led on 再壓一下led off 做得到嗎?

    ReplyDelete
  29. 請問我要讓壓力感測器當開關使用 壓一下led on 再壓一下led off 做得到嗎?

    ReplyDelete
    Replies
    1. 做得到。

      Arduino練習:以開關切換LED明滅狀態
      http://yehnan.blogspot.com/2012/02/arduinoled.html
      的程式改一改,改成根據壓力感測器的數值來判斷,就可以了。

      Delete
    2. 請問要怎麼知道壓力感測器的數值?

      Delete
    3. 請看本篇內文。

      Delete
  30. 可以請問一下如何用這元件來秤重嗎??

    ReplyDelete
  31. 可以請問一下如何用這元件來秤重嗎??

    ReplyDelete
    Replies
    1. 嗯,讀取數值後,推導出電阻值,再推出力,最後得到重量。
      ㄟ,以上所說,僅是臆測,沒真正做過。
      況且,這個元件的 力-電阻 關係圖,並非線性。
      況且,其精確度到多少,我不知道,說不定誤差甚大。

      Delete
  32. 請問
    如果我想即時顯示出電阻值或是直接顯示出當下的荷重
    請問程式部份該怎麼打
    電阻值換算成荷重的公式 該增加在哪呢?

    ReplyDelete
    Replies
    1. 施加壓力的力道與電阻之間的變化關係,在本文的第三張圖,我不知道公式。

      > 顯示出
      不就是print

      Delete
  33. 你好!
    我想請問我要做一拿掉壓在感應器上面的東西,讓投影機開始播放影片,
    但我不是很確定我會使用到電腦做中間的聯結嗎?
    還是不需要電腦,另外加記憶卡在arduino身上就好?謝謝~

    ReplyDelete
    Replies
    1. 你要怎麼控制投影機呢?
      紅外線遙控器?
      先試試能不能為Arduino加裝紅外線功能、操控投影機吧。

      Delete
    2. 謝謝你的回覆!
      如果我投影機讓他一直播放的,
      感測壓力感測器上是否有重量讓他進行影片的切換,
      所以投影機播放應該都會是電腦螢幕顯示的內容,
      這樣是否不需要紅外線感應?
      然後如果沒有壓力及讓他停止這樣可以?
      非常感謝!

      Delete
    3. 喔,你投影機已經跟電腦相連,接下來,
      讓Arduino與電腦相連,
      可使用紅外線、藍牙、wifi、有線的序列埠、有線的USB、等等,
      然後由Arduino讀取壓力感測器,根據壓力狀態,送出指令給電腦,
      電腦收到後再控制投影片。

      Delete
  34. 葉老師,想請問一下,壓力感測器感應的範圍最大到10Kg?那如果超過10Kg就偵測不到有無東西踩著嗎?還是說只是偵測不到實際重量而已?

    因為我要做的功能是:在 4×4 方形地板上,某些方格亮著燈,玩家必須站到其它沒亮燈的方格 讓燈亮著,六個亮燈的方格可拼成正方體展開圖才可過關。

    謝謝><

    ReplyDelete
  35. 葉老師你好,我想請問一下,壓力感測器如果是超過10Kg以上的就感測不到了嗎?還是一樣可以感測到有東西在上面,只是無法知道重量而已?

    因為我要做的功能是:在 4×4 方形地板上(每一塊都是30*30cm),某些方格亮著燈,玩家必須站到其它沒亮燈的方格 讓燈亮著,六個亮燈的方格可拼成正方體展開圖才可過關。

    謝謝:)

    ReplyDelete
    Replies
    1. > 超過10Kg以上
      呵呵,試試看不就知道了?
      超過10Kg以上,就會等同於10Kg的情況,仍然可以感測得到。
      至於太重會不會毀損感測器本身,那就是另一回事了。

      Delete
    2. 好的,謝謝葉老師:)

      Delete
  36. 請問一下如果arduino 讀取pressure sensor的值有點delay該怎麼解決呢?

    ReplyDelete
    Replies
    1. 去掉delay囉。
      你需要多快?
      程式碼?
      analogRead大約要花0.0001秒的時間。
      另外,壓力感測器與分壓電路的部份,也有其反應時間。

      Delete
    2. 好的 我試試看 謝謝你

      Delete
  37. 請問葉老師
    東西壓在上面會有累積電阻的狀況出現
    請問有方法適時地釋放電阻值嗎

    ReplyDelete
  38. 累積電阻的狀況?
    那是什麼?

    ReplyDelete
    Replies
    1. 簡單來說就是
      擺一個東西上去 會維持一下 但會微微的一直往上加 雖然很慢 但久了誤差很大

      Delete
    2. 哇,會這樣喔。
      抱歉,沒處理過這樣的問題。

      Delete
  39. 請問 這個能弄壓力到一個重量直接亮燈嗎? 壓力大概到8kg那裡

    ReplyDelete
    Replies
    1. 應該不用改電路吧? 改程式就可以解決了?

      Delete
    2. 目前已經可以讓他到一個值才亮 低於那個值都不亮 不知道怎麼調整他壓的重量 0~1023好像輕輕壓就1023了
      不知道是把1023往上調整就可以嗎? 有試過調整到4095 但是電路好像就錯亂了

      Delete
    3. Arduino的ADC是0到5V對應到0~1023,
      你要調整另一個電阻的值,找出適當的分壓比例。

      Delete
    4. !!!!! 在Arduino裡 是不是位元數只能讓它到1023 在高就溢位了 所以會亂 那只要調整壓力電組分壓的那顆電組就行嗎!?

      Delete
    5. > 溢位了
      不是。原因在於Arduino ADC解析度是10位元,呼叫AnalogRead只會得到0~1023的值。

      > 就行嗎!?
      yes,搜尋 分壓電路 voltage divider

      Delete
    6. 想了解一下 他是怎麼測得我施壓多少的 因為有施壓所以電組下降 然後他是放出5v的電壓 然後依電流得出我的壓力嗎?

      Delete
    7. > 怎麼測得我施壓多少的
      這要問製作感測器的公司。

      壓力感測器(Force-Sensitive Resistor),可想像是個電阻,根據施加的壓力,其電阻值會改變。

      加上另一個電阻,形成分壓電路,分壓由arduino偵測,得到0~1023的值,
      可回推出0~5V之間的某電壓值,
      再根據另一個電阻的電阻值,回算出壓力感測器當時的電阻值,
      再根據規格表,找出對應的壓力。

      Delete
    8. 對了 剛剛看到有人問說 ((壓了壓力感測器後 視窗上只顯示1023)) 是要加裝甚麼東西 還是數字顯示在哪呢?? ((我也是剛做這個的

      Delete
    9. 可輸出到序列埠監控視窗。
      加裝 七段顯示器。
      加裝 LCD。
      等等...

      Delete
    10. // 首先定義腳位
      #define led_pin 9
      #define led_pin 10
      #define fsr_pin A0

      void setup()
      {
      Serial.begin(115200);
      pinMode(led_pin, OUTPUT);
      }

      void loop()
      {
      int fsr_value = analogRead(fsr_pin); // 讀取FSR
      int led_value = map(fsr_value, 0, 1023, 0, 255); // 從0~1023映射到0~255
      if(led_value > 250){
      digitalWrite(led_pin 9, HIGH);
      }
      if(led_value < 249){
      digitalWrite(led_pin 9, LOW);
      }
      if(led_value > 200){
      digitalWrite(led_pin 10, HIGH);
      }
      if(led_value > 199){
      digitalWrite(led_pin 10, LOW);
      }

      }
      請問~
      我這樣編譯再他led_pin 10 跟led_pin 9 這裡有問題 好像不能這樣用 那要怎麼讓它多顆燈泡呢@@?

      Delete
    11. if(led_value > 250){
      digitalWrite(led_pin 9, HIGH);
      }
      if(led_value < 249){
      digitalWrite(led_pin 9, LOW);
      }
      if(led_value > 200){
      digitalWrite(led_pin 10, HIGH);
      }
      if(led_value > 199){
      digitalWrite(led_pin 10, LOW);
      應該是這裡有問題

      Delete
    12. > #define led_pin 9
      > #define led_pin 10
      這樣當然不行。

      改成
      #define led_pin_a 9
      #define led_pin_b 10
      之類的...
      程式其他部分也要修改。

      Delete
    13. > 250 249 200 199
      什麼邏輯?

      Delete
    14. 一顆燈大於250時會亮 小於249的時候不會亮 哈哈

      Delete
    15. 那是臨時弄出來的
      // 首先定義腳位
      #define led_pin_a 9
      #define led_pin_b 10
      #define led_pin_c 11
      #define fsr_pin A0

      void setup()
      {
      Serial.begin(115200);
      pinMode(led_pin_a, OUTPUT);
      pinMode(led_pin_b, OUTPUT);
      pinMode(led_pin_c, OUTPUT);
      }

      void loop()
      {
      int fsr_value = analogRead(fsr_pin); // 讀取FSR
      int led_value = map(fsr_value, 0, 1023, 0, 255); // 從0~1023映射到0~255
      if(led_value > 150){
      digitalWrite(led_pin_a, HIGH);
      }
      if(led_value > 130,led_value < 149){
      digitalWrite(led_pin_b, HIGH);
      }
      if(led_value > 100,led_value < 129){
      digitalWrite(led_pin_c, HIGH);
      }



      }

      最終版成功了 謝謝葉老師~

      Delete
    16. 這....
      之後下面改成這樣
      if(led_value > 150){
      digitalWrite(led_pin_a, HIGH);
      }
      else digitalWrite(led_pin_a, LOW);

      if(led_value > 130,led_value < 149){
      digitalWrite(led_pin_b, HIGH);
      }
      else digitalWrite(led_pin_b, LOW);
      if(led_value > 100,led_value < 129){
      digitalWrite(led_pin_c, HIGH);
      }
      else digitalWrite(led_pin_c, LOW);
      }
      動作是沒錯 正常 但是不壓的時候 b跟c會亮著 是我忽視了哪裡嗎?

      Delete
    17. 我後來再elae後面的式子都加了{} 現在沒問題了

      Delete
    18. c語言的問題。
      led_value > 130,led_value < 149 這種條件判斷應該跟你要的不一樣,
      找本書查查吧。

      Delete
    19. 這樣是可以的 他只會在130~149中間才會亮
      那時候好像是因為 else digitalWrite(led_pin_b, LOW); 這個
      要這樣 else {digitalWrite(led_pin_b, LOW);} 少了大括號就怪怪的 雖然編譯是成功

      Delete
    20. led_value > 130,led_value < 149,
      其中led_value > 130無作用。

      Delete
    21. 應該是有的吧 不然的話從一開始就會亮了 因為一開始就小於149拉 可是沒有 他是在中間130~149中間亮的

      Delete
    22. 應該寫成led_value > 130 && led_value < 149

      Delete
  40. This comment has been removed by the author.

    ReplyDelete
  41. 因為我的專題有一部分需要用到 但我對這方面沒概念 所以想請問如果第一次壓過感測器led亮起 再壓第二次led熄滅 請問程式碼要怎麼改

    ReplyDelete
    Replies
    1. 用全域變數,假設是int state = LOW; 一開始是LOW,熄滅LED;
      偵測到壓過感測器時,從LOW變成HIGH,點亮LED,
      之後,每次偵測到壓過感測器時,變更狀態,HIGH變LOW,LOW變HIGH,
      根據其狀態,更新LED的亮滅。

      Delete
  42. 您好,
    我接了兩個感測器,但輸出是同一顆LED燈,為什麼按壓第二個感測器時,輸出給LED的電壓明顯降低呢? 該如何解決? 謝謝您

    ReplyDelete
  43. 您好,

    不好意思,我在敘述清楚一些,按照您的接法我接了兩個感測器A0及A1,輸出是7顆LED燈,如果按越大力燈數會亮的越多,按壓第一個感測器沒有問題,但是按壓第二個感測器LED明顯較不亮,量測輸出電壓也從2.3V掉到0.4V,請問是因為我寫在同一個loop的關係嗎?

    int flexPin1 = 0;
    int flexPin2 = 1;


    void setup()
    {


    for (int i=1; i<12; i++)
    {
    pinMode(i, OUTPUT);
    }
    }

    void loop(){




    for (int i=1; i<12; i++)
    {
    digitalWrite(i, LOW);
    }



    int flexReading1 = map(analogRead(flexPin1), 0, 550, 2, 10);

    for(int j=0;j<flexReading1;j++)
    {
    digitalWrite(j,HIGH);

    }

    //---------------------------------------------------------------------------
    int flexReading2 = map(analogRead(flexPin2), 0, 300, 2, 4);

    for(int j=0;j<flexReading2;j++)
    {
    digitalWrite(j,HIGH);

    }



    }

    void blink(int LEDPin, int onTime, int offTime){

    digitalWrite(LEDPin, HIGH);


    delay(onTime);


    digitalWrite(LEDPin, LOW);


    delay(offTime);
    }

    ReplyDelete
    Replies
    1. 根據你的程式,按壓第一或第二個感測器,按壓力道會決定要點亮幾個LED,但跟亮度應該沒關係。

      Delete
  44. 是的,但按壓第二個感測器,輸出的LED確實較暗

    ReplyDelete
    Replies
    1. 把第一個感測器的硬體線路拔掉,相關程式也刪掉,試試看囉。

      Delete
  45. 為何加了delay之後輸出電壓會變大呢?

    ReplyDelete
  46. 將第一個電路拔除(程式沒動),第二個感測器的LED就變亮了,是因為電路接再一起的關係嗎? A0跟A1有互通?

    ReplyDelete
    Replies
    1. 你的電路圖?

      Delete
    2. 雖然不知道原因,但我後來在void loop 的最後加上delay(5)解決了,delay(X)<=X的大小會影響輸出電壓,但我不知道為什麼??

      Delete
    3. 大概是因為loop裡有digitalWrite(i, LOW); 會拉低電壓。

      第一個感測器 是 程式裡的 flexReading1 嗎?

      Delete
    4. 是,那這樣有其他的寫法能改善嗎?

      Delete
    5. 有。

      > 是因為電路接再一起的關係嗎?
      你的電路圖?

      Delete
  47. 葉老師

    請問如果我想將壓力分成24顆led亮的顆數,力量越大led亮得越多,這樣可以利用串聯74HC595做嗎? 可以教我怎麼做嗎? 謝謝!

    ReplyDelete
    Replies
    1. > 74HC595
      可以。

      > 怎麼做嗎?
      不行。

      Delete
  48. 您好~想詢問該如何校正此類型的壓力感測器呢?

    ReplyDelete
  49. 您好~ 想請問一下這款壓力感測器使用arduino監控視窗所測到的數值應該如何換算成公克呢?

    ReplyDelete
  50. 您好請問一下,我想要再押最大力的時候讓LED閃爍該怎麼寫呢?

    ReplyDelete
  51. This comment has been removed by the author.

    ReplyDelete
  52. 葉老師你好
    想請問,如果用本篇程式,可以依據不同力量亮不同LED燈嗎?
    或者因壓力的關係導致LED燈閃爍

    ReplyDelete
  53. Anonymous25/7/22 13:53

    葉老師你好
    想問壓力感應可以接上12V的LED燈帶嗎?

    ReplyDelete
  54. Anonymous28/2/24 11:56

    可以用esp32嗎?

    ReplyDelete