用Arduino多功能擴展板,LM35溫度傳感器模塊測量溫度,不需外接線,將LM35模塊有字面向前(數碼管方向),三個腳按順序插入圖中三個插孔中。
Arduino源程序如下:
- // LM35溫度傳感器 + 4位數碼管顯示(74HC595驅動)
- // 引腳定義
- #define LM35_PIN A4 // LM35連接到模擬引腳A4
- int latchPin = 4; // 74HC595鎖存引腳
- int clockPin = 7; // 74HC595時鐘引腳
- int dataPin = 8; // 74HC595數據引腳
- // 數碼管段選表(0-9,共陰數碼管)
- // 格式:dp,g,f,e,d,c,b,a
- unsigned char segTable[] = {
- 0xC0, // 0: 1100 0000
- 0xF9, // 1: 1111 1001
- 0xA4, // 2: 1010 0100
- 0xB0, // 3: 1011 0000
- 0x99, // 4: 1001 1001
- 0x92, // 5: 1001 0010
- 0x82, // 6: 1000 0010
- 0xF8, // 7: 1111 1000
- 0x80, // 8: 1000 0000
- 0x90, // 9: 1001 0000
- 0xFF // 空白顯示
- };
- // 數碼管位選表(4位共陰數碼管)
- // 每個位選碼選中一位數碼管(低電平有效)
- unsigned char digitSelect[] = {
- 0xF1, // 1111 0001 - 選中第1位(最左邊)
- 0xF2, // 1111 0010 - 選中第2位
- 0xF4, // 1111 0100 - 選中第3位
- 0xF8 // 1111 1000 - 選中第4位(最右邊)
- };
- // 顯示緩沖區
- unsigned char displayBuffer[] = {0, 0, 0, 0};
- // 溫度變量
- float temperature = 0.0;
- // 時間變量
- unsigned long lastTempRead = 0;
- const unsigned long tempReadInterval = 1000; // 1秒讀取一次溫度
- void setup() {
- Serial.begin(9600); // 初始化串口
-
- // 設置74HC595引腳為輸出
- pinMode(latchPin, OUTPUT);
- pinMode(clockPin, OUTPUT);
- pinMode(dataPin, OUTPUT);
-
- // 設置LM35引腳為輸入
- pinMode(LM35_PIN, INPUT);
-
- // 初始顯示"----"
- for (int i = 0; i < 4; i++) {
- displayBuffer[i] = 10; // 10對應空白
- }
-
- Serial.println("LM35溫度傳感器 - 4位數碼管顯示");
- Serial.println("初始化完成...");
- }
- // 讀取LM35溫度
- float readLM35Temperature() {
- // 讀取模擬值
- int sensorValue = analogRead(LM35_PIN);
-
- // 轉換為電壓(假設參考電壓為5V)
- float voltage = sensorValue * (5.0 / 1023.0);
-
- // LM35每10mV對應1°C,所以電壓*100得到溫度
- float temp = voltage * 100.0;
-
- return temp;
- }
- // 更新顯示緩沖區
- void updateDisplayBuffer(float temp) {
- // 確保溫度在合理范圍內
- if (temp < 0) temp = 0;
- if (temp > 99.9) temp = 99.9;
-
- // 將溫度值乘以10轉換為整數,便于分離各位數字
- int tempInt = (int)(temp * 10);
-
- // 分離各位數字
- int tens = tempInt / 100; // 十位
- int ones = (tempInt % 100) / 10; // 個位
- int tenths = tempInt % 10; // 十分位
-
- // 更新顯示緩沖區
- if (tens == 0) {
- displayBuffer[0] = 10; // 十位為0時顯示空白
- } else {
- displayBuffer[0] = tens; // 顯示十位
- }
-
- displayBuffer[1] = ones; // 顯示個位(帶小數點)
- displayBuffer[2] = tenths; // 顯示十分位
-
- // 第4位顯示"C"表示攝氏度(這里用8表示,但實際會特殊處理)
- displayBuffer[3] = 12; // 特殊值,在顯示函數中會轉換為"C"
- }
- // 數碼管顯示函數
- void displayDigits() {
- // 循環顯示4位數碼管
- for (int i = 0; i < 4; i++) {
- digitalWrite(latchPin, LOW); // 準備發送數據
-
- // 獲取當前位的段選碼
- unsigned char segCode;
-
- if (i == 3) {
- // 第4位顯示攝氏度符號"C"(段碼:1100 0110 = 0xC6)
- segCode = 0xC6;
- } else {
- segCode = segTable[displayBuffer[i]];
-
- // 如果是第1位(個位),添加小數點
- if (i == 1 && displayBuffer[i] != 10) {
- segCode &= 0x7F; // 清除最高位(dp位),使其顯示小數點
- }
- }
-
- // 發送段選數據
- shiftOut(dataPin, clockPin, MSBFIRST, segCode);
-
- // 發送位選數據
- shiftOut(dataPin, clockPin, MSBFIRST, digitSelect[i]);
-
- digitalWrite(latchPin, HIGH); // 鎖存數據,更新顯示
-
- // 短暫延時,實現動態掃描
- delay(1);
- }
- }
- void loop() {
- unsigned long currentMillis = millis();
-
- // 定期讀取溫度
- if (currentMillis - lastTempRead >= tempReadInterval) {
- lastTempRead = currentMillis;
-
- // 讀取溫度
- temperature = readLM35Temperature();
-
- // 更新顯示緩沖區
- updateDisplayBuffer(temperature);
-
- // 串口輸出
- Serial.print("溫度: ");
- Serial.print(temperature, 1); // 顯示1位小數
- Serial.println(" °C");
- }
-
- // 持續刷新數碼管顯示
- // 每50ms刷新20次,確保穩定顯示
- static unsigned long lastDisplayTime = 0;
- if (currentMillis - lastDisplayTime >= 50) {
- lastDisplayTime = currentMillis;
-
- // 顯示20次(約40ms)
- for (int i = 0; i < 20; i++) {
- displayDigits();
- }
- }
- }
- /*
- 硬件連接說明:
- 1. LM35連接:
- VCC -> Arduino 5V
- OUT -> Arduino A4
- GND -> Arduino GND
- 2. 74HC595連接(兩個芯片級聯):
- 第一個74HC595(控制段選):
- DS (14腳) -> Arduino 8
- SH_CP (11腳) -> Arduino 7
- ST_CP (12腳) -> Arduino 4
- MR (10腳) -> VCC
- OE (13腳) -> GND
- Q0-Q7 -> 數碼管段選引腳(a,b,c,d,e,f,g,dp)
- 第二個74HC595(控制位選):
- DS (14腳) -> 第一個74HC595的Q7' (9腳)
- SH_CP (11腳) -> Arduino 7(與第一個共用)
- ST_CP (12腳) -> Arduino 4(與第一個共用)
- MR (10腳) -> VCC
- OE (13腳) -> GND
- Q0-Q3 -> 數碼管位選引腳(COM1-COM4)
- 3. 4位共陰數碼管:
- 段選引腳(a-g,dp) -> 第一個74HC595的Q0-Q7
- 公共陰極(COM1-COM4) -> 第二個74HC595的Q0-Q3
- 注意:
- 1. 段選引腳需要串聯220Ω限流電阻
- 2. 確保74HC595的VCC(16腳)接5V,GND(8腳)接GND
- 3. 數碼管是共陰極,所以位選低電平時該位數碼管被選中
- 顯示格式:
- 第1位:十位溫度(如果為0則顯示空白)
- 第2位:個位溫度(帶小數點)
- 第3位:十分位溫度
- 第4位:攝氏度符號"C"
- 示例:25.6°C 顯示為 "25.6C"
- */
- // 如果需要顯示負溫度,可以使用以下擴展代碼:
- /*
- // 在segTable數組中添加負號
- unsigned char segTable[] = {
- // ... 原有的0-9和空白
- 0xBF, // 負號 (-): 1011 1111
- };
- // 修改updateDisplayBuffer函數:
- void updateDisplayBuffer(float temp) {
- if (temp < 0) {
- // 顯示負號
- temp = -temp;
- if (temp > 99.9) temp = 99.9;
-
- int tempInt = (int)(temp * 10);
- int ones = (tempInt % 100) / 10;
- int tenths = tempInt % 10;
-
- displayBuffer[0] = 11; // 負號
- displayBuffer[1] = ones;
- displayBuffer[2] = tenths;
- displayBuffer[3] = 12; // "C"
- } else {
- // 正溫度顯示邏輯(保持不變)
- if (temp > 99.9) temp = 99.9;
-
- int tempInt = (int)(temp * 10);
- int tens = tempInt / 100;
- int ones = (tempInt % 100) / 10;
- int tenths = tempInt % 10;
-
- if (tens == 0) {
- displayBuffer[0] = 10; // 空白
- } else {
- displayBuffer[0] = tens;
- }
-
- displayBuffer[1] = ones;
- displayBuffer[2] = tenths;
- displayBuffer[3] = 12; // "C"
- }
- }
- */
復制代碼
|