Rieccomi, dopo la bacchettata che mi hanno fatto su un tred simile posto degli aggiornamenti in modo poter portare a termine la cosa visto che finalmente sono riuscito ad andare avanti...
Il materiale hardware è abbastanza simile, ho aggiunto solo dei sensori più idonei per il livello dell'acqua e adesso l'umidificatore va alla grande, grazie al sensore Di umidità e temperatura HYT 221 ho una lettura della umidità più stabile e reale, per quanto riguarda la lettura di temperatura integrato su questo device non posso dire la stessa cosa, infatti mi sono dovuto affidare ad un'altro sensore più stabile sul rilievo DS18B20.
Nell'altro Trend mi avevano chiesto dove ho collegato l'alimetazione, Arduino Mega ADK è alimentato direttamente e tutti i device extra come : Dispaly , Joistik, Sensore di temperatura, Sensore di umidità, relè shield sono collegati all'alimentatore esterno, solo la shield rtc datalogger alloggia su arduino mega e preleva l'alimentazionee dalla scheda principale.
Non ho collegato servo motori per girare le uova ma appena risolverò questi problemi di stabilità sicuramente lo farò visto che il contenitore già possiede delle coppette girevoli ma manualmente.
ALtro particolare, usando il relè sulla resistenza on-off ho un'oscillazione di circa 0.20C° che non penso siano esagerati ma in ogni caso se la cosa si rileva un problema mi è stato nominato un Relè allo stato solido, nel caso non posso fare a meno, dove posso procurarmi un buon relè di questo tipo ?
per quanto rigurda lo skatch lo incollo in modo da cominciare ad analizzare nel concreto il lavoro fatto
Questa è la parte dove ho definito costanti e librerie
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
//Sensor DS18B20 Temperature
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
OneWire ds(3); //Pin Termometro
//End Temp Var
//Sensor HYT 221-I2C Humidity and temperature
#define HYT_ADDR 0x28
double humidity;
double temperature;
int b1,b2,b3,b4,rawHumidity,rawTemperature;
//RELE
/*
R2 //POMPA
R3 //UMIDIFICATORE
R4 //RESISTENZA
V1 //VENTOLA UMIDIFICATORE
*/
#define R1 24
#define R2 27
#define R3 26
#define R4 25
#define V1 41
//JoyStick
// x
// y
// z
#define JoyStick_X A0
#define JoyStick_Y A1
#define JoyStick_Z 4
//Livello acqua
#define PIN_S_ACQ 40
#define cleanstring " "
//RTC SD CARD
RTC_DS1307 RTC;
int OLD_TIME;
int OLD_R1 = 9;//0
int OLD_R2 = 9;//0
int OLD_R3 = 9;//1
int OLD_R4 = 9;//1
int OLD_V1 = 9;//0
int OLD_S_ACQ = 9;//0
unsigned long prewTimer1 = 0;
unsigned long prewTimer2 = 0;
//DISPLAY
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
float T,H,T2;
int x,y,z;
int S_ACQ = 0;
//RESSSS
byte cfg;
int16_t raw;
onestamente per ora non sono molto contento di come ho scritto il codice, appena comincerò a prendere familiarità con Arduino, sicuramente lo sistemerò alla grande
Setup
void setup(void) {
//OUTPUT DEFINITION
pinMode(R1,OUTPUT);
digitalWrite(R1,HIGH); //VENTOLA Grande
pinMode(R2,OUTPUT);
digitalWrite(R2,HIGH); //POMPA
pinMode(R3,OUTPUT); //UMIDIFICATO
digitalWrite(R3,HIGH);
pinMode(R4,OUTPUT); //RESISTENZA
digitalWrite(R4,HIGH);
pinMode(V1,OUTPUT);
digitalWrite(V1,LOW);
//JOYSTIK
pinMode (JoyStick_X, INPUT);
pinMode (JoyStick_Y, INPUT);
pinMode (JoyStick_Z, INPUT);
//Sensonre livello Acqua
pinMode (PIN_S_ACQ, INPUT);
S_ACQ = digitalRead(PIN_S_ACQ);
Wire.begin();
RTC.begin();
OLD_TIME = 0;
Serial.begin(9600);
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
//RTC.adjust(DateTime(__DATE__, __TIME__));
}
//DISPLAY
lcd.begin(20,4);
clean_display();
//lcd.noBacklight();
lcd.backlight();
}
LOOP
void loop(void) {
// read_joistick();
DateTime now = RTC.now();
if (OLD_TIME != now.second()) {
OLD_TIME = now.second();
T = getTemp();
delay(1500);
H = getHYT(1);
Serial.print("T: ");
Serial.print(T);
Serial.print("C H: ");
Serial.print(H);
Serial.println("%");
setRes();
setHum();
getAcq();
clean_display();
lcd.setCursor(0,0);
lcd.print("T:" + String(T));
lcd.setCursor(8,0);
lcd.print("C H:" + String(H) + " %");
}
}
Funzioni
float clean_display() {
lcd.setCursor(0,0);
lcd.print(cleanstring);
lcd.setCursor(0,1);
lcd.print(cleanstring);
lcd.setCursor(0,2);
lcd.print(cleanstring);
lcd.setCursor(0,3);
lcd.print(cleanstring);
}
float getHYT(char Type){
Wire.beginTransmission(HYT_ADDR); // Begin transmission with given device on I2C bus
Wire.requestFrom(HYT_ADDR, 4); // Request 4 bytes
if(Wire.available() == 4) {
b1 = Wire.read();
b2 = Wire.read();
b3 = Wire.read();
b4 = Wire.read();
Wire.endTransmission(); // End transmission and release I2C bus
rawHumidity = b1 << 8 | b2;
rawHumidity = (rawHumidity &= 0x3FFF);
humidity = 100.0 / pow(2,14) * rawHumidity;
b4 = (b4 >> 2); // Mask away 2 least significant bits see HYT 221 doc
rawTemperature = b3 << 6 | b4;
temperature = 165.0 / pow(2,14) * rawTemperature - 40;
switch (Type) {
case (1):
return humidity;
break;
case (0):
return temperature;
break;
default :
return humidity;
}
}
}
float setRes(){
if(T < 37.5){
if(OLD_R4 != 0){
OLD_R4 = 0;
digitalWrite(R4,LOW);
}
} else {
if(OLD_R4 != 1){
OLD_R4 = 1;
digitalWrite(R4,HIGH);
}
}
if(T == 00.00) {
digitalWrite(R4,HIGH);
}
}
float setHum() {
if(getHYT(1) < 60) {
if(OLD_R3 != 0){
OLD_R3 = 0;
digitalWrite(R3,LOW);
}
if(OLD_V1 != 1) {
OLD_V1 = 1;
delay(1500);
digitalWrite(V1,HIGH);
}
}else {
if(OLD_R3 != 1){
OLD_R3 = 1;
digitalWrite(R3,HIGH);
}
if(OLD_V1 != 0){
OLD_V1 = 0;
delay(1500);
digitalWrite(V1,LOW);
}
}
}
float getTemp(){
//error
if ( !ds.search(addr)) {
ds.reset_search();
}
//error
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
}
switch (addr[0]) {
case 0x10:
//Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
//Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
//Serial.println(" Chip = DS1822");
type_s = 0;
break;
//default:
//Serial.println("Device is not a DS18x20 family device.");
}
ds.reset();
ds.select(addr);
ds.write(0x44);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
OneWire::crc8(data, 8);
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 {
cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;
}
celsius = (float)raw / 16.0;
return celsius;
}
int getAcq(){
//Accendere pompa
S_ACQ = digitalRead(PIN_S_ACQ);
if(S_ACQ == 1) {
if(OLD_S_ACQ != 0){
Serial.println("Pompa accesa");
digitalWrite(R2,LOW);
OLD_S_ACQ = 0;
}
}else {
if(OLD_S_ACQ != 1){
digitalWrite(R2,HIGH);
Serial.println("Pompa spenta");
OLD_S_ACQ = 1;
}
}
}
int read_joistick(){
x = analogRead (JoyStick_X);
y = analogRead (JoyStick_Y);
z = digitalRead (JoyStick_Z);
}