[問題] 74CH595 搭配 DS18B20水溫感測器的問題

看板ASM (組合語言)作者 (廢文族の理沙)時間6年前 (2018/06/05 17:32), 6年前編輯推噓5(5023)
留言28則, 6人參與, 6年前最新討論串1/3 (看更多)
我買的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://www.ptt.cc/bbs/ASM/M.1528191163.A.51E.html ※ 編輯: rrr518 (140.121.71.185), 06/05/2018 17:44:32

06/05 18:17, 6年前 , 1F
測一下OneWire大概要跑多久 自己規劃7段顯示的刷新頻率
06/05 18:17, 1F

06/05 18:17, 6年前 , 2F
把執行時間錯開 不要直接丟loop硬跑
06/05 18:17, 2F
我用了timer 效果好像還是... 有別的錯開時間的方法嗎?

06/05 22:32, 6年前 , 3F
我用了thread也沒辦法...
06/05 22:32, 3F

06/06 00:08, 6年前 , 4F
因為是視覺暫留 亮度跟輸出的時間有關
06/06 00:08, 4F

06/06 00:08, 6年前 , 5F
亮度要一樣 >> 輸出時間要一樣
06/06 00:08, 5F

06/06 00:09, 6年前 , 6F
>> 兩個latchPin High之間的時間要維持一樣
06/06 00:09, 6F

06/06 00:10, 6年前 , 7F
micros() 、millis() 這兩個函數請善用
06/06 00:10, 7F

06/06 01:17, 6年前 , 8F
我研究看看 謝謝你!
06/06 01:17, 8F

06/06 15:42, 6年前 , 9F
因為前3位數亮的時間只有到下一位數shift完成
06/06 15:42, 9F

06/06 15:43, 6年前 , 10F
而最後一位數亮的時間包含讀sensor以及計算的時間
06/06 15:43, 10F

06/06 15:43, 6年前 , 11F
因此會最亮
06/06 15:43, 11F

06/06 15:44, 6年前 , 12F
你可在每位數shift完之後加一個小小delay
06/06 15:44, 12F

06/06 15:46, 6年前 , 13F
最後一位顯示完delay之後把顯示關掉,這樣亮度就會一致
06/06 15:46, 13F
我有試過加上小delay 但是效果不是很好 他會變成肉眼就看得見的每個數字獨立顯示ˊ ˋ

06/06 17:50, 6年前 , 14F
爺,你要不要試試TM1637這種?還能當時鐘! 不必考慮掃描
06/06 17:50, 14F

06/06 17:50, 6年前 , 15F
,讓cpu閒閒沒事做最爽啦!而且只要兩隻腳,含LED整個模
06/06 17:50, 15F

06/06 17:50, 6年前 , 16F
組30元上下就有。
06/06 17:50, 16F
!! 這個感覺很棒!

06/06 19:15, 6年前 , 17F
Arduino最大缺點就是沒法精確控制時間
06/06 19:15, 17F
真的QQ

06/08 17:41, 6年前 , 18F
樓上 不是不能精確 而是精度有限 10^-6秒差不多是極限
06/08 17:41, 18F

06/09 16:00, 6年前 , 19F
七段顯示器最後一位數很亮的原因可能是更新太頻繁了
06/09 16:00, 19F

06/09 16:32, 6年前 , 20F
不懂為什麼三個七段顯示器用LED[],一個用LED_P[]
06/09 16:32, 20F
因為我讀取的溫度在第二位會有小數點 LED_P是有小數點的數字

06/09 16:46, 6年前 , 21F
也看不懂為什麼要送出兩次資料,如果第二次的資料是關於不同
06/09 16:46, 21F

06/09 16:47, 6年前 , 22F
的七段顯示器,那怎麼沒有控制七段顯示器開啟或關閉的程式碼
06/09 16:47, 22F

06/09 16:48, 6年前 , 23F
視覺暫留的效果是靠著每次只顯示一個七段顯示器來達成的
06/09 16:48, 23F

06/09 16:49, 6年前 , 24F
因此一個開,其他三個就要關
06/09 16:49, 24F

06/09 17:10, 6年前 , 25F
好像看懂了,第二筆資料就是用來控制comPin的,一次亮一個
06/09 17:10, 25F
對 這個我其實不太懂原理 跟我上網查資料的說法不太一樣QQ ※ 編輯: rrr518 (140.121.71.185), 06/11/2018 19:14:04

06/12 20:10, 6年前 , 26F
換TM1637吧!四位數只要兩條線,也不必管掃描,這樣cpu才
06/12 20:10, 26F

06/12 20:10, 6年前 , 27F
能做各種事情,任意添加新功能啊。
06/12 20:10, 27F

06/13 16:47, 6年前 , 28F
這個我真的覺得很棒!!XDDD
06/13 16:47, 28F
文章代碼(AID): #1R5bYxKU (ASM)
文章代碼(AID): #1R5bYxKU (ASM)