Hallo,
einen Schaltplan direkt gibt es nicht.
An den PWM-Ausgängen (siehe Code) hängt ein Mosfet (IRLIZ44 ist super, BUZ12 geht auch). Natürlich mit 10k gegen Masse und 100R als "Gatestopper" (kommt aus meiner Röhrenzeit...).
Hier ist der Code, nicht besonders schön, aber er funtkioniert.
Die Schrittweite ist derzeit +1, das kann man eventuell ändern. Ich habe so Schwankungen von -0.5/+0.2 hinbekommen, was mir ausreicht. Von den befruchteten Eiern ist nur eins "stehengeblieben".
PHP-Code:
#include <Wire.h> // include Wire library for I2C
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 7, 4, 3, 2);
int TemperatureSetPin = A0; // select the input pin for the potentiometer
int HumiditySetPin = A1; // select the input pin for the potentiometer
int PWM_Heater_Pin = 5;
int PWM_Humidifier_Pin = 6;
int PWM_Fan_Pin = 9;
int ledPin = 13; // select the pin for the LED
int PWM_Heater = 0;
int PWM_Humidifier = 0;
int PWM_Fan = 0;
int PWM_Heater_Percent = 0;
int PWM_Humidifier_Percent = 0;
// Set Points
double Humidity_Set = 60.0;
double Temperature_Set = 0;
// Actual Points
double Humidity;
double Temperature;
int Hyt271Delay = 0;
int wenden = 0;
//Encoder myEnc(8, 9);
void setup() {
pinMode(ledPin, OUTPUT);
lcd.begin(20, 4);
lcd.setCursor(0, 0);
lcd.print(" Brood-O-Matic");
lcd.setCursor(0, 1);
lcd.print(" SW-Version 1.03");
lcd.setCursor(0, 2);
lcd.print(" 08.07.2013");
lcd.setCursor(0, 3);
lcd.print(" Matthias Mett");
delay(2000);
lcd.clear();
#define HYT271_ADDR 0x28
Wire.begin(); // start Wire library as I2C-Bus Master
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(HYT271_ADDR);
Wire.write(0);
Wire.available();
int Ack = Wire.read(); // receive a byte
Wire.endTransmission();
// http://www.ist-ag.com/eh/ist-ag/resource.nsf/imgref/Download_AHHYT-I2C_E1.1.pdf/$FILE/AHHYT-I2C_E1.1.pdf
// http://mawaases.net/hyt-371-i2c-sensor-am-arduino/
Hyt271Delay = 20;
while (Hyt271Delay > 0) {
analogMesure();
lcdOutput();
delay(1);
Hyt271Delay--;
}
// READ DATA from here on
Wire.beginTransmission(HYT271_ADDR);
Wire.requestFrom(HYT271_ADDR, 4); //Reade 1 byte
Wire.available();
int b1 = Wire.read(); // receive a byte
int b2 = Wire.read(); // receive a byte
int b3 = Wire.read(); // receive a byte
int b4 = Wire.read(); // receive a byte
Wire.write(0); //NACK
// combine the bits
int RawHumidBin = b1 << 8 | b2;
// compound bitwise to get 14 bit measurement first two bits
// are status/stall bit (see intro text)
RawHumidBin = (RawHumidBin &= 0x3FFF);
Humidity = 100.0 / pow(2, 14) * RawHumidBin;
// Cut off after one decimal place
Humidity = float(((int)(Humidity*10))/10.0);
b4 = (b4 &= 0x3F); //Mask away 2 least sign. bits see HYT 221 doc
int RawTempBin = b3 << 6 | b4;
Temperature = 165.0 / pow(2, 14) * RawTempBin - 40;
// Cut off after one decimal place
Temperature = float(((int)(Temperature*10))/10.0);
Wire.endTransmission();
///////////////////////////////////////////////////////
// Calculate and set Temperature PWM value
///////////////////////////////////////////////////////
if (Temperature_Set > Temperature) {
if (Temperature_Set > Temperature + 2)
PWM_Heater += 50;
else
PWM_Heater++;
}
if (Temperature_Set < Temperature)
PWM_Heater = 0;
if (PWM_Heater > 255)
PWM_Heater = 255;
PWM_Heater_Percent = PWM_Heater / 2.55;
///////////////////////////////////////////////////////
// Calculate and set Humidity PWM value
///////////////////////////////////////////////////////
if (Humidity_Set > Humidity) {
if (Humidity_Set > Humidity + 20)
PWM_Humidifier += 50;
else
PWM_Humidifier++;
}
if (Humidity_Set < Humidity)
PWM_Humidifier = 0;
if (PWM_Humidifier > 255)
PWM_Humidifier = 255;
///////////////////////////////////////////////////////
// If water in the bucket is low or empty
// temp will raise and humidity will drop to approx. 20%.
// If so stop the humidifier.
///////////////////////////////////////////////////////
if (( Temperature > 38.5) || (Humidity < 20) )
PWM_Humidifier = 0;
PWM_Humidifier_Percent = PWM_Humidifier / 2.55;
///////////////////////////////////////////////////////
// Set all the output Pins to the calculated states
///////////////////////////////////////////////////////
analogWrite(PWM_Heater_Pin, PWM_Heater);
analogWrite(PWM_Humidifier_Pin, PWM_Humidifier);
///////////////////////////////////////////////////////
// Status on Serial and LCD
///////////////////////////////////////////////////////
Serial.print("Ziel Rel.LF: ");
Serial.print(Humidity_Set, 1);
Serial.print("% Temp: ");
Serial.print(Temperature_Set, 1);
Serial.println("C");
Serial.print("Ist Rel.LF: ");
Serial.print(Humidity, 1);
Serial.print("% Temp: ");
Serial.print(Temperature, 1);
Serial.println("C");
Serial.print("Humidifier PWM:");
Serial.print(PWM_Humidifier_Percent);
Serial.print("% Heater PWM: ");
Serial.print(PWM_Heater_Percent);
Serial.println("%");
}
void lcdOutput() {
// set up the LCD's number of columns and rows:
// lcd.setCursor(0, 0); // top left
// lcd.setCursor(15, 0); // top right
// lcd.setCursor(0, 1); // bottom left
// lcd.setCursor(15, 1); // bottom right
/*
012345678901234567890
0 Soll: 38.5°C 65%
1 Ist: 36.2°C 58%
2 Heiz: 100% 100%
3 Wenden in 3,5h
*/
lcd.setCursor(0, 0);
lcd.print("Soll: ");
lcd.print(Humidity_Set, 1);
lcd.print("% ");
lcd.print(Temperature_Set, 1);
lcd.write(0xDF);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Ist: ");
lcd.print(Humidity, 1);
lcd.print("% ");
lcd.print(Temperature, 1);
lcd.write(0xDF);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("Heizung:");
if (PWM_Humidifier_Percent < 100) {
lcd.print(' ');
if (PWM_Humidifier_Percent < 10)
lcd.print(' ');
}
lcd.print(PWM_Humidifier_Percent);
lcd.print("% ");
if (PWM_Heater_Percent < 100) {
lcd.print(' ');
if (PWM_Heater_Percent < 10)
lcd.print(' ');
}
lcd.print(PWM_Heater_Percent);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print("Wenden");
if (wenden == 0)
lcd.print(": Aus");
if (wenden > 0) {
lcd.print(": in");
lcd.print(wenden);
lcd.print(" Sek.");
}
}
void analogMesure() {
// Humidity may be set between 40...99.9%C
// analogRead = 0 --> 40.0
// analogRead = 1023 --> 99.9
Humidity_Set = (analogRead(HumiditySetPin) / 17) + 40;
// Cut off after one decimal place
Humidity_Set = float(((int)(Humidity_Set*10))/10.0);
if (Humidity_Set > 99.9)
Humidity_Set = 99.9;
if (Humidity_Set < 40.0)
Humidity_Set = 40.0;
// Temperature may be set between 24...40°C
// analogRead = 0 --> 24.0
// analogRead = 1023 --> 40.0
Temperature_Set = ((float) analogRead(TemperatureSetPin) / 64.0) + 24.0;
// Cut off after one decimal place
Temperature_Set = float(((int)(Temperature_Set*10))/10.0);
if (Temperature_Set > 40.0)
Temperature_Set = 40.0;
if (Temperature_Set < 24.0)
Temperature_Set = 24.0;
}
Fragen gerne hier!
Das Einstellen der Temperatur geht über einen 10-Gang-Poti. Davon hab ich mal ein paar "geerbt" und nun endlich mal verbaut. Die Luftfeuchte über ein normales Poti. Das verstellt sich aber ab und zu, ist also Temp/Luftfeuchte-Sensitiv.
Besser wären Taster oder ein Encoder. Naja, nächste Version 
VG
Matthias
Lesezeichen