作者rrr518 (廢文族の理沙)
看板ASM
標題[問題] 74CH595 搭配 DS18B20水溫感測器的問題
時間Tue Jun 5 17:32:40 2018
我買的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.1528191163.A.51E.html
※ 編輯: rrr518 (140.121.71.185), 06/05/2018 17:44:32
1F:→ cs8425: 測一下OneWire大概要跑多久 自己規劃7段顯示的刷新頻率 06/05 18:17
2F:→ cs8425: 把執行時間錯開 不要直接丟loop硬跑 06/05 18:17
我用了timer 效果好像還是...
有別的錯開時間的方法嗎?
3F:→ rrr518: 我用了thread也沒辦法... 06/05 22:32
4F:→ cs8425: 因為是視覺暫留 亮度跟輸出的時間有關 06/06 00:08
5F:→ cs8425: 亮度要一樣 >> 輸出時間要一樣 06/06 00:08
6F:→ cs8425: >> 兩個latchPin High之間的時間要維持一樣 06/06 00:09
7F:→ cs8425: micros() 、millis() 這兩個函數請善用 06/06 00:10
8F:→ rrr518: 我研究看看 謝謝你! 06/06 01:17
9F:→ xexexptt: 因為前3位數亮的時間只有到下一位數shift完成 06/06 15:42
10F:→ xexexptt: 而最後一位數亮的時間包含讀sensor以及計算的時間 06/06 15:43
11F:→ xexexptt: 因此會最亮 06/06 15:43
12F:→ xexexptt: 你可在每位數shift完之後加一個小小delay 06/06 15:44
13F:→ xexexptt: 最後一位顯示完delay之後把顯示關掉,這樣亮度就會一致 06/06 15:46
我有試過加上小delay
但是效果不是很好
他會變成肉眼就看得見的每個數字獨立顯示ˊ ˋ
14F:推 nissptt: 爺,你要不要試試TM1637這種?還能當時鐘! 不必考慮掃描 06/06 17:50
15F:→ nissptt: ,讓cpu閒閒沒事做最爽啦!而且只要兩隻腳,含LED整個模 06/06 17:50
16F:→ nissptt: 組30元上下就有。 06/06 17:50
!!
這個感覺很棒!
17F:→ dsplab: Arduino最大缺點就是沒法精確控制時間 06/06 19:15
真的QQ
18F:→ cs8425: 樓上 不是不能精確 而是精度有限 10^-6秒差不多是極限 06/08 17:41
19F:→ art1: 七段顯示器最後一位數很亮的原因可能是更新太頻繁了 06/09 16:00
20F:推 art1: 不懂為什麼三個七段顯示器用LED[],一個用LED_P[] 06/09 16:32
因為我讀取的溫度在第二位會有小數點
LED_P是有小數點的數字
21F:推 art1: 也看不懂為什麼要送出兩次資料,如果第二次的資料是關於不同 06/09 16:46
22F:→ art1: 的七段顯示器,那怎麼沒有控制七段顯示器開啟或關閉的程式碼 06/09 16:47
23F:→ art1: 視覺暫留的效果是靠著每次只顯示一個七段顯示器來達成的 06/09 16:48
24F:→ art1: 因此一個開,其他三個就要關 06/09 16:49
25F:推 art1: 好像看懂了,第二筆資料就是用來控制comPin的,一次亮一個 06/09 17:10
對
這個我其實不太懂原理
跟我上網查資料的說法不太一樣QQ
※ 編輯: rrr518 (140.121.71.185), 06/11/2018 19:14:04
26F:推 nissptt: 換TM1637吧!四位數只要兩條線,也不必管掃描,這樣cpu才 06/12 20:10
27F:→ nissptt: 能做各種事情,任意添加新功能啊。 06/12 20:10
28F:→ rrr518: 這個我真的覺得很棒!!XDDD 06/13 16:47