Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Encoder.h>
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #include <TwoDigitsDisplay.h>
- #include <SimplePwmFrequency.h>
- // Defines --------------------------------------------------------------------
- #define PIN_DISPLAY_DATA 4
- #define PIN_DISPLAY_WRITE_0 5
- #define PIN_DISPLAY_WRITE_1 6
- #define PIN_DISPLAY_ADDRESS_0 7
- #define PIN_DISPLAY_ADDRESS_1 8
- #define PIN_DISPLAY_ADDRESS_2 9
- #define PIN_PWM_FAN 10
- #define PIN_PWM_PELTIER 11
- #define PIN_ONE_WIRE_BUS 12
- #define PIN_STATUS_LED 13
- #define PIN_FEEDBACK_VOLTAGE A0
- #define TEMPERATURE_PRECISION 12
- #define ADDRESS_SENSOR { 0x28, 0xFF, 0x2B, 0x43, 0xA4, 0x15, 0x01, 0x8D }
- #define FAN_MIN_PERCENTAGE 0.1
- #define FAN_MAX_PERCENTAGE 0.5
- #define ASCII_SYMBOL_DEGREE 176
- #define PELTIER_RESISTANCE 0.8
- // Global object instances ----------------------------------------------------
- OneWire oneWire(PIN_ONE_WIRE_BUS);
- DallasTemperature temperatureSensors(&oneWire);
- DeviceAddress deviceSensor = ADDRESS_SENSOR;
- TwoDigitsDisplay frontDisplay(
- PIN_DISPLAY_ADDRESS_0,
- PIN_DISPLAY_ADDRESS_1,
- PIN_DISPLAY_ADDRESS_2,
- PIN_DISPLAY_WRITE_0,
- PIN_DISPLAY_WRITE_1,
- PIN_DISPLAY_DATA
- );
- Encoder rotaryEncoder(2, 3);
- // Global variables -----------------------------------------------------------
- float targetTemperature = 10.0;
- float targetTemperatureMargin = 3.0;
- long long displayTargetTemperatureTime = 0;
- long long lastTemperatureRequestTime = 0;
- // Setup function -------------------------------------------------------------
- void setup() {
- Serial.begin(9600);
- pinMode(PIN_PWM_FAN, OUTPUT);
- pinMode(PIN_PWM_PELTIER, OUTPUT);
- pinMode(PIN_STATUS_LED, OUTPUT);
- analogWrite(PIN_PWM_FAN, 60);
- digitalWrite(PIN_PWM_PELTIER, LOW);
- setPwmFrequency(PIN_PWM_FAN, 1);
- setPwmFrequency(PIN_PWM_PELTIER, 1);
- rotaryEncoder.write(0);
- temperatureSensors.begin();
- temperatureSensors.setResolution(deviceSensor, TEMPERATURE_PRECISION);
- frontDisplay.setValue(0);
- }
- // Update peltier duty based on current temperature ---------------------------
- void recalculatePwmDuties(float currentTemperature) {
- float temperatureThresholdLow = targetTemperature - targetTemperatureMargin;
- float temperatureThresholdHigh = targetTemperature + targetTemperatureMargin;
- float temperatureThresholdPercentage = (currentTemperature - temperatureThresholdLow) / (temperatureThresholdHigh - temperatureThresholdLow);
- if (temperatureThresholdPercentage < 0)
- temperatureThresholdPercentage = 0;
- else if (temperatureThresholdPercentage > 1)
- temperatureThresholdPercentage = 1;
- float peltierDutyPercentage = pow(temperatureThresholdPercentage, 0.7);
- float fanDutyPercentage = FAN_MIN_PERCENTAGE + (FAN_MAX_PERCENTAGE - FAN_MIN_PERCENTAGE) * peltierDutyPercentage;
- float feedbackValue = analogRead(PIN_FEEDBACK_VOLTAGE);
- float feedbackVolts = (1.0 - (feedbackValue / 1023)) * 12.0;
- float feedbackAmps = feedbackVolts / PELTIER_RESISTANCE;
- analogWrite(PIN_PWM_PELTIER, 255 * peltierDutyPercentage);
- analogWrite(PIN_PWM_FAN, 255 * fanDutyPercentage);
- Serial.print("Current: ");
- Serial.print(currentTemperature);
- Serial.write(ASCII_SYMBOL_DEGREE);
- Serial.print("C");
- Serial.print(", Target: ");
- Serial.print(targetTemperature);
- Serial.write(ASCII_SYMBOL_DEGREE);
- Serial.print("C");
- Serial.print(", Peltier: ");
- Serial.print(100 * peltierDutyPercentage);
- Serial.print("%");
- Serial.print(", Fan: ");
- Serial.print(100 * fanDutyPercentage);
- Serial.print("%");
- Serial.print(", Volts: ");
- Serial.print(feedbackVolts);
- Serial.print("V");
- Serial.print(", Power: ");
- Serial.print(feedbackVolts * feedbackAmps);
- Serial.println("W");
- }
- // Show current or target temperature -----------------------------------------
- void displayTargetTemperature(float temperature) {
- displayTargetTemperatureTime = millis();
- frontDisplay.setValue(round(targetTemperature));
- digitalWrite(PIN_STATUS_LED, HIGH);
- }
- void displayCurrentTemperature(float temperature) {
- if (displayTargetTemperatureTime == 0 || abs(millis() - displayTargetTemperatureTime) > 2000) {
- frontDisplay.setValue(round(temperature));
- digitalWrite(PIN_STATUS_LED, LOW);
- }
- }
- // Loop function --------------------------------------------------------------
- void loop() {
- delay(10);
- // Poll temperature sensor data -----------------------------------------------
- if (lastTemperatureRequestTime == 0 || abs(millis() - lastTemperatureRequestTime) > 2000) {
- lastTemperatureRequestTime = millis();
- if (temperatureSensors.isConnected(deviceSensor)) {
- temperatureSensors.requestTemperaturesByAddress(deviceSensor);
- float newTemperature = temperatureSensors.getTempC(deviceSensor);
- // Check validity
- if (newTemperature > -20 && newTemperature < 60) {
- recalculatePwmDuties(newTemperature);
- displayCurrentTemperature(newTemperature);
- }
- }
- }
- // Poll rotary encoder data ---------------------------------------------------
- long encoderDelta = rotaryEncoder.read();
- rotaryEncoder.write(0);
- if (encoderDelta != 0) {
- targetTemperature += (1.0 / 4 * encoderDelta); // 4 encoder steps per tick
- if (targetTemperature < 0)
- targetTemperature = 0;
- if (targetTemperature > 20)
- targetTemperature = 20;
- displayTargetTemperature(targetTemperature);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement