vault backup: 2026-07-11 16:59:05
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
---
|
||||
active: false
|
||||
tags: project
|
||||
created: 2026-05-28 15:23
|
||||
---
|
||||
## Summary
|
||||
|
||||
Building an I2C temperature controller involves reading temperature from an I2C sensor (like an MCP9808 or DHT12) and using an Arduino to trigger a relay (for heaters/coolers) or adjust a fan. Use the standard `<Wire.h>` library for communication and control relays based on your temperature thresholds.
|
||||
|
||||
Here is a straightforward guide to get your project running.
|
||||
|
||||
🛠️ Hardware Requirements
|
||||
|
||||
- **Microcontroller:** Arduino Uno or Nano
|
||||
- **I2C Temperature Sensor:** MCP9808 (High precision) or DHT12
|
||||
- **I2C Display (Optional):** 16x2 LCD with I2C backpack (PCF8574)
|
||||
- **Control Element:** 5V Relay module (to switch a fan or heater)
|
||||
- **Misc:** Breadboard, jumper wires, and 4.7kΩ pull-up resistors (if not built into your sensor modules)
|
||||
|
||||
🔌 Wiring the Components
|
||||
|
||||
Connect your I2C devices to the Arduino's I2C bus. You will share these lines between the sensor and the display.
|
||||
|
||||
- **VCC** Arduino
|
||||
- **GND** Arduino
|
||||
- **SDA** Arduino Analog Pin (or the dedicated pin on newer boards)
|
||||
- **SCL** Arduino Analog Pin (or the dedicated pin on newer boards)
|
||||
- **Relay Signal Pin** Arduino Digital Pin
|
||||
|
||||
Before running this code, ensure you have installed the **Adafruit MCP9808 Library** and the **LiquidCrystal_I2C Library** via the Arduino IDE Library Manager (`Sketch > Include Library > Manage Libraries`).
|
||||
|
||||
```
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_MCP9808.h>
|
||||
#include <LiquidCrystal_I2C.h>
|
||||
|
||||
// Create sensor and display objects
|
||||
Adafruit_MCP9808 tempsensor = Adafruit_MCP9808();
|
||||
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address to 0x27 for a 16 chars and 2 line display
|
||||
|
||||
const int RELAY_PIN = 7;
|
||||
const float TARGET_TEMP = 25.0; // Target temperature in Celsius
|
||||
const float HYSTERESIS = 0.5; // Prevents relay rapid switching (chattering)
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
pinMode(RELAY_PIN, OUTPUT);
|
||||
digitalWrite(RELAY_PIN, HIGH); // Default to OFF (Relays are often active LOW)
|
||||
|
||||
// Initialize I2C LCD
|
||||
lcd.init();
|
||||
lcd.backlight();
|
||||
lcd.setCursor(0, 0);
|
||||
lcd.print("I2C Temp Ctrl");
|
||||
|
||||
// Initialize sensor
|
||||
if (!tempsensor.begin(0x18)) { // Default I2C address for MCP9808
|
||||
Serial.println("Couldn't find MCP9808!");
|
||||
while (1);
|
||||
}
|
||||
tempsensor.setResolution(3); // Set resolution to 0.0625°C
|
||||
}
|
||||
|
||||
void loop() {
|
||||
tempsensor.wake(); // Wake up sensor
|
||||
float tempC = tempsensor.readTempC();
|
||||
tempsensor.shutdown(); // Shutdown to save power/reduce self-heating
|
||||
|
||||
// Update Display
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("Temp: ");
|
||||
lcd.print(tempC);
|
||||
lcd.print("C");
|
||||
|
||||
// Temperature Control Logic
|
||||
if (tempC > (TARGET_TEMP + HYSTERESIS)) {
|
||||
digitalWrite(RELAY_PIN, LOW); // Turn ON cooling/heating
|
||||
}
|
||||
else if (tempC < (TARGET_TEMP - HYSTERESIS)) {
|
||||
digitalWrite(RELAY_PIN, HIGH); // Turn OFF cooling/heating
|
||||
}
|
||||
|
||||
delay(1000); // Read temperature every second
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Tasks
|
||||
|
||||
|
||||
## References
|
||||
Reference in New Issue
Block a user