ASM 板


LINE

看板 ASM  RSS
自問自答一下好了 我現在用的方法是 DS18B20 在它本身更新到3.8版本之後 本身內建的延遲讀取時間 因為 request這個動作本身會用到0.75秒(我自己實測是0.779秒) 所以他們用 if (millis() - lastTempRequest >= delayInMillis) { sensors.requestTemperatures(); resolution++; if (resolution > 12 ) resolution = 9; sensors.setResolution(tempDeviceAddress, resolution); sensors.requestTemperatures(); delayInMillis = 779 / (1 << (12 - resolution)); lastTempRequest = millis(); } 這個方法來讓讀取時間分散(? 讀取的效果好很多 只是因為74CH595的關係它會一直閃 不影響閱讀數值但是看久了不太舒服 所以我還有加上thread來讓它頻率不那麼高 給有一樣問題的參考看看 當然我還是覺得有很多改進的空間!! XDDDDD 想到怎麼更進一步的板友希望可以跟我說 >///< ※ 引述《rrr518 (廢文族の理沙)》之銘言: : 我買的LED數字顯示是用兩片74CH595 : 總共可以顯示4個數字 : http://i.imgur.com/xp5mHZk.jpg
: http://i.imgur.com/QHgEZzB.jpg
: 爬了一下文發現是用視覺暫留的方法輪流顯示數字 : 現在我要搭配DS18B20水溫感測器 : 我發現幾個問題 : 1. 取DS18B20感測器溫度時用的sensors.requestTemperatures(); : 似乎會讓程式停頓一下 : 變成前面三位數字很快閃過 : 只剩下最後一個數字一直亮著 : 2. 前三個數字變得暗暗的 : 最後一個數字很明亮 : http://i.imgur.com/SmBddP1.jpg
: 想知道是我哪邊寫不對嗎? : 能不能改善這兩個情況 : 謝謝 : 程式碼: : #include <OneWire.h> : #include <DallasTemperature.h> : #define ONE_WIRE_BUS 3 : OneWire oneWire(ONE_WIRE_BUS); : DallasTemperature sensors(&oneWire); : const byte dataPin = 7; // 74HC595 序列腳接「數位 7」 //DIO : const byte latchPin = 6; // 74HC595 暫存器時脈腳接「數位 6」//RCK : const byte clockPin = 5; // 74HC595 序列時脈腳接「數位 5」//SCK : int index = 0; // 七段顯示器的數字索引 : int temp; : int first = 0; : int second = 0; : int third = 0; : int fourth = 0; : const byte LED[10] = { // 記錄0~9的七段數字 : B00111111, : B00000110, : B01011011, : B01001111, : B01100110, : B01101101, : B01111101, : B00100111, : B01111111, : B01101111, : }; : const byte LED_P[10] = { // 記錄0~9的七段數字 : B10111111, : B10000110, : B11011011, : B11001111, : B11100110, : B11101101, : B11111101, : B10100111, : B11111111, : B11101111, : }; : void setup() { : // put your setup code here, to run once: : Serial.begin(115200); : Serial.println("Temperature Sensor"); : // 初始化 : sensors.begin(); : pinMode(latchPin, OUTPUT); : pinMode(clockPin, OUTPUT); : pinMode(dataPin, OUTPUT); : } : void loop() { : sensors.requestTemperatures(); : temp = sensors.getTempCByIndex(0) * 100; : fourth = temp % 10; : temp = temp / 10; : third = temp % 10; : temp = temp / 10; : second = temp % 10; : temp = temp / 10; : first = temp % 10; : digitalWrite(latchPin, LOW); : shiftOut(dataPin, clockPin, MSBFIRST, LED[first]); : shiftOut(dataPin, clockPin, MSBFIRST, 0xFE); : digitalWrite(latchPin, HIGH); : digitalWrite(latchPin, LOW); : shiftOut(dataPin, clockPin, MSBFIRST, LED_P[second]); : shiftOut(dataPin, clockPin, MSBFIRST, 0xFD); : digitalWrite(latchPin, HIGH); : digitalWrite(latchPin, LOW); : shiftOut(dataPin, clockPin, MSBFIRST, LED[third]); : shiftOut(dataPin, clockPin, MSBFIRST, 0xFB); : digitalWrite(latchPin, HIGH); : digitalWrite(latchPin, LOW); : shiftOut(dataPin, clockPin, MSBFIRST, LED[fourth]); : shiftOut(dataPin, clockPin, MSBFIRST, 0xF7); : digitalWrite(latchPin, HIGH); : } --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.121.71.185
※ 文章網址: https://webptt.com/m.aspx?n=bbs/ASM/M.1528350710.A.DB6.html
1F:→ cs8425: 實在不懂你為啥用會用到thread? MCU不跑RTOS用不到啊 06/08 17:39
2F:→ cs8425: 會閃代表你更新頻率不夠高 或是有jitter造成更新不夠即時 06/08 17:39
3F:→ rrr518: 因為讀取時間會卡到的關係呀 06/09 01:35
4F:推 art1: 看不出設定溫度解析度跟讀取時間有什麼關係 06/09 15:19
5F:推 art1: 從這裡的程式碼可以看出讀取溫度用不到 0.75 秒 06/09 15:50
這是這支sensor他讀取的動作就是需要0.75秒 所以他們更新後才會有新的分散讀取時間的動作 補充一下 光看程式碼我也不覺得讀取時間會用到0.75秒 但是實際執行後 sensors.requestTemperatures(); 這行程式碼就是會用到超過0.75秒 我個人是0.779秒 這個是sensor的問題 換成其他的sensor不太會有這個問題 這個要自己買了這支sensor來玩才會發現 網路上也有其他人有這個問題 不是只有我唷
6F:→ art1: 因為呼叫了兩次讀取溫度的函式,1.5秒的時間都無法更新七段 06/09 15:51
7F:→ art1: 顯示器,根本就不可能達成輪流顯示的效果 06/09 15:51
8F:推 art1: 應該說不可能達成視覺暫留的效果 06/09 15:55
9F:→ art1: 這段程式碼是在不斷重新設定讀取的解析度,同時延遲時間會跟 06/09 15:57
10F:→ art1: 著解析度的不同而有所變化 06/09 15:58
11F:→ art1: 就因為多了這段延遲時間,所以七段顯示器才會很閃 06/09 15:59
12F:→ art1: 因為導致更新頻率不夠多,視覺暫留的效果就變差了 06/09 15:59
是的
13F:→ cs8425: 樓上 他code只貼一半 關鍵的setWaitForConversion(false) 06/09 16:37
14F:→ cs8425: 沒貼到 我也是翻過函式庫才知道 06/09 16:37
15F:→ cs8425: requestTemperatures()跟getTempCByIndex()大概也放錯位置 06/09 16:39
16F:→ cs8425: 不懂thread原理亂用又不附上完整code 這個我實在無法幫 06/09 16:41
完整程式碼在這裡 #include <OneWire.h> #include <DallasTemperature.h> #include <Timer.h> #include <Thread.h> #include <ThreadController.h> #define ONE_WIRE_BUS 3 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress tempDeviceAddress; const byte dataPin = 7; // 74HC595 序列腳接「數位 7」 //DIO const byte latchPin = 6; // 74HC595 暫存器時脈腳接「數位 6」//RCK const byte clockPin = 5; // 74HC595 序列時脈腳接「數位 5」//SCK int index = 0; // 七段顯示器的數字索引 int temp; int first = 0; int second = 0; int third = 0; int fourth = 0; int resolution = 12; unsigned long lastTempRequest = 0; int delayInMillis = 0; Thread myThread = Thread(); const byte LED[10] = { // 記錄0~9的七段數字 B00111111, B00000110, B01011011, B01001111, B01100110, B01101101, B01111101, B00100111, B01111111, B01101111, }; const byte LED_P[10] = { // 記錄0~9的七段數字 B10111111, B10000110, B11011011, B11001111, B11100110, B11101101, B11111101, B10100111, B11111111, B11101111, }; void setup() { // put your setup code here, to run once: Serial.begin(115200); //Serial.println("Temperature Sensor"); // 初始化 sensors.begin(); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); myThread.onRun(getTemp); myThread.setInterval(2500); sensors.getAddress(tempDeviceAddress, 0); sensors.setResolution(tempDeviceAddress, resolution); sensors.setWaitForConversion(false); sensors.requestTemperatures(); delayInMillis = 779 / (1 << (12 - resolution)); lastTempRequest = millis(); temp = sensors.getTempCByIndex(0) * 100; fourth = temp % 10; temp = temp / 10; third = temp % 10; temp = temp / 10; second = temp % 10; temp = temp / 10; first = temp % 10; } void loop() { if(myThread.shouldRun()) myThread.run(); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, LED[fourth]); shiftOut(dataPin, clockPin, MSBFIRST, 0xF7); digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, LED[third]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFB); digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, LED_P[second]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFD); digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, LED[first]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFE); digitalWrite(latchPin, HIGH); } void getTemp(){ if (millis() - lastTempRequest >= delayInMillis) { sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0) * 100; fourth = temp % 10; temp = temp / 10; third = temp % 10; temp = temp / 10; second = temp % 10; temp = temp / 10; first = temp % 10; resolution++; if (resolution > 12 ) resolution = 9; sensors.setResolution(tempDeviceAddress, resolution); sensors.requestTemperatures(); delayInMillis = 779 / (1 << (12 - resolution)); lastTempRequest = millis(); } }
17F:推 disap: 另一種方法是到request裡去看他到底在搞什麼 收幾個位元資 06/17 10:33
18F:→ disap: 料要花那麼久是不可能的 多半只是用迴圈詢問sensor上某個旗 06/17 10:33
19F:→ disap: 標 把那些api找出來 放到你自己的迴圈去實現就可以 06/17 10:33
好的 我試試看~ 謝謝~~
20F:推 art1: 其實0.75秒應該是等待感應器回傳資料的時間 06/17 11:04
21F:→ art1: 而不同的精度需要的時間不一樣,才有他貼的那一段延遲函式 06/17 11:04
22F:→ art1: 最簡單的作法是把延遲時間的部分換成 for 迴圈,裡面跑顯示 06/17 11:07
23F:→ art1: 資料的程式碼,這樣在等待的同時也能保持視覺暫留效果 06/17 11:07
感謝 >//< ※ 編輯: rrr518 (140.121.71.185), 06/18/2018 17:49:16







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP