Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan prinsip PID untuk stabilsasi suhu pada heater. Alat ini menggunakan sensor suhu ds18b20 dan pemanas menggunakan peltier. driver yang digunakan untuk peltier adalah transistor TIP3055, jika ingin menggunakan pemanas sumber AC maka bisa diganti dengan TRIAC atau sejenisnya. untuk lebih jelasnya berikut adalah program dan daftar komponennya.
a. Arduino Nano
b. Heater Peltier
c. LCD 16x2 dan I2C
d. Sensor Ds18b20
e. Program Arduino IDE
#include "Wire.h"
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire ds(12); // on pin 10 (a 4.7K resistor is necessary)
float kp = 1.08;
float ki = 1.17;
float kd = 1.15;
float p,ix,d,suhu,pid;
float error,errorx,sumerr;
float sp;
float spx = 50; //set point
int pinpwm = 11;
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
void setup() {
pinMode(pinpwm,OUTPUT);
Serial.begin(9600);
lcd.begin();
lcd.clear();
lcd.noCursor();
}
void loop() {
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
for( i = 0; i < 8; i++) {
}
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
suhu = celsius;
analogWrite(pinpwm,pid);
sp = spx + 30; //atur range overlap kalibrasi
error = sp - suhu;
p = error * kp;
sumerr = error + errorx;
ix = ki * sumerr;
d = kd * (error - errorx);
pid = p + ix + d;
//pid = 255.0 - pid;
// if(pid < 1){
// pid = 0;
// }
lcd.setCursor(0,0);
lcd.print("Suhu=");
lcd.print(suhu);
lcd.print("/");
lcd.print(spx);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("PID=");
lcd.print(pid);
lcd.print(" ");
Serial.println("suhu= ");
Serial.println(suhu);
Serial.println("pid= ");
Serial.println(pid);
delay(1000);
errorx = error;
}
f. VIDEO HASILNYA
No comments:
Post a Comment