เครื่องวัดอุณหภูมิ Arduino พร้อมเซ็นเซอร์อุณหภูมิ LM35 เทอร์โมมิเตอร์ดิจิตอล DS18B20 และ ARDUINO UNO

เกี่ยวกับ เครื่องวัดอุณหภูมิแบบดิจิตอลบน ใช้ Arduinoมีการกล่าวมากมาย ทั้งหมดเชื่อมต่อกับคอมพิวเตอร์หรือแสดงอุณหภูมิโดยตรงบนจอแสดงผล
แต่ฉันต้องการเทอร์โมมิเตอร์กลางแจ้งที่ทำงานอัตโนมัติและส่งข้อมูลไปยังเว็บไซต์ มาเริ่มกันเลย

สิ่งที่เราต้องการ:
  • Arduino Duemilanove (Freeduino 2009)
  • อีเทอร์เน็ตชิลด์ v2
  • เซ็นเซอร์อุณหภูมิดิจิตอล - DS18B20
  • พัดลมเคส (120 มม.)
  • กระป๋องน้ำอิมัลชันหรือกาว PVA (2 ลิตร)
  • นำ
  • คู่บิด
งาน
สำรวจเซ็นเซอร์อุณหภูมิผ่านบัส 1-Wire และทุกๆ 3 วินาทีจะส่งผลลัพธ์ไปยังเว็บเซิร์ฟเวอร์อย่างอิสระที่จะจัดเก็บผลลัพธ์เหล่านั้น
อัลกอริธึมการทำงานของอุปกรณ์:
  1. กำหนดให้กับ Ethernet Shield ของเรา ที่อยู่ MACและที่อยู่ IP
  2. เริ่มต้นการเชื่อมต่อกับเซิร์ฟเวอร์บนพอร์ต 80
  3. เราได้รับข้อมูลจากเซ็นเซอร์วัดอุณหภูมิแบบดิจิตอลผ่านบัส 1 สาย
  4. เราสร้าง รับคำขอ
  5. ส่งคำขอ GET
  6. กำลังตัดการเชื่อมต่อ
ซอร์สโค้ดร่าง:
ความคิดเห็นตามโค้ดควรให้ความชัดเจน
รวม
// ไลบรารีด้านล่างไม่รวมอยู่ในสภาพแวดล้อมการพัฒนา Arduino มาตรฐาน
// คุณจะต้องคัดลอกมัน
รวม

// ที่อยู่ MAC ของอุปกรณ์ของเรา
ไบต์ mac = ( 0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC );
// ที่อยู่ IP ของอุปกรณ์
ไบต์ ip = ( 192, 168, 1, 156 );
// ที่อยู่ IP ของเซิร์ฟเวอร์ระยะไกล
เซิร์ฟเวอร์ไบต์ = ( 79, 140, 28, 20 ); //เปลี่ยนเป็นของคุณ
อุณหภูมิถ่าน;
ไบต์ isdata=0;

ไคลเอนต์ไคลเอนต์ (เซิร์ฟเวอร์ 80); // 80-พอร์ต
ดัลลัสอุณหภูมิ tempSensor;

การตั้งค่าเป็นโมฆะ ()
{
Ethernet.begin(mac, ip); // เริ่มต้น Ethernet Shield
tempSensor. เริ่มต้น (7); // เซ็นเซอร์วัดอุณหภูมิที่พินที่ 7
อนุกรมเริ่มต้น(9600); // ความเร็วพอร์ตคอนโซล 9600 (มีประโยชน์สำหรับการดีบัก)
}

เป็นโมฆะวน()
{
ล่าช้า (3000); // ดีเลย์ 3 วินาที
// เชื่อมต่อ
ถ้า (client.connect()) (
Serial.println("กำลังเชื่อมต่อ..." ); // Serial.println สำหรับการดีบัก ปล่อยไว้จะดีกว่า เผื่อว่าปัญหาจะเข้าใจได้ง่ายขึ้น
// ตัวจัดการข้อผิดพลาดของเซ็นเซอร์
สวิตช์ (tempSensor.isValid())
{
กรณีที่ 1:
Serial.println("CRC ไม่ถูกต้อง" ); // ข้อผิดพลาด เช็คซัม
tempSensor.รีเซ็ต(); // รีเซ็ตอุปกรณ์
กลับ ;
กรณีที่ 2:
Serial.println("อุปกรณ์ไม่ถูกต้อง" ); // เซ็นเซอร์ "ซ้าย" บางชนิด :)
tempSensor.รีเซ็ต(); // รีเซ็ตอุปกรณ์
กลับ ;
}

Serial.println("เชื่อมต่อแล้ว" );
ถ่านบุฟ;
ลอย f=tempSensor.getTemperature(); //รับอุณหภูมิ

Serial.println(tempSensor.getTemperature());

// ต่ำกว่าความวิปริตด้วยการแยกส่วนที่เป็นเศษส่วนและจำนวนเต็ม ด้วยเหตุผลบางอย่าง Arduino ไม่ต้องการทำงานกับโฟลต
// แทรกคำถามแทนตัวเลข อาจเป็นเพราะขาดการสนับสนุนฮาร์ดแวร์ในการทำงานด้วย
// ตัวเลขทศนิยมใน Arduino ฉันยินดีที่จะเห็นวิธีแก้ปัญหาที่สวยงามยิ่งขึ้นในความคิดเห็น
int temp1 = (ฉ - (int )f) * 100; // เลือก เศษส่วน
// เขียนคำขอ GET จำเป็นต้องใช้ตัวแปรรหัสเพื่อป้องกันไม่ให้เทอร์โมมิเตอร์ของศัตรูส่งค่าสุ่ม
// ตรวจสอบทางฝั่งเว็บเซิร์ฟเวอร์
วิ่ง (buf, "GET /class/backend/meteo.php?temp=%0d.%d&code=123456 HTTP/1.0", (int )f, เอบีเอส(temp1));

Serial.println(buf);
ลูกค้า println (buf); // ส่งคำขอ GET
client.println("โฮสต์: opck.info" ); // เราระบุว่าเราสนใจโฮสต์ใดบน IP นี้
ลูกค้า println();

) อื่น (
Serial.println("การเชื่อมต่อล้มเหลว" );
}

ในขณะที่ (client.available()) (
isdata=1;
ถ่าน c = client.read(); // อ่านสิ่งที่เว็บเซิร์ฟเวอร์ตอบเรา
อนุกรม.พิมพ์(c);

ถ้า (!client.connected()) (
isdata=0;
อนุกรม.println();
Serial.println("กำลังตัดการเชื่อมต่อ" );
ลูกค้า.หยุด(); // สิ้นสุดการเชื่อมต่อ
}
}


การประกอบอุปกรณ์:
  1. เราขอ "ขา" แรกของเซ็นเซอร์ไปที่ "ลบ" GND
  2. “ขา” ที่สอง (DQ) บนพินที่ 7
  3. ที่สามถึง "บวก"
  4. ตัวที่สองและสามต้องเชื่อมต่อกับตัวต้านทาน ~ 4.7 K แต่ฉันเปลี่ยนตัวต้านทานเป็น LED และได้รับตัวบ่งชี้สำหรับการเข้าถึงบัสเซ็นเซอร์ (โปรดทราบ! หากไม่มีตัวต้านทานหรือ LED จะไม่มีอะไรทำงาน อย่าลืม!)

ตามทฤษฎีก็แค่นั้นแหละ มันควรจะทำงาน
มันใช้งานได้แต่สภาพการต่อสู้แสดงให้เห็นว่าเมื่อมันตกลงมา แสงแดดบนเซนเซอร์สามารถร้อนขึ้นและแสดงอุณหภูมิที่สูงกว่าของจริงได้มาก ถูกต้อง - มันจะแสดงอุณหภูมิในดวงอาทิตย์ และเราต้องการอุณหภูมิอากาศ

นับเป็นครั้งแรกที่มีการประกอบกระป๋องกาแฟที่ห่อด้วยกระดาษฟอยล์เพื่อจุดประสงค์นี้ แต่นี่ไม่ได้ช่วยอะไร

การศึกษาภาพถ่ายของสถานีตรวจอากาศจริงช่วยค้นหาวิธีแก้ปัญหา โครงสร้างสำหรับเซ็นเซอร์ควรมีขนาดใหญ่ขึ้นและยังมีการระบายอากาศแบบแอคทีฟในกรณีดังกล่าวด้วย

การสร้างที่อยู่อาศัยสำหรับเซ็นเซอร์
กระป๋องสีน้ำกลายเป็นขนาดที่เหมาะสม (กาว PVA มีปริมาตร 2-3 ลิตรเหมือนกัน) ที่ด้านล่างของกระป๋องเราเจาะรูสำหรับพัดลม และติดไว้กับโถ ตรงกลางกระป๋องเราวางแท่นสำหรับเซ็นเซอร์ โดยมีเส้นผ่านศูนย์กลางเล็กกว่ากระป๋องเล็กน้อย เพื่อให้อากาศไหลเวียนได้
ภาพถ่ายบางส่วน:

อย่างที่คุณจำได้ฉันได้เปลี่ยนตัวต้านทานเป็น LED ดังนั้นเราจึงเจาะรูเพื่อให้สามารถมองเห็นการทำงานของอุปกรณ์ได้ตลอดเวลา

เราไม่ต้องการฝาปิดจากขวด แต่เราต้องการทรงพุ่มเพื่อให้อากาศผ่านไปได้และฝนจะไม่เข้าไปข้างใน (เซ็นเซอร์จะอยู่ที่ถนน)

ฉันสร้างเคส Arduino จากกล่องพลาสติกจากเครื่องเล่น MP3 Explay C360

แบ็กเอนด์รับข้อมูล:
ที่ฝั่งเซิร์ฟเวอร์จะมีสคริปต์ที่เทอร์โมมิเตอร์เข้าถึง สคริปต์จะตรวจสอบความถูกต้อง รหัสลับเพื่อที่จะไม่สามารถแทนที่การอ่านได้
แล้วเพิ่ม รายการใหม่วี ตาราง MySql- จากนั้นข้อมูลนี้สามารถแสดงได้ตามต้องการ ในกรณีนี้ ข้อมูลทุกนาทีของนาทีที่ผ่านมาจะถูกเฉลี่ยและเพิ่มลงในตารางอื่น
สิ่งนี้จำเป็นเพื่อ:
1. เลือกในฐานข้อมูลได้ง่ายกว่า (ระบุนาทีแล้วได้ผลลัพธ์สะดวกกว่าหรือเปล่า)
2. ตัวอย่างเร็วขึ้น (~500,000 บันทึกต่อปี แทนที่จะเป็น 10,000,000)

ในระหว่าง ทำงานที่ยาวนานเซ็นเซอร์ตรวจพบปัญหา บางครั้งเซ็นเซอร์เกิดขึ้นเอง (ทุก 3-4 ชั่วโมง) ทำให้เกิดค่าสุ่ม จึงเพิ่มการตรวจสอบการเปลี่ยนแปลงของอุณหภูมิมากกว่า 1 องศา ภายใน 15 วินาที ค่าดังกล่าวจะถูกละเว้น

ข้อบกพร่อง:
ความแม่นยำของเซ็นเซอร์คือ 0.5* C ซึ่งไม่เพียงพอสำหรับฉัน แต่มีวิธีปรับปรุงประสิทธิภาพ คุณจะต้องมีเซ็นเซอร์ตั้งแต่หนึ่งตัวขึ้นไป (ควรมาจากชุดที่แตกต่างกัน) เราได้รับข้อมูลจากเซ็นเซอร์ทั้งหมดและคำนวณค่าเฉลี่ยเลขคณิต วิธีนี้จะทำให้คุณได้รับความแม่นยำจนถึงระดับหนึ่งในร้อย
แผนการในอนาคต:
  • เซ็นเซอร์ความชื้น
  • เซ็นเซอร์ความดัน
  • เซ็นเซอร์ความเร็วลม
  • เซ็นเซอร์วัดแสง
  • ใส่สิ่งเหล่านี้ไว้ในเมืองและพยากรณ์อากาศของคุณเอง
  • จ่ายไฟให้กับ Arduino ผ่าน Power over Ethernet
  • เปิดใช้งานพัดลมและความเร็วโดยอัตโนมัติโดยขึ้นอยู่กับแสงสว่าง
  • การควบคุมระยะไกล
  • รีเซ็ตข้อมูลในกรณีที่ไม่มีการเชื่อมต่อ (สำหรับฉันนี่เป็นสิ่งสำคัญ)
ข้อเสียที่ฉันรู้จัก:
- ราคาสูง- 2180 ถู (Freeduino 2009 (800 RUR) + Ethernet Shield v2 (1300 RUR) + 1 เซ็นเซอร์ (80 RUR))
- หากเปิดพัดลมเร็วเกินไปก็จะทำให้เกิดข้อผิดพลาดกับอุณหภูมิโดยการเป่าเซ็นเซอร์ ไม่ควรเป่าออก แต่ดันอากาศผ่านเท่านั้น

เรียนรู้วิธีใช้โมดูล RF 433 MHz กับ ATMega328P-PU ในบทความนี้เราจะประกอบวงจรจากเซ็นเซอร์ DHT11 และเครื่องส่งสัญญาณ RF นอกจากนี้เรายังจะประกอบอุปกรณ์รับสัญญาณที่มีเครื่องรับวิทยุ 433 MHz และจอ LCD

เราต้องการอะไร

  • คอมพิวเตอร์พร้อมติดตั้ง อาร์ดูโน่ IDE(ฉันใช้เวอร์ชัน 1.6.5);
  • ไลบรารี VirtualWire (ลิงค์ด้านล่าง);
  • ATMega328P;
  • โปรแกรมเมอร์ AVR MKII ISP;
  • เซ็นเซอร์อุณหภูมิและความชื้นสัมพัทธ์ DHT11;
  • ส่วนประกอบจากรายการองค์ประกอบด้านล่าง

การแนะนำ

ในบทความนี้ ฉันจะแสดงวิธีสร้างอุปกรณ์ที่ใช้วัดอุณหภูมิและความชื้นสัมพัทธ์และส่งค่าที่วัดได้โดยใช้โมดูล RF มาตรฐาน 433 MHz เซ็นเซอร์อุณหภูมิและความชื้นที่ใช้ในอุปกรณ์คือ DHT11

มีหลายวิธีในการถ่ายโอนข้อมูลจำนวนเล็กน้อย โดยใช้อาดูโน่หรือตัวควบคุม ATMega หนึ่งในนั้นใช้ไลบรารีสำเร็จรูปเช่น RCSwitch, Radiohead หรือ VirtualWire นอกจากนี้ยังสามารถส่งข้อมูลดิบโดยใช้โมดูล UART ในตัวของไมโครคอนโทรลเลอร์ได้อีกด้วย แต่ไม่แนะนำให้ใช้โมดูล UART ในตัว เนื่องจากตัวรับสัญญาณจะรวบรวมเสียงรบกวนทั้งหมดและไมโครคอนโทรลเลอร์จะไม่ทำงานตามที่ตั้งใจไว้ ในบทความนี้ ฉันใช้ไลบรารี VirtualWire เพื่อส่งและรับข้อมูล ไลบรารีนี้ทำงานร่วมกับ Arduino IDE 1.6.2 และ 1.6.5

โมดูลเครื่องส่งสัญญาณ 433 MHz เมื่อไม่ส่งข้อมูล ยังคงปล่อย RF และส่งเสียงรบกวน นอกจากนี้ยังอาจรบกวนอุปกรณ์ความถี่วิทยุอื่นๆ อีกด้วย เพื่อป้องกันสิ่งนี้ ฉันจึงเปิดเครื่องเมื่อจำเป็นต้องถ่ายโอนข้อมูล และปิดเมื่อการถ่ายโอนเสร็จสมบูรณ์

ฮาร์ดแวร์

เราต้องการสอง บล็อกไดอะแกรม- อันหนึ่งสำหรับอุปกรณ์ส่งสัญญาณ อันที่สองสำหรับอุปกรณ์รับ

เครื่องส่ง

เราต้องการ:

  • วิธีเฟิร์มแวร์ไมโครคอนโทรลเลอร์ → ISP;
  • เซ็นเซอร์วัดอุณหภูมิและความชื้น → DHT11;
  • ไมโครคอนโทรลเลอร์สำหรับการประมวลผลข้อมูล → ATMega32p;
  • ทาง การส่งสัญญาณไร้สายข้อมูล → โมดูลความถี่วิทยุ 433 MHz

ผู้รับ

เราต้องการ:

  • วิธีการรับสัญญาณวิทยุ → โมดูลความถี่วิทยุ 433 MHz;
  • วิธีการประมวลผลข้อมูลที่ได้รับ → Arduino Mega;
  • วิธีแสดงอุณหภูมิและความชื้น → 16x2 LCD

แผนผัง

เครื่องส่ง


กำลังส่งสัญญาณส่วนหนึ่งของเทอร์โมมิเตอร์ไร้สายบน ATMega328p
()

ใน ในตัวอย่างนี้ฉันจะไม่ส่งออกพินไมโครคอนโทรลเลอร์ที่ไม่ได้ใช้ไปที่ ผู้ติดต่อภายนอกเทอร์โมมิเตอร์หลังจากนั้นจะนำไปใช้ปรับปรุงอุปกรณ์ต่อไปได้ ที่นี่เรากำลังพิจารณาเฉพาะแนวคิดสำหรับอุปกรณ์และจะประกอบเข้ากับเขียงหั่นขนมเท่านั้น

ผู้รับ



(หากต้องการขยายขนาดคุณสามารถคลิกที่ภาพได้ คลิกขวาเมาส์และเลือก "เปิดลิงก์/รูปภาพในแท็บใหม่/หน้าต่างใหม่")

โปรดทราบว่าผู้รับจะขึ้นอยู่กับ บอร์ด Arduinoเมกะซึ่งไม่ได้แสดงในแผนภาพ หากต้องการเชื่อมต่อบอร์ด Arduino Mega ให้เชื่อมต่อโมดูล RF เข้ากับบอร์ดและ จอ LCDตามเครื่องหมายบนแผนภาพ

รายการองค์ประกอบ

เครื่องส่ง


รายการองค์ประกอบของส่วนส่งสัญญาณของเทอร์โมมิเตอร์ไร้สายบน ATMega328p
(หากต้องการขยาย คุณสามารถคลิกขวาที่รูปภาพแล้วเลือก "เปิดลิงก์/รูปภาพในแท็บใหม่/หน้าต่างใหม่")

ผู้รับ



(หากต้องการขยาย คุณสามารถคลิกขวาที่รูปภาพแล้วเลือก "เปิดลิงก์/รูปภาพในแท็บใหม่/หน้าต่างใหม่")

โปรแกรม

โปรแกรมส่งสัญญาณ

ก่อนอื่น มาดูโปรแกรมของส่วนที่ส่งสัญญาณกันก่อน:

#รวม // กำหนด #define dhtPin 4 #define dhtType DHT11 #define txPowerPin 8 // การใช้ไลบรารี DHT DHT dht(dhtPin, dhtType); // ตัวแปร char msg0; ถ่าน msg1; inttem = 0; อินท์ฮัม = 0; // การทำงาน การตั้งค่าเริ่มต้น- ดำเนินการเพียงครั้งเดียวเมื่อเปิดการตั้งค่าเป็นโมฆะ() ( pinMode(txPowerPin, OUTPUT); pinMode(txPowerPin, LOW); vw_setup(4800); // ความเร็วการเชื่อมต่อ VirtualWire vw_set_tx_pin(9); // VirtualWire Transfer pin ) // ฟังก์ชั่น วงจร - ดำเนินการเสมอ void loop() ( digitalWrite(txPowerPin, HIGH); hum = dht.readHumidity(); // ตัวแปรเก็บความชื้น tem = dht.readTemperature(); // ตัวแปรเก็บอุณหภูมิ itoa(hum, msg1, 10) ; // แปลงความชื้นเป็นอาร์เรย์ char itoa(tem, msg0, 10); // แปลงอุณหภูมิเป็นอาร์เรย์ char strcat(msg0, msg1); // เพิ่ม/รวมสองอาร์เรย์ vw_send((uint8_t *)msg0, strlen( msg0) ); // ส่งข้อความ vw_wait_tx(); // รอให้การส่งสัญญาณเสร็จสิ้น digitalWrite(txPowerPin, LOW); // รอ 5 วินาทีแล้วทำซ้ำอีกครั้ง)

เพื่อถ่ายทอดความชื้นและอุณหภูมิเป็นข้อความเดียว ฉันจึงรวมมันเข้าด้วยกัน ขั้นแรก ข้อมูลจะถูกอ่านเป็นตัวแปรเป็นจำนวนเต็ม จากนั้นจำนวนเต็มจะถูกแปลงเป็นอาร์เรย์อักขระ จากนั้นจึงนำมาต่อกัน เมื่อสิ้นสุดการรับข้อมูลจะถูกแบ่งออกเป็น ตัวละครแต่ละตัว- การทำเช่นนี้ ฉันจำกัดตัวเองไว้ที่ระดับสองหลัก หากเซ็นเซอร์อยู่ในสภาพแวดล้อมที่มีอุณหภูมิน้อยกว่า 10°C ฉันจะได้รับสัญลักษณ์ขยะบนจอแสดงผล ตัวอย่างเช่น หากอุณหภูมิอยู่ที่ 20°C และความชื้นอยู่ที่ 45% ข้อความ 2045 จะถูกส่งออกไป และทุกอย่างเป็นไปด้วยดี ถ้าอุณหภูมิ 9°C และความชื้น 78% ข้อความ 978x จะถูกส่ง โดยที่ “x” คือ สัญลักษณ์สุ่ม- ดังนั้นหากคุณสร้างเทอร์โมมิเตอร์ไร้สายนี้ ขอแนะนำให้เปลี่ยนโปรแกรมเพื่อส่งข้อมูลที่ถูกต้องเมื่ออุณหภูมิต่ำกว่า 10°C

โปรแกรมตัวรับ

// รวมไลบรารีที่จำเป็น #include #รวม // กำหนดการเชื่อมต่อ LCD #define RS 9 #define E 10 #define D4 5 #define D5 6 #define D6 7 #define D7 8 LiquidCrystal lcd (RS, E, D4, D5, D6, D7); // การวาดสัญลักษณ์องศาไบต์ สัญลักษณ์องศา = ( B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 ); // ตัวแปร int tem = 0; ฉัน; // ฟังก์ชั่นการตั้งค่าเริ่มต้น - ดำเนินการเพียงครั้งเดียวเมื่อเปิดใช้งานการตั้งค่าเป็นโมฆะ() ( lcd.begin(16,2); // เริ่มต้น LCD lcd.createChar(1, องศาสัญลักษณ์); // สร้างสัญลักษณ์องศาที่ตำแหน่ง 1 อนุกรม start (9600); // สำหรับการดีบัก vw_setup (4800); // VirtualWire ความเร็วในการเชื่อมต่อ vw_rx_start (); // พร้อมรับ vw_set_rx_pin (2); // รับเอาต์พุต VirtualWiore lcd.clear (); / ฟังก์ชั่นลูป - ดำเนินการเสมอ void loop() ( uint8_t buf; // ตัวแปรสำหรับการจัดเก็บข้อมูลที่ได้รับ uint8_t buflen = VW_MAX_MESSAGE_LEN; // ตัวแปรสำหรับการจัดเก็บความยาวของข้อมูลที่ได้รับ lcd.setCursor(0,0); lcd.print(" Temp: " ); if (vw_get_message(buf, &buflen)) // หากได้รับข้อมูล ( for (i=0;i<2;i++) // Получить два первых байта { Serial.write(buf[i]); // Для отладки lcd.write(buf[i]); // Вывести первые байты на LCD } Serial.println(); // Для отладки lcd.write(1); // Вывести символ градусов на LCD lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Hum: "); for (i=2;i<4;i++) // Получаем последние два байта { Serial.write(buf[i]); // Отладка lcd.write(buf[i]); // Вывести последние байты на LCD } lcd.print("% RH"); } }

วิธีที่น่าสนใจในการใช้ไลบรารี LiquidCrystal คือการสร้างสัญลักษณ์แบบกำหนดเอง การใช้ createChar ฉันสร้างสัญลักษณ์องศา คุณสามารถสร้างสัญลักษณ์ของคุณเองได้ในลักษณะเดียวกัน หากต้องการสร้างสัญลักษณ์หรือไอคอนที่กำหนดเอง คุณจะต้องประกาศให้เป็นอาร์เรย์ 8 ไบต์และ "วาด" ว่าพิกเซลใดจะเปิดอยู่ (1 เปิดอยู่ 0 ปิดอยู่)

เมื่อสร้างโครงการทางเทคนิคต่างๆ มักจำเป็นต้องติดตั้งตัวบ่งชี้อุณหภูมิ ส่วนประกอบเหล่านี้ช่วยให้คุณตรวจสอบการทำงานของอุปกรณ์ได้ดียิ่งขึ้น ในการทบทวนนี้ เราจะได้เรียนรู้วิธีแปลงโวลต์มิเตอร์แบบอะนาล็อกให้เป็นเทอร์โมมิเตอร์ที่แม่นยำ ในการทำงาน เราจำเป็นต้องมีบอร์ด Arduino (วงจรพิเศษที่ติดตั้งหน่วยความจำ โปรเซสเซอร์ และหน้าสัมผัสการทำงานสองสามโหลของตัวเอง) และเซ็นเซอร์อุณหภูมิรุ่น DS18B20

ลักษณะของโมดูลอุณหภูมิ DS18B20

เป็นไปไม่ได้ที่จะไม่พูดถึงข้อดีอีกประการของโมดูล DS18B20 เซ็นเซอร์ประเภทนี้แต่ละตัวใช้รหัสซีเรียล 64 บิตเฉพาะในการทำงาน ซึ่งหมายความว่าส่วนประกอบดังกล่าวทั้งหมดสามารถทำงานบนบัส 1-Wire เพียงเส้นเดียว ซึ่งข้อมูลทั้งหมดจะถูกส่งไปตามที่ระบุไว้ข้างต้น ดังนั้นในการควบคุมหลายโมดูลจึงจำเป็นต้องใช้ไมโครโปรเซสเซอร์เพียงตัวเดียวและเซ็นเซอร์อุณหภูมิสามารถกระจายไปทั่วพื้นที่ขนาดใหญ่ได้

ชิ้นส่วนสำหรับการทำงานกับเทอร์โมมิเตอร์ด้วย DS18B20 ที่ใช้ Arduino

ในการประกอบเทอร์โมมิเตอร์แบบแอนะล็อกคุณภาพสูง คุณต้องเตรียม:

  • วงจรไฟฟ้าประเภท Arduino (ควรใหม่กว่า);
  • เซนเซอร์วัดอุณหภูมิ รุ่น DS18B20;
  • โวลต์มิเตอร์แบบอะนาล็อก
  • สายไฟ 5 เส้น - ต้องใช้สายไฟสองเส้นเพื่อสร้างวงจรระหว่างบอร์ด Arduino และโวลต์มิเตอร์ ต้องใช้สายไฟ 3 เส้นเพื่อเชื่อมต่อกับวงจรไฟฟ้าของเซ็นเซอร์อุณหภูมิ
  • แบตเตอรี่ภายนอก

การสร้างวงจรไฟฟ้าสำหรับเทอร์โมมิเตอร์ด้วย DS18B20 โดยใช้ Arduino

อัลกอริธึมการทำงานค่อนข้างง่ายที่นี่แม้แต่ผู้เริ่มต้นก็สามารถเชื่อมต่อส่วนประกอบทั้งหมดไว้ในวงจรเดียวได้ ขั้นแรก คุณต้องค้นหาหน้าสัมผัสเชิงลบบนโมดูล DS18B20 (หากคุณดูเซ็นเซอร์จากด้านบน หน้าสัมผัสนี้จะอยู่ทางด้านซ้าย) ต้องเชื่อมต่อพินเชิงลบเข้ากับจุดกราวด์ด้านล่างของบอร์ด Arduino (จะมีตัวย่อว่า GND) พินที่มีประจุบวก (ขวา) ต้องเชื่อมต่อกับพินไฟ 5 V (ซึ่งอยู่ที่ด้านล่างของบอร์ดด้วย) ถัดไป สัญญาณเอาต์พุตจะถูกส่งไปยังพินดิจิทัล 2 (อยู่ที่ด้านบนของบอร์ด) เพื่อให้สามารถวัดอุณหภูมิได้ (ในกรณีนี้ จะใช้พินกลางของเซ็นเซอร์)

ในการควบคุมโวลต์มิเตอร์ระหว่างการทำงานคุณจะต้องเชื่อมต่อหน้าสัมผัสเชิงบวกเข้ากับพินดิจิตอลหมายเลข 9 หน้าสัมผัสเชิงลบของโวลต์มิเตอร์เชื่อมต่อกับจุดกราวด์ด้านบนของบอร์ด (กำหนดโดยตัวย่อ GND) หากต้องการเปลี่ยนสเกลดิจิตอลของโวลต์มิเตอร์ คุณเพียงแค่ต้องพิมพ์ภาพที่เตรียมไว้เป็นองศาเซลเซียส รูปภาพนี้ติดกาวไว้ที่ด้านบนของสเกลเก่าหรือแทรกเข้าที่

คำอธิบายของการปรับความกว้างพัลส์

กล่าวโดยสรุป การมอดูเลตความกว้างพัลส์เป็นวิธีการสร้างผลลัพธ์แบบอะนาล็อก (เช่น อุณหภูมิ) โดยใช้วิธีดิจิทัล เป็นเรื่องที่ดีเพราะแม้แต่ค่าที่สูงมากหรือต่ำมากก็ถูกส่งผ่านช่องทางการสื่อสารในพัลส์เดียว กระบวนการทั้งหมดของการปรับความกว้างพัลส์เป็นดังนี้: เซ็นเซอร์ส่งสัญญาณพัลส์ไปยังโปรเซสเซอร์และโปรเซสเซอร์เองก็ประมวลผลมัน หลังจากนั้นจะส่งค่าไปยังเทอร์โมมิเตอร์ เพื่อให้สามารถรับข้อมูลในลักษณะนี้ได้ คุณต้องใช้หมุดสัมผัสพิเศษบนบอร์ด Arduino การจดจำผู้ติดต่อเหล่านี้ทำได้ง่ายมาก - ถัดจากนั้นจะมีไอคอน "~" อย่างไรก็ตามไอคอนนี้ยังปรากฏใกล้กับหมายเลขติดต่อ 9 ซึ่งเราเชื่อมต่อพินบวกของโวลต์มิเตอร์ ใช้พิน 9 เป็นตัวอย่างเท่านั้น หากต้องการ คุณสามารถใช้ผู้ติดต่ออื่นที่มีไอคอน "~" อยู่ข้างๆ ได้

การเขียนโค้ดสำหรับใช้งานเทอร์โมมิเตอร์ด้วย DS18B20 บน Arduino

ก่อนอื่น คุณต้องเพิ่มไลบรารีชื่อ DallasTemperature ให้กับโปรแกรมการพัฒนาของคุณ มันคุ้มค่าที่จะให้ความสำคัญกับมันเพราะมันมีค่าอุณหภูมิสูงสุด (และนี่เป็นสิ่งสำคัญเมื่อใช้โมดูล DS18B20)

เมื่อสร้างโค้ดคุณจะต้องเขียนคำสั่งหลักสามคำสั่ง:

  1. อ่านค่าอุณหภูมิที่มาจากเซ็นเซอร์
  2. การแปลงอุณหภูมิโดยใช้การปรับความกว้างพัลส์
  3. การแสดงค่าบนเทอร์โมมิเตอร์
ด้วยเหตุนี้ การอ่านอุณหภูมิจากเซ็นเซอร์จึงได้รับการกำหนดค่าตั้งแต่เริ่มต้น หลังจากนี้ กระบวนการมอดูเลตความกว้างพัลส์จะถูกสร้างขึ้น หากมีไลบรารีที่ระบุผู้ใช้จะสามารถรับค่าในช่วงตั้งแต่ 0 ถึง 255 การปรับความกว้างพัลส์ได้รับการกำหนดค่าในโปรแกรมการพัฒนา (เพื่อจุดประสงค์นี้มีรายการเมนูที่เรียกว่า "แผนที่") เมื่อใช้รหัส คุณสามารถตั้งค่าอุณหภูมิต่ำสุดและสูงสุดที่เทอร์โมมิเตอร์จะนำมาพิจารณาได้ เพื่อให้แน่ใจว่าการสื่อสารด้วยซอฟต์แวร์ระหว่างโวลต์มิเตอร์และบอร์ด Arduino คุณต้องเขียนพินดิจิทัลตัวที่ 9 ในส่วนเฉพาะของโค้ด (ระบุไว้ข้างต้นว่าโวลต์มิเตอร์เชื่อมต่ออยู่)

โปรดทราบว่าเกณฑ์อุณหภูมิต่ำสุดและสูงสุดอาจแตกต่างกันมาก (ทั้งหมดนี้ขึ้นอยู่กับความชอบของผู้ใช้) อย่างไรก็ตาม สิ่งหนึ่งที่ต้องจำก็คือ ยิ่งช่องว่างระหว่างขีดจำกัดล่างและบนมากเท่าไร ตัวเลขบนสเกลก็จะยิ่งน้อยลงเท่านั้น

โค้ดทั้งหมดที่จำเป็นในการตั้งค่าเทอร์โมมิเตอร์มีดังนี้

วันนี้เราจะมาดูโครงการ Arduino สำหรับนักศึกษาวิศวกรรมศาสตร์ ในบทความนี้เราจะบอกวิธีสร้างเทอร์โมมิเตอร์โดยใช้ Arduino ข้อดีของการสร้างเทอร์โมมิเตอร์โดยใช้ Arduino คือความเรียบง่ายของการออกแบบ เรามีคุณสมบัติของมันอยู่แล้ว การเขียนโปรแกรม Arduino ง่ายกว่าที่คุณคิดมาก

โครงการนี้เป็นเทอร์โมมิเตอร์แบบดิจิตอล (เซ็นเซอร์วัดอุณหภูมิแบบดิจิตอล Arduino) ซึ่งสร้างขึ้นบนพื้นฐานของเซ็นเซอร์ LM35 ที่มีความแม่นยำในตัว

เทอร์โมมิเตอร์แบบดิจิตอลถูกนำมาใช้กันอย่างแพร่หลายในอุปกรณ์อิเล็กทรอนิกส์หลายชนิด เช่น เครื่องปรับอากาศ เพื่อรายงานระดับอุณหภูมิและควบคุมกระบวนการของระบบทำความเย็น

วงจรนี้ใช้เซ็นเซอร์อุณหภูมิ LM35 ในการตรวจจับระดับอุณหภูมิซึ่งสามารถวัดได้ตั้งแต่ -55 ถึง 150°C อุณหภูมิที่วัดได้จะแสดงบนจอ LCD ขนาด 16x2 โดยใช้ Arduino

ส่วนประกอบที่จำเป็นสำหรับโครงการ “Thermometer on Arduino”

เทอร์โมมิเตอร์ดิจิตอล Arduino ใช้ส่วนประกอบที่ทุกคนสามารถซื้อได้ตามร้านขายอุปกรณ์อิเล็กทรอนิกส์

  • อาร์ดูโน่
  • เซ็นเซอร์อุณหภูมิ LM35
  • จอ LCD 16x2
  • โพเทนชิออมิเตอร์ 1kOhm

การทำงานของเทอร์โมมิเตอร์

แรงดันไฟขาออกของเซ็นเซอร์ LM35 จะเป็นสัดส่วนเชิงเส้นตรงกับอุณหภูมิ (เซลเซียส)

เอาต์พุตของ LM35 มีปัจจัยสเกล 10mV/°C ซึ่งหมายความว่าอุณหภูมิที่เพิ่มขึ้นทุกๆ 1°C แรงดันเอาต์พุตจะเพิ่มขึ้น 10mV ที่สอดคล้องกัน ดังนั้นเราจึงสามารถอ่านค่าอุณหภูมิที่วัดได้ได้อย่างง่ายดาย

Arduino มีพินแบบอะนาล็อก (A0) ที่สามารถอ่านสัญญาณอะนาล็อกจากเซ็นเซอร์ใดก็ได้ ดังที่แสดงในแผนภาพวงจร พินอะนาล็อก A0 ของ Arduino เชื่อมต่อกับเอาต์พุตของ LM35

ขาเซ็นเซอร์อุณหภูมิ LM35

Arduino มี ADC ในตัว 10 บิต จึงสามารถอ่านค่าได้ตั้งแต่ 0 ถึง 1,023 ซึ่งสำหรับแรงดันไฟฟ้าเป็นศูนย์จะอ่าน 0000 และสำหรับ VCC (5V) จะอ่าน 1,023

ดังนั้นเราจึงปรับขนาดค่า 0 - 1,023 เป็นช่วงใหม่ 0 - 500 เนื่องจาก LM35 เอาท์พุตค่าโดยเพิ่มขั้นละ 10mV ต่อระดับ ดังนั้นการเพิ่มสูงสุดที่เป็นไปได้คือ 500 (5V/0.01V)

เมื่อใช้การแมปนี้ เราสามารถเพิ่มค่า ADC แต่ละครั้งเป็นการเพิ่มระดับได้ ถ้าค่า ADC คือ 27 แสดงว่าอุณหภูมิที่วัดได้คือ 27°C

ภาพสเก็ตช์เทอร์โมมิเตอร์

#รวม ยาว; อินท์บี; จอแอลซีดีคริสตัลเหลว (12, 11, 5, 4, 3, 2); การตั้งค่าเป็นโมฆะ() ( lcd.begin(16,2); lcd.print("THERMO METER"); pinMode(A0,INPUT); ) void loop() ( A=analogRead(A0); B=map(A, 0.1023,0.500); lcd.setCursor(0,0); lcd.print("อุณหภูมิ: "); lcd.setCursor(B); lcd.print("'C " ; )

ตอนนี้เรามาดูตรรกะของโปรแกรมกันดีกว่า อันดับแรก เราต้องประกาศตัวแปรแบบยาว "A" เพื่อจัดเก็บค่าที่อ่านได้จาก LM35 ซึ่งมีช่วงตั้งแต่ 0 ถึง 1023 จากนั้นเราจะประกาศตัวแปรจำนวนเต็ม "B" อีกตัวหนึ่งเพื่อจัดเก็บค่าที่แสดง (แปลงแล้ว)

ค่าอุณหภูมิจะอ่านจากพิน A0 และเก็บไว้ในตัวแปร “A” จากนั้นตัวแปร "A" จะถูกแปลงเป็นช่วงตั้งแต่ 0 ถึง 500 และเก็บไว้ในตัวแปร "B" ค่า "B" จะแสดงโดยตรงบนหน้าจอ LCD ขนาด 16x2