เซ็นเซอร์อุณหภูมิ I2C LM75
หลักการทำงาน
El IC LM75 เป็น เซ็นเซอร์อุณหภูมิ bandgap ซิลิคอนเซมิคอนดักเตอร์.
ในสารกึ่งตัวนำนั้น วงดนตรีต้องห้าม เป็นโซนพลังงานของอิเล็กตรอนที่ไม่สามารถเพิ่มได้เมื่อมีสนามไฟฟ้าเพิ่มขึ้น เนื่องจากไม่มีสถานะใดที่จะเคลื่อนที่ได้เร็วกว่านี้ นี้ วงดนตรีต้องห้าม รวมอยู่ด้วยระหว่าง วงวาเลนซ์ (พลังงานต่ำ) และ วงดนตรีการนำ (พลังงานที่สูงขึ้น) การกระตุ้นด้วยความร้อน (การเพิ่มขึ้นของอุณหภูมิเพื่อจุดประสงค์ที่เราสนใจ) อาจทำให้อิเล็กตรอนบางตัวได้รับพลังงานเพียงพอที่จะผ่านเข้าไปใน วงดนตรีการนำ.
ตามที่อธิบายไว้ในบทความก่อนหน้านี้เกี่ยวกับ การวัดอุณหภูมิอิเล็กทรอนิกส์ในโลหะ แม้ว่าจำนวนพาหะจะไม่ขึ้นอยู่กับอุณหภูมิ (อิเล็กตรอนทั้งหมดมีอยู่ตลอดเวลา) การเคลื่อนที่ของพวกมันจะได้รับผลกระทบจากอุณหภูมิ ดังนั้นความต้านทานในโลหะจะเพิ่มขึ้นตามอุณหภูมิเนื่องจากความเร็วของอิเล็กตรอนลดลงเนื่องจาก เพิ่มขึ้นของพวกเขา การกวนความร้อน และการกระเจิงของอิเล็กตรอนที่เกิดขึ้น
ในกรณีของเซมิคอนดักเตอร์เนื่องจากการมีอยู่นี้ วงดนตรีต้องห้าม จำนวนพาหะจะขึ้นอยู่กับอุณหภูมิ (ขึ้นอยู่กับ การกระจายตัวของแฟร์มี-ดิแรก) ทำให้ค่าการนำไฟฟ้าเพิ่มขึ้นตามอุณหภูมิ ในเซมิคอนดักเตอร์ อุณหภูมิที่เพิ่มขึ้นจะทำให้ความต้านทานเพิ่มขึ้น แต่ยังทำให้ค่าการนำไฟฟ้าเพิ่มขึ้น (เพิ่มเติม) อีกด้วย
ลอส เซ็นเซอร์อุณหภูมิ bandgap เซมิคอนดักเตอร์ซิลิคอนเช่นเดียวกับกรณีของ LM75 ทำงานตามหลักการนี้ โดยอนุญาตให้กำหนดอุณหภูมิได้โดยการหาปริมาณอิทธิพลที่มีต่อแรงดันไฟฟ้าในซิลิคอนไดโอด
ส่วนประกอบฮาร์ดแวร์ LM75
LM75 ยังมี ตัวแปลงอนาล็อก-ดิจิตอลโดยการมอดูเลตซิกมา-เดลต้า ซึ่งมีหน้าที่รับค่าตัวเลข (ดิจิทัล) ของอุณหภูมิ ซึ่งเป็นค่าที่เก็บไว้ในภายหลัง (ทุกๆ 100 มิลลิวินาที) ในรีจิสเตอร์ตัวใดตัวหนึ่งซึ่งสามารถอ่านค่าผ่านบัสได้ I2C.
นอกจากรีจิสเตอร์ที่มีอุณหภูมิที่วัดได้แล้ว LM75 ยังมีรีจิสเตอร์ที่สามารถจัดเก็บอุณหภูมิสูงสุดได้ รวมถึงตัวเปรียบเทียบที่สามารถสร้างสัญญาณได้หากอุณหภูมิที่วัดได้เกินอุณหภูมิที่จัดเก็บไว้ในรีจิสเตอร์ที่สองนี้ เพื่อไม่ให้ส่งคำเตือนอีกจนกว่าอุณหภูมิที่วัดได้จะลดลงต่ำกว่าระดับที่กำหนด การลงทะเบียนที่สามจะช่วยให้สามารถจัดเก็บค่าอุณหภูมิของ ฮิสเทรีซิส.
การกำหนดค่าของการดำเนินการ LM75 จะถูกเก็บไว้ในการลงทะเบียนที่สี่ซึ่งมีเงื่อนไขภายใต้การสร้างคำเตือนวิธีการเปิดสัญญาณเตือนนี้ (โหมดการหยุดชะงักหรือโหมดการเปรียบเทียบ) รวมถึงการเปิดใช้งานอุปกรณ์ (โหมด) . การทำงานปกติหรือการบริโภคต่ำ) ท่ามกลางพารามิเตอร์อื่น ๆ
ข้อมูลจำเพาะทางเทคนิคและการใช้งาน LM75
ช่วงอุณหภูมิที่ LM75 สามารถวัดได้จะแตกต่างกันไปตั้งแต่ −55 °C ถึง +125 °C และความละเอียดเชิงตัวเลขคือ 0.125 °C แม้ว่าความแม่นยำจะอยู่ที่ ±2 °C ในกรณีที่ดีที่สุด เมื่ออุณหภูมิอยู่ระหว่าง - 25 °C และ +100 °C และความแม่นยำ ±3 °C โดยมีอุณหภูมิสุดขั้วที่สุด ระหว่าง −55 °C ถึง +125 °C
การใช้งาน (ฮาร์ดแวร์) ของ LM75 ในวงจรนั้นง่ายมาก โดยไม่ต้องการส่วนประกอบมากกว่าตัวต้านทาน ดึงขึ้น เดล รถบัส I2C และสามารถจ่ายไฟได้ด้วยแรงดันไฟฟ้าระหว่าง 2,8 V ถึง 5,5 V ในตัวเดียวกัน รถบัส I2C สามารถจัดเรียงเทอร์โมมิเตอร์ LM75 ได้สูงสุดแปดเครื่องโดยการกำหนดค่าที่อยู่ด้วยพินสามพิน A0, A1 และ A2 ที่ระดับสูงหรือต่ำ ตามปกติในกรณีเหล่านี้
ในทางกลับกัน การใช้ LM75 เป็นโพรบไม่สะดวกเนื่องจากบรรจุภัณฑ์ที่นำเสนอ สสอ (TSSOP 8) หรือ วินาที (SO8) และโดยปกติจะใช้เพื่อวัดอุณหภูมิโดยรอบหรือวัดอุณหภูมิของส่วนประกอบที่จัดอยู่ในสภาพแวดล้อมของ PCB ซึ่งมีเทอร์โมมิเตอร์ LM75 ตั้งอยู่
เมื่อเริ่มต้น LM75 ได้รับการกำหนดค่าให้ตรวจจับอุณหภูมิสูงสุดที่ +80°C ซึ่งเป็นอุณหภูมิที่ ฮิสเทรีซิส +75 °C และโหมดการทำงานของตัวเปรียบเทียบ นั่นคือโหมดที่จำลองการทำงานของเทอร์โมสตัท: จะเปิดใช้งานการเตือนเมื่อถึงอุณหภูมิสูงสุดและเฉพาะในกรณีที่อุณหภูมิต่ำกว่าอุณหภูมิ ฮิสเทรีซิส สร้างการแจ้งเตือนอีกครั้ง
การใช้ประโยชน์จาก LM75 จากไมโครคอนโทรลเลอร์ผ่านบัส I2C
ขอบคุณการใช้ รถบัส I2C การทำงานของ LM75 นั้นง่ายมาก เพียงเข้าถึงที่อยู่ที่อยู่บนบัสเพื่อจัดเก็บหรืออ่านการกำหนดค่า และรับค่าอุณหภูมิที่วัดได้
ที่อยู่ I2C ฐานของ LM75 คือ 0B01001XXX และเสริมตามที่อธิบายไว้ข้างต้น โดยบิตที่อยู่สามบิตสุดท้ายที่ตั้งค่าโดยฮาร์ดแวร์ที่มีพิน A0, A1 และ A2 สูง (ค่าหนึ่ง) หรือต่ำ (ค่าศูนย์)
LM75 เป็นเทอร์โมมิเตอร์
รีจิสเตอร์ที่เก็บอุณหภูมิที่วัดล่าสุด (TEMP) อยู่ที่ที่อยู่ 0x00 รีจิสเตอร์การกำหนดค่า (CONF) อยู่ที่ที่อยู่ 0x01 รีจิสเตอร์ที่เก็บอุณหภูมิของ ฮิสเทรีซิส ที่ที่อยู่ 0x02 และค่าสูงสุดหรืออุณหภูมิเกิน (TOS) มีที่อยู่ 0x03 ยกเว้นอุณหภูมิปัจจุบัน (TEMP) ทั้งหมดจะทำหน้าที่อ่านและเขียน
การใช้ตัวอย่างโค้ดบางส่วนที่พัฒนาขึ้นสำหรับ แพลตฟอร์มฮาร์ดแวร์ (ซึ่งเกือบจะกลายเป็นข้อมูลอ้างอิงสากลแล้ว) สามารถอธิบายการทำงานของ LM75 เพิ่มเติมได้ ตัวอย่างพื้นฐานที่มีประโยชน์ที่สุดคือการใช้ LM75 เป็นเทอร์โมมิเตอร์โดยการอ่านบันทึกอุณหภูมิที่วัดครั้งล่าสุด
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo #define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida //#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms así que el intervalo entre lecturas debe ser mayor. #define TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA 3000 // Intervalo entre lecturas consecutivas de la temperatura en ms #include <Wire.h> int temperatura; // Valor de la temperatura actual cargado del LM75 void setup() { Serial.begin(9600); // Inicializar las comunicaciones serie (para mostrar en la consola el valor de la temperatura) Wire.begin(); // Inicializar las comunicaciones I2C } void loop() { Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual Wire.endTransmission(); // Liberar el bus I2C Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual) temperatura=(Wire.read()<<8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte Wire.endTransmission(); // Liberar el bus I2C Serial.println((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C) delay(TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA); // Esperar un poco antes de volver a leer la temperatura } |
กระบวนการนี้เป็นเรื่องปกติเมื่อทำงานกับอุปกรณ์ I2C:
- เพิ่มห้องสมุด I2C ไปที่รหัสด้วย
#include <Wire.h>
- เริ่มต้นไลบรารี I2C การใช้
Wire.begin();
- เข้าถึงเซ็นเซอร์อุณหภูมิ LM75 โดยใช้
Wire.beginTransmission(DIRECCION_LM75)
- ส่งที่อยู่ของรีจิสทรีที่เข้าถึงโดยใช้
Wire.write(REGISTRO)
- ปล่อย รถบัส I2C กับ
Wire.endTransmission()
- เข้าถึง LM75 อีกครั้ง
- ขอค่ารีจิสทรีด้วย
Wire.requestFrom(DIRECCION,CANTIDAD)
- ตรวจสอบว่าได้รับข้อมูลโดยใช้
Wire.available()
- อ่านค่าที่ร้องขอ
Wire.read()
(จำนวนไบต์ประกอบกันกี่ครั้ง) - แม้ว่าจะไม่จำเป็น แต่เมื่อเสร็จแล้วให้ปล่อย รถบัส I2C
นอกเหนือจากโปรโตคอลปกติสำหรับการรับหรือจัดเก็บข้อมูลในบันทึกของอุปกรณ์โดยใช้ รถบัส I2Cเพื่อใช้ประโยชน์จากข้อมูลที่ LM75 มอบให้ จำเป็นต้องพิจารณารูปแบบที่แสดงอุณหภูมิภายใน
รับค่าที่จัดเก็บไว้ในบันทึกอุณหภูมิ LM75
ในบรรทัดที่ 22 ของโค้ดในตัวอย่างก่อนหน้านี้ คุณสามารถดูวิธีการโหลดข้อมูลที่จัดเก็บโดยรีจิสเตอร์อุณหภูมิทั้งสามของ LM75 ใช้ 16 ไบต์ (11 บิต) ซึ่งมีเพียง XNUMX บิตที่สำคัญที่สุดเท่านั้นที่ถูกต้อง เพื่ออ่านอุณหภูมิเป็นจำนวนเต็ม (โดยมีเครื่องหมายเข้ารหัสอยู่) ส่วนเสริมของสอง) ไบต์ที่สำคัญที่สุดจะถูกโหลดลงในตัวแปรก่อน int
de แพลตฟอร์มฮาร์ดแวร์ และมันถูกหมุนไปทางซ้าย 8 บิต เหลือไว้ในส่วนที่สำคัญที่สุดของ int
. ไบต์ที่สองจะถูกอ่านและเพิ่มลงในตัวแปร int
ด้วยการดำเนินการ OR
การตีความค่าอุณหภูมิที่โหลดของ LM75
ในบรรทัดที่ 24 คุณสามารถดูวิธีตีความค่าอุณหภูมิได้ ก่อนอื่นจำเป็นต้องหารด้วย 32 เป็นจำนวนเต็ม (หมุน 11 บิตที่เกี่ยวข้องโดยไม่สูญเสียเครื่องหมาย) และหารด้วย 8 ซึ่งเป็นจำนวน "ขั้นตอน" ที่ใช้แสดงอุณหภูมิ (อ็อกเทฟขององศา) เพื่อให้ได้ค่าชนิด float
โดยมีทศนิยมตรงกัน เนื่องจากคอมไพเลอร์ (รวมถึง toolchain de แพลตฟอร์มฮาร์ดแวร์) ปรับการหารจำนวนเต็มให้เหมาะสมด้วย 32 ไม่จำเป็นต้องรักษาเครื่องหมายและหมุนบิต "ด้วยตนเอง" เนื่องจากการดำเนินการไม่เร็วขึ้น (ประเมินได้)
ตรวจสอบการรับข้อมูลจากบัส I2C
แม้ว่ารหัสก่อนหน้านี้จะทำงานได้โดยไม่มีปัญหาแม้ว่าจะไม่ได้ตรวจสอบว่าข้อมูลที่อุปกรณ์ร้องขอมาถึงแล้วก็ตาม รถบัส I2Cสิ่งที่ออร์โธดอกซ์ที่สุด (และแนะนำ) คือการรอให้ข้อมูลมาถึงในจำนวนที่เหมาะสม เนื่องจากความเร็วในการส่งข้อมูลและการต้านทานต่อข้อผิดพลาดมีมากเกินพอ จึงเป็นเรื่องปกติที่จะค้นหาโค้ดที่มีการร้องขอข้อมูลและอ่านโดยไม่ต้องรอ สำหรับตัวอย่าง การทำเช่นนี้มีประโยชน์เนื่องจากไม่เบี่ยงเบนความสนใจไปจากจุดประสงค์หลัก แต่สำหรับโค้ดการผลิต แนะนำให้ทำตามที่แนะนำไว้ในจุดที่เจ็ดของรายการกระบวนการสื่อสาร I2C. รหัสในตัวอย่างต่อไปนี้เน้นการเปลี่ยนแปลงที่แนะนำเพื่อใช้ LM75 ในขั้นตอนการเอารัดเอาเปรียบ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo #define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida //#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms así que el intervalo entre lecturas debe ser mayor. #define TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA 3000 // Intervalo entre lecturas consecutivas de la temperatura en ms #define TIMEOUT_I2C 30 // Esperar 30 ms antes de renunciar a leer el bus I2C #include <Wire.h> int temperatura; // Valor de la temperatura actual cargado del LM75 unsigned long cronometro_i2c; // Cronómetro para medir el tiempo de espera de la lectura del bus I2C (y cancelar la operación si se supera el máximo) void setup() { Serial.begin(9600); // Inicializar las comunicaciones serie (para mostrar en la consola el valor de la temperatura) Wire.begin(); // Inicializar las comunicaciones I2C } void loop() { Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual Wire.endTransmission(); // Liberar el bus I2C Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual) cronometro_i2c=millis(); while(Wire.available()<2&&(unsigned long)(millis()–cronometro_i2c)>TIMEOUT_I2C); // Esperar a que lleguen dos bytes al bus I2C o pase el tiempo máximo para abandonar if(Wire.available()==2) // Si han llegado dos bytes { temperatura=(Wire.read()<<8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte } Wire.endTransmission(); // Liberar el bus I2C Serial.println((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C) delay(TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA); // Esperar un poco antes de volver a leer la temperatura } |
กำหนดค่าการทำงานของ LM75
การกำหนดค่าพื้นฐานที่สุดของ LM75 ประกอบด้วยการกำหนดอุณหภูมิสูงสุดเพื่อสร้างคำเตือนและ ฮิสเทรีซิสซึ่งจะกำหนดว่าจะปิดการทำงานเมื่อใดและสามารถทำซ้ำได้ ในการกำหนดค่าเหล่านี้คุณจะต้องจัดเก็บไว้ในรีจิสเตอร์ที่เกี่ยวข้องเท่านั้น
เช่นเดียวกับบันทึกอุณหภูมิปัจจุบัน อุณหภูมิสูงสุด (เตือน) และ ฮิสเทรีซิส พวกเขาใช้สองไบต์ แต่ไม่เหมือนกับครั้งแรกที่จะไม่พิจารณา 11 บิต (หนึ่งในแปดของดีกรี) แต่เป็น 9 (ครึ่งดีกรี) ดังนั้น แม้ว่าจะเก็บค่าที่น้อยกว่า แต่ก็จะพิจารณาเฉพาะช่วงเวลาของความละเอียดนี้เท่านั้น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo #define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida #define TEMPERATURA_MAXIMA_LM75 0x03 // Registro que almacena la temperatura máxima (al superarla avisa cambiando el estado del pin OS) 80 °C al inicio #define TEMPERATURA_HISTERESIS_LM75 0x02 // Registro que almacena la temperatura por debajo de la cual la máxima vuelve a generar un cambio en el pin OS (temperatura de histéresis) 75 °C al inicio //#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms #define TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA 3000 // Intervalo entre avisos consecutivos de exceso de temperatura en ms #define TIMEOUT_I2C 30 // Esperar 30 ms antes de renunciar a leer el bus I2C #define TEMPERATURA_AVISO 32.5 // Avisar a los 32.5 °C (Solamente se consideran 9 bits, es decir, medios grados) #define TEMPERATURA_HISTERESIS 31.0 // No volver a avisar (a los 32.5 °C) hasta que no se baje a los 31.0 °C #define PIN_AVISO_LM75 2 // Pin de Arduino al que se conecta la salida OS del LM75 #include <Wire.h> // Cargar la librería de las comunicaciones I2C int temperatura; // Valor de la temperatura actual cargado del LM75 unsigned long cronometro_i2c; // Cronómetro para medir el tiempo de espera de la lectura del bus I2C (y cancelar la operación si se supera el máximo) unsigned long cronometro_avisos=0; // Cronómetro para controlar que se avise del exceso de temperatura a un intervalo máximo (como máximo cada TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA) void setup() { pinMode(PIN_AVISO_LM75,INPUT); // Usar como entrada el pin de Arduino al que se conecta la salida OS del LM75 Serial.begin(9600); // Inicializar las comunicaciones serie Wire.begin(); // Inicializar las comunicaciones I2C //Configurar la temperatura de aviso Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75 Wire.write(TEMPERATURA_MAXIMA_LM75); // Acceder al registro que almacena la temperatura máxima (temperatura de aviso) Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)<<5)); // Desplazar 5 bits a la izquierda Wire.endTransmission(); // Liberar el bus I2C //Configurar la temperatura de histéresis Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75 Wire.write(TEMPERATURA_HISTERESIS_LM75); // Acceder a la temperatura de histéresis Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)<<5)); // Desplazar 5 bits a la izquierda Wire.endTransmission(); // Liberar el bus I2C // El aviso se activará cuando la temperatura sea TEMPERATURA_AVISO o superior // y no se desactivará hasta que sea TEMPERATURA_HISTERESIS o inferior } void loop() { if(!digitalRead(PIN_AVISO_LM75)) // Si la señal OS del LM75 está a nivel bajo (polaridad por defecto del aviso) { if((millis()–cronometro_avisos)>TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA) // Si ha transcurrido el tiempo entre avisos (además de estar activa la señal) { cronometro_avisos=millis(); // Reiniciar el cronómetro de aviso de la temperatura Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual Wire.endTransmission(); // Liberar el bus I2C Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual) cronometro_i2c=millis(); // Iniciar el cronómetro que controla si ha pasado el tiempo máximo de espera de recepción de datos desde el bus I2C while(Wire.available()<2&&(unsigned long)(millis()–cronometro_i2c)>TIMEOUT_I2C); // Esperar a que lleguen dos bytes al bus I2C o pase el tiempo máximo para abandonar if(Wire.available()==2) // Si han llegado dos bytes { temperatura=(Wire.read()<< 8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte Serial.println((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C) } Wire.endTransmission(); // Liberar el bus I2C } } } |
เนื่องจากในโค้ดก่อนหน้านี้มีการเปลี่ยนแปลงเฉพาะการกำหนดค่าอุณหภูมิที่เกี่ยวข้องกับคำเตือน การดำเนินการที่เหลือจึงสอดคล้องกับการกำหนดค่าเริ่มต้น
ในการกำหนดค่าเริ่มต้นนี้ มีคุณลักษณะสองประการที่เกี่ยวข้องกัน ประการแรกโหมดการเตือน โดยค่าเริ่มต้นจะเรียกว่า "โหมดเทอร์โมสตัท" ซึ่งประกอบด้วยการเปิดใช้งานการเตือนเมื่อถึงอุณหภูมิสูงสุด (หรือการเตือน) และไม่ปิดใช้งานจนกว่าจะลดต่ำลงถึงอุณหภูมิสูงสุด อุณหภูมิของ ฮิสเทรีซิส. อีกทางเลือกหนึ่งคือ "โหมดขัดจังหวะ" ซึ่งสัญญาณจะถูกเปิดใช้งานเมื่อเกินค่าสูงสุดหรือเมื่อถึงค่าที่ต่ำกว่าของ ฮิสเทรีซิส และรีเซ็ตโดยการอ่านบันทึกใดๆ ซึ่งโดยปกติจะเป็นอุณหภูมิปัจจุบัน
ลักษณะที่สองคือสัญญาณเตือนจะทำงานที่ระดับต่ำ นั่นคือ ขา OS จะอยู่ในระดับสูงจนกระทั่งถึงอุณหภูมิการเตือนสูงสุด เนื่องจากขั้วของสัญญาณเตือน (ระดับที่เปิดใช้งาน) สามารถกำหนดค่าได้ ในการติดตั้งง่ายๆ บางอย่าง การใช้สัญญาณ (ฮาร์ดแวร์) ก็จะเพียงพอที่จะใช้ประโยชน์จาก LM75 เช่น การเชื่อมต่อหรือตัดการเชื่อมต่อพัดลมเมื่อระบบ ถึงอุณหภูมิที่กำหนด
นอกจากนี้ยังสามารถกำหนดค่าการทำงานของ LM75 เพื่อไม่ให้เตือนทันทีหลังจากถึงอุณหภูมิการเตือน แต่จะเตือนหลังจากเหตุการณ์ต่างๆ หลายครั้ง ลักษณะการทำงานนี้มีประโยชน์มากเมื่อทำงานที่อุณหภูมิจำกัดหรือเปลี่ยนแปลงอย่างรวดเร็ว สามารถกำหนดค่า LM75 ให้เตือนหลังจากอุณหภูมิสูงสุดเกิน XNUMX, XNUMX, XNUMX หรือ XNUMX ครั้ง
ในการลงทะเบียนการกำหนดค่า ยังมีอีกเล็กน้อยในการปิดใช้งาน ("ปิด") LM75 และเข้าสู่โหมดการบริโภคต่ำ ซึ่งออกได้โดยการเปลี่ยนบิตนี้อีกครั้งหรือเพียงเมื่ออ่านการลงทะเบียนครั้งถัดไป
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #define DIRECCION_LM75 0B01001000 // Dirección del LM75 con A0, A1 y A2 a nivel bajo #define TEMPERATURA_ACTUAL_LM75 0x00 // Registro que almacena la temperatura medida #define TEMPERATURA_MAXIMA_LM75 0x03 // Registro que almacena la temperatura máxima (al superarla avisa cambiando el estado del pin OS) 80 °C al inicio #define TEMPERATURA_HISTERESIS_LM75 0x02 // Registro que almacena la temperatura por debajo de la cual la máxima vuelve a generar un cambio en el pin OS (temperatura de histéresis) 75 °C al inicio #define CONFIGURACION_LM75 0x01 // Registro del LM75 que almacena la configuración. El valor por defecto es cero #define ENCENDER_LM75 0B00000000 // Encender el LM75 almacenando este valor (OR el resto) en el registro de configuración #define APAGAR_LM75 0B00000001 // Apagar el LM75 (modo de bajo consumo) almacenando el valoren el registro de configuración #define AVISO_LM75_COMPARAR 0B00000000 // Activo cuando se supera la temperatura máxima inactivo cuando la temperatura es menor que la de histéresis (modo termostato) #define AVISO_LM75_INTERRUPCION 0B00000010 // Activo cuando se supera la temperatura máxima. Se resetea al leer el valor. No se volverá a activar hasta que no se alcance (primero) la de histéresis #define AVISAR_LM75_BAJO 0B00000000 // Establece el nivel bajo en el pin OS cuando se supere la temperatura máxima #define AVISAR_LM75_ALTO 0B00000100 // Establece el nivel alto en el pin OS cuando se supere la temperatura máxima #define AVISAR_LM75_A_1 0B00000000 // Avisar cuando se supere una vez la temperatura (con riesgo de que un error producido por ruido en la conversión lance un aviso incorrecto) #define AVISAR_LM75_A_2 0B00001000 // Avisar de temperatura superada cuando se mida dos veces #define AVISAR_LM75_A_4 0B00010000 // Avisar de temperatura superada cuando se mida cuatro veces #define AVISAR_LM75_A_6 0B00011000 // Avisar de temperatura superada cuando se mida seis veces //#define TIEMPO_CONVERSION_LM75 100 // El LM75 convierte la temperatura (AD) cada 100 ms #define TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA 2000 // Intervalo entre lecturas de la temperatura en ms #define TIMEOUT_I2C 30 // Esperar 30 ms antes de renunciar a leer el bus I2C #define TEMPERATURA_AVISO 32.5 // Avisar a los 32.5 °C (Solamente se consideran 9 bits, es decir, medios grados) #define TEMPERATURA_HISTERESIS 31.0 // No volver a avisar (a los 32.5 °C) hasta que no se baje a los 31.0 °C #define PIN_AVISO_LM75 7 // Pin de Arduino al que se conecta la salida OS del LM75 #include <Wire.h> // Cargar la librería de las comunicaciones I2C int temperatura; // Valor de la temperatura actual cargado del LM75 unsigned long cronometro_i2c; // Cronómetro para medir el tiempo de espera de la lectura del bus I2C (y cancelar la operación si se supera el máximo) unsigned long cronometro_avisos=0; // Cronómetro para controlar que se avise del exceso de temperatura a un intervalo máximo (como máximo cada TIEMPO_ENTRE_AVISOS_DE_TEMPERATURA) void setup() { pinMode(PIN_AVISO_LM75,INPUT); // Usar como entrada el pin de Arduino al que se conecta la salida OS del LM75 Serial.begin(9600); // Inicializar las comunicaciones serie Wire.begin(); // Inicializar las comunicaciones I2C // El aviso se activará, a nivel alto (AVISAR_LM75_ALTO), cuando la temperatura sea TEMPERATURA_AVISO o superior cuatro veces consecutivas (AVISAR_LM75_A_4, que vale 0B00010000) // y no se desactivará hasta que sea TEMPERATURA_HISTERESIS o inferior // Configurar la temperatura de aviso Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75 Wire.write(TEMPERATURA_MAXIMA_LM75); // Acceder al registro que almacena la temperatura máxima (temperatura de aviso) Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha Wire.write((byte)((int)(TEMPERATURA_AVISO*8.0)<<5)); // Desplazar 5 bits a la izquierda Wire.endTransmission(); // Liberar el bus I2C // Configurar la temperatura de histéresis Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75 Wire.write(TEMPERATURA_HISTERESIS_LM75); // Acceder a la temperatura de histéresis Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)>>3)); // Desplazar 5 bits a la izquierda y 8 a la derecha Wire.write((byte)((int)(TEMPERATURA_HISTERESIS*8.0)<<5)); // Desplazar 5 bits a la izquierda Wire.endTransmission(); // Liberar el bus I2C // Configurar el número de veces que debe superarse la temperatura para generar un aviso y la polaridad del aviso Wire.beginTransmission(DIRECCION_LM75); // Iniciar la comunicación con el LM75 Wire.write(CONFIGURACION_LM75); // Acceder al registro de configuración Wire.write(AVISAR_LM75_ALTO|AVISAR_LM75_A_4); // Componer la configuración con operaciones OR sobre los diferentes (bits) valores Wire.endTransmission(); // Liberar el bus I2C } void loop() { if((millis()–cronometro_avisos)>TIEMPO_ENTRE_LECTURAS_DE_TEMPERATURA) // Si ha transcurrido el tiempo entre lecturas { cronometro_avisos=millis(); // Reiniciar el cronómetro de aviso de la temperatura Wire.beginTransmission(DIRECCION_LM75); // Acceder al LM75 por su dirección en el bus I2C Wire.write(TEMPERATURA_ACTUAL_LM75); // Solicitar la lectura del registro de la temperatura actual Wire.endTransmission(); // Liberar el bus I2C Wire.requestFrom(DIRECCION_LM75,2); // Pedir dos bytes (el valor del registro de la temperatura actual) cronometro_i2c=millis(); // Iniciar el cronómetro que controla si ha pasado el tiempo máximo de espera de recepción de datos desde el bus I2C while(Wire.available()<2&&(unsigned long)(millis()–cronometro_i2c)>TIMEOUT_I2C); // Esperar a que lleguen dos bytes al bus I2C o pase el tiempo máximo para abandonar if(Wire.available()==2) // Si han llegado dos bytes { temperatura=(Wire.read()<<8)|Wire.read(); // Leer el primer byte, rotarlo 8 posiciones y añadir el valor del segundo byte Serial.print(“Temperatura “); if(digitalRead(PIN_AVISO_LM75)) // Si la señal OS del LM75 está activa (a nivel alto) { Serial.print(“demasiado alta”); } else { Serial.print(“correcta”); } Serial.print(” (“); Serial.print((float)temperatura/32/8,DEC); // Sólo son relevantes los 11 bits más significativos con una precisión de un octavo de grado (1/8 = 0.125 °C) Serial.println(“)”); } Wire.endTransmission(); // Liberar el bus I2C } } |
แสดงความคิดเห็น