亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 875|回復: 0
收起左側

Arduino LM35測量溫度

[復制鏈接]
ID:1162851 發表于 2026-1-14 20:46 | 顯示全部樓層 |閱讀模式
用Arduino多功能擴展板,LM35溫度傳感器模塊測量溫度,不需外接線,將LM35模塊有字面向前(數碼管方向),三個腳按順序插入圖中三個插孔中。

LM35.jpg

Arduino源程序如下:
  1. // LM35溫度傳感器 + 4位數碼管顯示(74HC595驅動)

  2. // 引腳定義
  3. #define LM35_PIN A4          // LM35連接到模擬引腳A4
  4. int latchPin = 4;           // 74HC595鎖存引腳
  5. int clockPin = 7;           // 74HC595時鐘引腳
  6. int dataPin = 8;            // 74HC595數據引腳

  7. // 數碼管段選表(0-9,共陰數碼管)
  8. // 格式:dp,g,f,e,d,c,b,a
  9. unsigned char segTable[] = {
  10.   0xC0, // 0: 1100 0000
  11.   0xF9, // 1: 1111 1001
  12.   0xA4, // 2: 1010 0100
  13.   0xB0, // 3: 1011 0000
  14.   0x99, // 4: 1001 1001
  15.   0x92, // 5: 1001 0010
  16.   0x82, // 6: 1000 0010
  17.   0xF8, // 7: 1111 1000
  18.   0x80, // 8: 1000 0000
  19.   0x90, // 9: 1001 0000
  20.   0xFF  // 空白顯示
  21. };

  22. // 數碼管位選表(4位共陰數碼管)
  23. // 每個位選碼選中一位數碼管(低電平有效)
  24. unsigned char digitSelect[] = {
  25.   0xF1, // 1111 0001 - 選中第1位(最左邊)
  26.   0xF2, // 1111 0010 - 選中第2位
  27.   0xF4, // 1111 0100 - 選中第3位
  28.   0xF8  // 1111 1000 - 選中第4位(最右邊)
  29. };

  30. // 顯示緩沖區
  31. unsigned char displayBuffer[] = {0, 0, 0, 0};

  32. // 溫度變量
  33. float temperature = 0.0;

  34. // 時間變量
  35. unsigned long lastTempRead = 0;
  36. const unsigned long tempReadInterval = 1000; // 1秒讀取一次溫度

  37. void setup() {
  38.   Serial.begin(9600);       // 初始化串口
  39.   
  40.   // 設置74HC595引腳為輸出
  41.   pinMode(latchPin, OUTPUT);
  42.   pinMode(clockPin, OUTPUT);
  43.   pinMode(dataPin, OUTPUT);
  44.   
  45.   // 設置LM35引腳為輸入
  46.   pinMode(LM35_PIN, INPUT);
  47.   
  48.   // 初始顯示"----"
  49.   for (int i = 0; i < 4; i++) {
  50.     displayBuffer[i] = 10; // 10對應空白
  51.   }
  52.   
  53.   Serial.println("LM35溫度傳感器 - 4位數碼管顯示");
  54.   Serial.println("初始化完成...");
  55. }

  56. // 讀取LM35溫度
  57. float readLM35Temperature() {
  58.   // 讀取模擬值
  59.   int sensorValue = analogRead(LM35_PIN);
  60.   
  61.   // 轉換為電壓(假設參考電壓為5V)
  62.   float voltage = sensorValue * (5.0 / 1023.0);
  63.   
  64.   // LM35每10mV對應1°C,所以電壓*100得到溫度
  65.   float temp = voltage * 100.0;
  66.   
  67.   return temp;
  68. }

  69. // 更新顯示緩沖區
  70. void updateDisplayBuffer(float temp) {
  71.   // 確保溫度在合理范圍內
  72.   if (temp < 0) temp = 0;
  73.   if (temp > 99.9) temp = 99.9;
  74.   
  75.   // 將溫度值乘以10轉換為整數,便于分離各位數字
  76.   int tempInt = (int)(temp * 10);
  77.   
  78.   // 分離各位數字
  79.   int tens = tempInt / 100;              // 十位
  80.   int ones = (tempInt % 100) / 10;       // 個位
  81.   int tenths = tempInt % 10;             // 十分位
  82.   
  83.   // 更新顯示緩沖區
  84.   if (tens == 0) {
  85.     displayBuffer[0] = 10;  // 十位為0時顯示空白
  86.   } else {
  87.     displayBuffer[0] = tens;  // 顯示十位
  88.   }
  89.   
  90.   displayBuffer[1] = ones;      // 顯示個位(帶小數點)
  91.   displayBuffer[2] = tenths;    // 顯示十分位
  92.   
  93.   // 第4位顯示"C"表示攝氏度(這里用8表示,但實際會特殊處理)
  94.   displayBuffer[3] = 12;  // 特殊值,在顯示函數中會轉換為"C"
  95. }

  96. // 數碼管顯示函數
  97. void displayDigits() {
  98.   // 循環顯示4位數碼管
  99.   for (int i = 0; i < 4; i++) {
  100.     digitalWrite(latchPin, LOW);  // 準備發送數據
  101.    
  102.     // 獲取當前位的段選碼
  103.     unsigned char segCode;
  104.    
  105.     if (i == 3) {
  106.       // 第4位顯示攝氏度符號"C"(段碼:1100 0110 = 0xC6)
  107.       segCode = 0xC6;
  108.     } else {
  109.       segCode = segTable[displayBuffer[i]];
  110.       
  111.       // 如果是第1位(個位),添加小數點
  112.       if (i == 1 && displayBuffer[i] != 10) {
  113.         segCode &= 0x7F;  // 清除最高位(dp位),使其顯示小數點
  114.       }
  115.     }
  116.    
  117.     // 發送段選數據
  118.     shiftOut(dataPin, clockPin, MSBFIRST, segCode);
  119.    
  120.     // 發送位選數據
  121.     shiftOut(dataPin, clockPin, MSBFIRST, digitSelect[i]);
  122.    
  123.     digitalWrite(latchPin, HIGH);  // 鎖存數據,更新顯示
  124.    
  125.     // 短暫延時,實現動態掃描
  126.     delay(1);
  127.   }
  128. }

  129. void loop() {
  130.   unsigned long currentMillis = millis();
  131.   
  132.   // 定期讀取溫度
  133.   if (currentMillis - lastTempRead >= tempReadInterval) {
  134.     lastTempRead = currentMillis;
  135.    
  136.     // 讀取溫度
  137.     temperature = readLM35Temperature();
  138.    
  139.     // 更新顯示緩沖區
  140.     updateDisplayBuffer(temperature);
  141.    
  142.     // 串口輸出
  143.     Serial.print("溫度: ");
  144.     Serial.print(temperature, 1);  // 顯示1位小數
  145.     Serial.println(" °C");
  146.   }
  147.   
  148.   // 持續刷新數碼管顯示
  149.   // 每50ms刷新20次,確保穩定顯示
  150.   static unsigned long lastDisplayTime = 0;
  151.   if (currentMillis - lastDisplayTime >= 50) {
  152.     lastDisplayTime = currentMillis;
  153.    
  154.     // 顯示20次(約40ms)
  155.     for (int i = 0; i < 20; i++) {
  156.       displayDigits();
  157.     }
  158.   }
  159. }

  160. /*
  161. 硬件連接說明:

  162. 1. LM35連接:
  163.    VCC -> Arduino 5V
  164.    OUT -> Arduino A4
  165.    GND -> Arduino GND

  166. 2. 74HC595連接(兩個芯片級聯):
  167.    第一個74HC595(控制段選):
  168.      DS (14腳) -> Arduino 8
  169.      SH_CP (11腳) -> Arduino 7
  170.      ST_CP (12腳) -> Arduino 4
  171.      MR (10腳) -> VCC
  172.      OE (13腳) -> GND
  173.      Q0-Q7 -> 數碼管段選引腳(a,b,c,d,e,f,g,dp)

  174.    第二個74HC595(控制位選):
  175.      DS (14腳) -> 第一個74HC595的Q7' (9腳)
  176.      SH_CP (11腳) -> Arduino 7(與第一個共用)
  177.      ST_CP (12腳) -> Arduino 4(與第一個共用)
  178.      MR (10腳) -> VCC
  179.      OE (13腳) -> GND
  180.      Q0-Q3 -> 數碼管位選引腳(COM1-COM4)

  181. 3. 4位共陰數碼管:
  182.    段選引腳(a-g,dp) -> 第一個74HC595的Q0-Q7
  183.    公共陰極(COM1-COM4) -> 第二個74HC595的Q0-Q3

  184. 注意:
  185. 1. 段選引腳需要串聯220Ω限流電阻
  186. 2. 確保74HC595的VCC(16腳)接5V,GND(8腳)接GND
  187. 3. 數碼管是共陰極,所以位選低電平時該位數碼管被選中

  188. 顯示格式:
  189. 第1位:十位溫度(如果為0則顯示空白)
  190. 第2位:個位溫度(帶小數點)
  191. 第3位:十分位溫度
  192. 第4位:攝氏度符號"C"
  193. 示例:25.6°C 顯示為 "25.6C"
  194. */

  195. // 如果需要顯示負溫度,可以使用以下擴展代碼:
  196. /*
  197. // 在segTable數組中添加負號
  198. unsigned char segTable[] = {
  199.   // ... 原有的0-9和空白
  200.   0xBF, // 負號 (-): 1011 1111
  201. };

  202. // 修改updateDisplayBuffer函數:
  203. void updateDisplayBuffer(float temp) {
  204.   if (temp < 0) {
  205.     // 顯示負號
  206.     temp = -temp;
  207.     if (temp > 99.9) temp = 99.9;
  208.    
  209.     int tempInt = (int)(temp * 10);
  210.     int ones = (tempInt % 100) / 10;
  211.     int tenths = tempInt % 10;
  212.    
  213.     displayBuffer[0] = 11;  // 負號
  214.     displayBuffer[1] = ones;
  215.     displayBuffer[2] = tenths;
  216.     displayBuffer[3] = 12;  // "C"
  217.   } else {
  218.     // 正溫度顯示邏輯(保持不變)
  219.     if (temp > 99.9) temp = 99.9;
  220.    
  221.     int tempInt = (int)(temp * 10);
  222.     int tens = tempInt / 100;
  223.     int ones = (tempInt % 100) / 10;
  224.     int tenths = tempInt % 10;
  225.    
  226.     if (tens == 0) {
  227.       displayBuffer[0] = 10;  // 空白
  228.     } else {
  229.       displayBuffer[0] = tens;
  230.     }
  231.    
  232.     displayBuffer[1] = ones;
  233.     displayBuffer[2] = tenths;
  234.     displayBuffer[3] = 12;  // "C"
  235.   }
  236. }
  237. */
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表