26-12-2015, 18:59
Witam.
Na samym początku zaznaczę, że jestem totalnym amatorem.
Zrobiłem mały układ który docelowo ma od godziny 11:00 do 19:00 załączać światło w moich trzech akwariach i w każdym z osobna ma mierzyć temperaturę (termometry to DS18b20 z przewodami) oraz załączać chłodzenie latem oraz wyświetlać podstawowe dane na wyświetlaczu.
Generalnie coś tam działa, ale nie do końca tak jak powinno.
Problemy jakie napotkałem to:
- przy załączaniu się przekaźników przygasa wyświetlacz,
- przy jednym z termometrów skok temperatury to 0,25 stopnia, dwa pozostałe podają temperaturę w setnych stopnia, czym to może być spowodowane? Rezystory mam tak jak na schemacie 4,7 Ohma, zamieniałem je, może coś z termometrem jest nie tak?
- zegar ( DS3231 ) na wyświetlaczu odlicza co dwie sekundy ( pewnie wina kodu mam fragmenty w nim z odniesieniem do ds1307 ).
Prośba moja o rady i może uproszczenie jakoś kodu.
Planuje w przyszłości wykorzystać pin 11 który odpowiada za włączenie oświetlenia do uzyskania efektu świtu i zmierzchu, tylko nie wiem jak się za to zabrać, tzn diodą sterować pwm potrafię, ale jak zadziałać na oświetlenie pod 230V, co dodatkowo jest potrzebne?
Poniżej schemat i kod.
Pozdrawiam.
Na samym początku zaznaczę, że jestem totalnym amatorem.
Zrobiłem mały układ który docelowo ma od godziny 11:00 do 19:00 załączać światło w moich trzech akwariach i w każdym z osobna ma mierzyć temperaturę (termometry to DS18b20 z przewodami) oraz załączać chłodzenie latem oraz wyświetlać podstawowe dane na wyświetlaczu.
Generalnie coś tam działa, ale nie do końca tak jak powinno.
Problemy jakie napotkałem to:
- przy załączaniu się przekaźników przygasa wyświetlacz,
- przy jednym z termometrów skok temperatury to 0,25 stopnia, dwa pozostałe podają temperaturę w setnych stopnia, czym to może być spowodowane? Rezystory mam tak jak na schemacie 4,7 Ohma, zamieniałem je, może coś z termometrem jest nie tak?
- zegar ( DS3231 ) na wyświetlaczu odlicza co dwie sekundy ( pewnie wina kodu mam fragmenty w nim z odniesieniem do ds1307 ).
Prośba moja o rady i może uproszczenie jakoś kodu.
Planuje w przyszłości wykorzystać pin 11 który odpowiada za włączenie oświetlenia do uzyskania efektu świtu i zmierzchu, tylko nie wiem jak się za to zabrać, tzn diodą sterować pwm potrafię, ale jak zadziałać na oświetlenie pod 230V, co dodatkowo jest potrzebne?
Poniżej schemat i kod.
Pozdrawiam.
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
#define DS1307_ADDRESS 0x68
#define RELAY_ON 0 // 0 means active low relay
#define RELAY_OFF 1
#define Relay_1 11 // Arduino Digital I/O pin number
OneWire ds_1(A0); //sensor 1 on pin 11
OneWire ds_2(A1); //sensor 2 on pin 12
OneWire ds_3(A2); //sensor 3 on pin 13
DallasTemperature sensor_1(&ds_1);
DallasTemperature sensor_2(&ds_2);
DallasTemperature sensor_3(&ds_3);
int nastaw = 26; // ustaw temperature
int przekaznik8 = 8; // pin przekaznik
int przekaznik9 = 9; // pin przekaznik
int przekaznik10 = 10; // pin przekaznik
byte state = LOW;
const char *monthName[12] = {
// "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze",
// "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"
"01", "02", "03", "04", "05", "06",
"07", "08", "09", "10", "11", "12"
};
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
float temp_1; //HLT
float temp_2; //Mash
float temp_3; //Boil
void setup() {
Wire.begin();
digitalWrite(Relay_1, RELAY_OFF);
pinMode(Relay_1, OUTPUT);
pinMode(przekaznik8, OUTPUT);
pinMode(przekaznik9, OUTPUT);
pinMode(przekaznik10, OUTPUT);
lcd.begin(20, 4);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
sensor_1.begin(); //initialize sensors
sensor_2.begin();
sensor_3.begin();
Serial.begin(9600);
}
void loop() {
printDate();
}
byte bcdToDec(byte val) {
return ( (val / 16 * 10) + (val % 16) );
}
void printDate() {
Wire.beginTransmission(DS1307_ADDRESS);
byte zero = 0x00;
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
if ((hour == 11 ) && (minute == 00))
digitalWrite(Relay_1, RELAY_ON);// set the Relay ON
if ((hour == 19) && (minute == 00))
digitalWrite(Relay_1, RELAY_OFF);// set the Relay OFF
sensor_1.requestTemperatures();
lcd.setCursor(0, 1);
lcd.print("Temp1: ");
lcd.print(sensor_1.getTempCByIndex(0));
lcd.print(" N:");
lcd.print(nastaw);
if (temp_1 < (nastaw)) {
digitalWrite(8, HIGH);
int val = digitalRead(8);
if (val)
lcd.setCursor(19, 1);
lcd.print("0");
} else {
lcd.setCursor(19, 1);
lcd.print("1");
digitalWrite(8, LOW);
}
sensor_2.requestTemperatures();
lcd.setCursor(0, 2);
lcd.print("Temp2: ");
lcd.print(sensor_2.getTempCByIndex(0));
lcd.print(" N:");
lcd.print(nastaw);
if (temp_2 < (nastaw)) {
digitalWrite(9, HIGH);
int val = digitalRead(9);
if (val)
lcd.setCursor(19, 2);
lcd.print("0");
} else {
lcd.setCursor(19, 2);
lcd.print("1");
digitalWrite(9, LOW);
}
sensor_3.requestTemperatures();
lcd.setCursor(0, 3);
lcd.print("Temp3: ");
lcd.print(sensor_3.getTempCByIndex(0));
lcd.print(" N:");
lcd.print(nastaw);
if (temp_3 < (nastaw)) {
digitalWrite(10, HIGH);
int val = digitalRead(10);
if (val)
lcd.setCursor(19, 3);
lcd.print("0");
} else {
lcd.setCursor(19, 3);
lcd.print("1");
digitalWrite(10, LOW);
}
tmElements_t tm;
if (RTC.read(tm)) {
lcd.setCursor (0, 0);
LCDprint2digits(tm.Hour);
lcd.print(':');
LCDprint2digits(tm.Minute);
lcd.print(':');
LCDprint2digits(tm.Second);
lcd.setCursor (9, 0);
lcd.print(tm.Day);
lcd.print('/');
lcd.print(monthName[tm.Month - 1]);
lcd.print('/');
lcd.print(tmYearToCalendar(tm.Year - 2000));
} else {
if (RTC.chipPresent()) {
lcd.println("DS1307 stoi. Uruchom Zegar");
}
else {
lcd.println("DS1307 blad oczczytu!");
lcd.println("sprawdz polaczenie");
}
}
}
void LCDprint2digits(int number) {
if (number >= 0 && number < 10) {
lcd.write('0');
}
lcd.print(number);
}