Управление котлом на ардуино
Добавлено: Пт сен 27, 2024 9:52 am
Буду сюда складывать всё что найду и считаю полезным, по большому счёту видимо для себя.
Это скетч найденый на просторах интернета, и предназначен для управления электрокотлом с 3 тенами через реле.
Буду его допиливать.
Свои скетчи утеряны так как года два назад разработки забросил.
PHP скрипты
Это скетч найденый на просторах интернета, и предназначен для управления электрокотлом с 3 тенами через реле.
Буду его допиливать.
Свои скетчи утеряны так как года два назад разработки забросил.
Код: Выделить всё
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
#include <DHT.h>
#include <Ethernet.h>
#include <SPI.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire ds(6); // on pin 10 (a 4.7K resistor is necessary)
DallasTemperature sensors(&ds);
boolean waithTemp = false;
int TEMPERATURE_PRECISION = 10;
int lamp1 = 7;
int lamp2 = 8;
int lamp3 = 9;
DeviceAddress IntThermometer = { 0x28, 0x8E, 0xF4, 0x28, 0x05, 0x00, 0x00, 0x07 };
DeviceAddress OutThermometer = { 0x28, 0x65, 0x15, 0x32, 0x05, 0x00, 0x00, 0xE2 };
DeviceAddress KatThermometer = { 0x28, 0x61, 0x43, 0x28, 0x05, 0x00, 0x00, 0x14 };
byte addr[8];
unsigned long StartTime = 0;
unsigned long WorkWindow = 60000; // 10min
unsigned long WorkTime, TenTime;
float maxData = 100;
float celsius, temp;
double Setpoint, Input, Output;
int ThermometerCount;
DeviceAddress Thermometer[100];
PID myPID(&Input, &Output, &Setpoint, 10, 0.1, 5, DIRECT); //0.000006 0.03 40
double targetTemp = 22.5;
byte mac[] = { 0xE0, 0x69, 0x95, 0x72, 0x65, 0xE8 };
byte ip[] = { 192, 168, 1, 100 };
byte server[] = { ?, ?, ?, ? };
EthernetClient client;
byte webskipcount = 10;
byte webcount = 0;
void setup(void) {
Serial.begin(9600);
//Ethernet.begin(mac, ip);
Ethernet.begin(mac);
sensors.begin();
pinMode(lamp1, OUTPUT);
pinMode(lamp2, OUTPUT);
pinMode(lamp3, OUTPUT);
Setpoint = targetTemp;
myPID.SetOutputLimits(0, maxData);
myPID.SetMode(AUTOMATIC);
celsius = targetTemp;
StartTime = millis();
}
long filter(long x, long Nb, long k) {
static long y = 0, z = 0;
z += (x - y);
return y = (Nb * z) >> k;
};
void loop(void) {
byte i;
byte type_s;
byte data[12];
long Out;
if (millis() < StartTime) {
StartTime = millis();
}
WorkTime = millis() - StartTime;
if (WorkTime > WorkWindow) {
WorkTime = WorkTime - WorkWindow;
StartTime = millis() + WorkTime;
}
//Serial.println("cycle");
sensors.requestTemperatures();
celsius = sensors.getTempC(IntThermometer);
Input = celsius;
if (webcount >= webskipcount) {
char buffer[10];
String temperatureS1 = dtostrf(celsius, 2, 2, buffer);
String temperatureS2 = dtostrf(sensors.getTempC(OutThermometer), 2, 2, buffer);
String temperatureS3 = dtostrf(sensors.getTempC(KatThermometer), 2, 2, buffer);
String OutputPowerS = dtostrf(Output, 2, 2, buffer);
String msg = "GET /temp.php?t1="+ temperatureS1 + "&t2=" + temperatureS2 + "&t3=" + temperatureS3 + "&p="+OutputPowerS;
Serial.println(msg);
client.connect(server, 80);
client.println(msg);
client.stop();
webcount = 0;
} else {
webcount += 1;
}
myPID.Compute();
//Serial.print(Input);Serial.print(" ");Serial.print(Output);Serial.print(" ");Serial.println(Setpoint);
if (Output > maxData/3*2) {
digitalWrite(lamp1, HIGH);
digitalWrite(lamp2, HIGH);
Out = Output - maxData/3*2;
} else if (Output > maxData/3) {
digitalWrite(lamp1, HIGH);
digitalWrite(lamp2, LOW);
Out = Output - maxData/3;
} else {
digitalWrite(lamp1, LOW);
digitalWrite(lamp2, LOW);
Out = Output;
}
TenTime = map(Out, 0, maxData/3, 0, WorkWindow);
Serial.print(celsius);
Serial.print(" ");
Serial.print(sensors.getTempC(OutThermometer));
Serial.print(" ");
Serial.print(sensors.getTempC(KatThermometer));
Serial.print(" ");
Serial.print(Output);
Serial.print(" ");
Serial.print(TenTime);
Serial.print(" ");
Serial.println(WorkTime);
if (WorkTime < TenTime) {
digitalWrite(lamp3, HIGH);
}
if (WorkTime > TenTime) {
digitalWrite(lamp3, LOW);
}
}
Код: Выделить всё
<?php
$dbhost = 'localhost';
$dbuser = '***';
$dbpass = '***';
$dbname = 'nikolaarduino';
$client_ip = $_SERVER['REMOTE_ADDR'];
$temp1 = $_GET["t1"];
$temp2 = $_GET["t2"];
$temp3 = $_GET["t3"];
$power = $_GET["p"];
$connect = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $connect )
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db ($dbname, $connect);
$sql = "INSERT INTO Temp (datetime, temp1, temp2, temp3, power, ip) VALUES (Now(), '$temp1', '$temp2', '$temp3', '$power', '$client_ip')";
if(!mysql_query($sql))
{echo '<p><b>Data upload error!</b></p>';}
else
{echo '<p><b>OK</b></p>';}
mysql_close($connect);
?>
Код: Выделить всё
<?php
$dbhost = 'localhost';
$dbuser = '***';
$dbpass = '***';
$dbname = 'nikolaarduino';
$client_ip = $_SERVER['REMOTE_ADDR'];
$connect = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $connect )
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db ($dbname, $connect);
$query = 'SELECT * FROM Temp WHERE id=(SELECT MAX(ID) FROM Temp)';
$result = mysql_query($query) or die('Error get data: ' . mysql_error());
echo "<table style='text-align: left; width: 100%;' border='1' cellpadding='2' cellspacing='2'>\n";
while ($line = mysql_fetch_array($result, MYSQL_NUM)) {
echo "<tr align='center'><td colspan='2' rowspan='1'>$line[1]</td></tr>";
echo "<tr align='center'><td>TempIN = $line[2]</td><td> TempOUT = $line[3]</td></tr>\n";
echo "<tr align='center'><td colspan='2' rowspan='1'>TempKotel = $line[4]</td></tr>\n";
echo "<tr align='center'><td colspan='2' rowspan='1'>Power = $line[5]</td></tr>\n";
}
echo "</table>\n";
mysql_free_result($result);
mysql_close($connect);
?>