Тюнинг своими руками

Автомобильный климат-контроль без кондиционера на ардуино

Идея пришла создать управление краником печки при помощи сервопривода MG996R на Arduino Nano, затем решил  сделать полноценный климат контроль с помощью ПИД-регулятора с памятью последней установленной температурой. Разобрал старый сканер — готовые кнопки и место под дисплей LCD1602 +I2c интерфейс.

климат контроль на ARDUINO

В качестве датчика температуры использовал барометр BMP180, на дисплее с него выводится в первой строчке температура в салоне, высота над уровнем моря и атмосферное давление . Вторая строка заданная температура 20*и угол поворота сервопривода, на дисплее «0» сервопривод закрыл кран так как температура в салоне 27,5*

Задействовал четыре кнопки (mode):увеличение- уменьшение температуры, кнопки (select): быстрая установка комфортной температуры 20* и кнопка reset — она так и не пригодилась, больше года работает ни разу не зависла ардуинка

141737

скетч программы выкладываю 🙂

#include <EEPROM.h>
#include <Wire.h>
#include <PID_v1.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

double Temp, Input, Output;
PID myPID(&Input, &Output, &Temp,8.6,0.5,1, DIRECT);
boolean revers;

Servo myservo;
LiquidCrystal_I2C lcd(0x3f,16,2);

int buttonUP = 2;
int buttonDOWN = 3;
int button24 = 4;

Adafruit_BMP085 bmp;

void setup() {
myservo.attach(9);
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
lcd.clear();
pinMode(buttonUP, INPUT);
pinMode(buttonDOWN, INPUT);
pinMode(button24, INPUT);

if (!bmp.begin()) { while (1) {} }

Temp = EEPROM.read(1);
Input = bmp.readTemperature();
myPID.SetOutputLimits(0, 180);
myPID.SetMode(AUTOMATIC);
}

void loop() {

if (digitalRead(buttonUP) == LOW) { Temp=Temp+1; EEPROM.write(1,Temp); }
if (digitalRead(buttonDOWN) == LOW) { Temp=Temp-1; EEPROM.write(1,Temp); }
if (digitalRead(button24) == LOW) { Temp=20; EEPROM.write(1,Temp); }

float presiune = bmp.readSealevelPressure()/101.061;
presiune = presiune * 0.760;

lcd.setCursor(0, 0);
lcd.print(bmp.readTemperature(),1); lcd.write(0b11011111); //*
lcd.print(» «); lcd.print(bmp.readAltitude()/2,0); lcd.print(«m»);
lcd.print(» «); lcd.print(presiune,0); lcd.print(«mm»);lcd.print(» «);

lcd.setCursor(0, 1);
lcd.print(Temp,0); lcd.write(0b11011111); lcd.print(» «);
lcd.setCursor(13, 1);
lcd.print(Output,0);
lcd.print(» «);
Input = bmp.readTemperature();
myPID.Compute();
myservo.attach(9,630,2540);//границы поворота сервы
if (revers)
myservo.write(180-Output);
else
myservo.write(Output);
delay(500);
myservo.detach();
}