Arduino Akvarie controller

Berätta om dina pågående projekt.
Arclight
Inlägg: 77
Blev medlem: 31 oktober 2013, 09:49:10

Arduino Akvarie controller

Inlägg av Arclight »

Ohh, nej inte en till...

Men visst e det så. jag har letat som en tok, men det jag hittat har antingen på tok för många funktioner, eller så är det inte samma komponenter.
Jag vill endast ha 2 funktioner (till att börja med iaf) och det ska tilläggas att jag är ganska ny på arduino och programmering men har fått ihop 2 fungerande projekt innan:)

Komponenterna jag har och har kopplat ihop är

Arduino Uno R3
DF Robot LCD Keypad shield http://www.dfrobot.com/wiki/index.php?t ... DFR0009%29
1307 RTC Module https://www.sparkfun.com/products/99
Dallas DS1829B Temp Sensor http://www.adafruit.com/products/381
4 Channel Relay module http://www.mhobbies.com/arduino-4-chann ... board.html
Allt funkar som det ska och jag har testat sketches för alla individuella komponenter.. men nu ska man ju bara få allt att samarbeta med.

De funktioner jag i stora drag är ute efter är så enkelt som på displayen ska visas klocka och temp, 2 av reläerna ska sättas av och på mellan olika tidpunkter (jepp exakt som en timer, eller rättare sagt som en dubbel timer för de ska kunna styras var för sig vid olika tider) och ett relä ska gå på om tempen överstiger 28 grader och stängas av.

Så min första fråga lyder.. är det möjligtvis någon som rent spontant vet en sida eller så med ett projekt som liknar detta och med de komponenter jag har?
Min andra fråga är, jag har testat 3-4 olika sketcher för klockan och dom funkar ju bra, men så fort jag drar ur strömmen så nollställs klockan och jag måste ställa in den igen.. det ska väl inte behövas då det sitter ett batteri på RTC modulen?

Dessa bla har jag testat men nu är det stop, har problem med att klockan inte sparar tiden, och vet inte riktigt hur jag ska forsätta med att kombinera ihop allt, så tips och råd vore av stor vikt just nu:)

Koden för tempsensorn har jag använt denna

Kod: Markera allt

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempProbe = { 0x28, 0xB0, 0x30, 0x7A, 0x05, 0x00, 0x00, 0x1B };
float tempC;

void setup(void)
{
Serial.begin(9600);
sensors.begin();
sensors.setResolution(tempProbe, 10);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("ReefControl Temp");

}
void printTempSerial(float temp)
{
Serial.print("Probe temperature is: ");
if (temp < -100) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(temp);
}
Serial.print("\n\r\n\r");
}

void LCDTemp(float temp)
{
lcd.setCursor(0,1);

if (temp < -100) {
lcd.print("Error: check connection");
} else {
lcd.print (temp);
lcd.print (" Celcius");
}
}

void loop(void)
{
sensors.requestTemperatures();
tempC = sensors.getTempC(tempProbe);
printTempSerial(tempC);
LCDTemp(tempC);

delay(2000);
}
Denna kod har jag kört för att ställa klockan, och det funkar ju bra ända till jag drar strömmen då resettas den igen:(

Kod: Markera allt

#include <Wire.h>
const int DS1307 = 0x68; // Address of DS1307 see data sheets
const char* days[] =
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const char* months[] =
{"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"};
 
// Initializes all values: 
byte second = 0;
byte minute = 0;
byte hour = 0;
byte weekday = 0;
byte monthday = 0;
byte month = 0;
byte year = 0;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  delay(2000); // This delay allows the MCU to read the current date and time.
 
  Serial.print("The current date and time is: ");
  printTime();
  Serial.println("Please change to newline ending the settings on the lower right of the Serial Monitor");
  Serial.println("Would you like to set the date and time now? Y/N");
 
  while (!Serial.available()) delay(10);
  if (Serial.read() == 'y' || Serial.read() == 'Y')
 
  // This set of functions allows the user to change the date and time
  {
    Serial.read();
    setTime();
    Serial.print("The current date and time is now: ");
    printTime();
  }
 
 
  Serial.println("Thank you.");
}

// Continuous function for converting bytes to decimals and vice versa
void loop() {
}
byte decToBcd(byte val) {
  return ((val/10*16) + (val%10));
}
byte bcdToDec(byte val) {
  return ((val/16*10) + (val%16));
}


// This set of codes is allows input of data
void setTime() {
  Serial.print("Please enter the current year, 00-99. - ");
  year = readByte();
  Serial.println(year);
  Serial.print("Please enter the current month, 1-12. - ");
  month = readByte();
  Serial.println(months[month-1]);
  Serial.print("Please enter the current day of the month, 1-31. - ");
  monthday = readByte();
  Serial.println(monthday);
  Serial.println("Please enter the current day of the week, 1-7.");
  Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - ");
  weekday = readByte();
  Serial.println(days[weekday-1]);
  Serial.print("Please enter the current hour in 24hr format, 0-23. - ");
  hour = readByte();
  Serial.println(hour);
  Serial.print("Please enter the current minute, 0-59. - ");
  minute = readByte();
  Serial.println(minute);
  second = 0;
  Serial.println("The data has been entered.");
 
  // The following codes transmits the data to the RTC
  Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekday));
  Wire.write(decToBcd(monthday));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(byte(0));
  Wire.endTransmission();
  // Ends transmission of data
}


byte readByte() {
  while (!Serial.available()) delay(10);
  byte reading = 0;
  byte incomingByte = Serial.read();
  while (incomingByte != '\n') {
    if (incomingByte >= '0' && incomingByte <= '9')
      reading = reading * 10 + (incomingByte - '0');
    else;
    incomingByte = Serial.read();
  }
  Serial.flush();
  return reading;
}


void printTime() {
  char buffer[3];
  const char* AMPM = 0;
  readTime();
  Serial.print(days[weekday-1]);
  Serial.print(" ");
  Serial.print(months[month-1]);
  Serial.print(" ");
  Serial.print(monthday);
  Serial.print(", 20");
  Serial.print(year);
  Serial.print(" ");
  if (hour > 12) {
    hour -= 12;
    AMPM = " PM";
  }
  else AMPM = " AM";
  Serial.print(hour);
  Serial.print(":");
  sprintf(buffer, "%02d", minute);
  Serial.print(buffer);
  Serial.println(AMPM);
}


void readTime() {
  Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.endTransmission();
  Wire.requestFrom(DS1307, 7);
  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read());
  weekday = bcdToDec(Wire.read());
  monthday = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}
Och kör jag ex denna (jag har testat flera, även sånna jag kan använda knapparna på lcd´n för att ställa tiden) så funkar det bra ända tills jag drar strömmen som sagt)

Kod: Markera allt

/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
*
*/

#include <Time.h> 
#include <Wire.h> 
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t
#include <LiquidCrystal.h> 
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
void setup()  {
  lcd.begin(16, 2);
 
 

  Serial.begin(9600);
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus()!= timeSet)
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");
    
}

void loop()
{
   digitalClockDisplay(); 
   delay(1000);
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
 
lcd.setCursor(2, 0);                                            // Set LCD cursor position (column, row)
lcd.print(hour());
lcd.print(":");
lcd.print (minute());
lcd.print(" ");
lcd.print(second());
lcd.print(" ");
lcd.print("Uhr");
lcd.setCursor(3, 1);                                           // Set LCD cursor position (column,row) 
lcd.print(day());
lcd.print(".");
lcd.print(month());
lcd.print(".");
lcd.print(year());

// Print text to LCD
                                     // Delay to read text
                               // Clear the display

}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}
Arclight
Inlägg: 77
Blev medlem: 31 oktober 2013, 09:49:10

Re: Arduino Akvarie controller

Inlägg av Arclight »

ok, lyckades få igång en funktion, denna kod funkar iaf så att relä 1 slår på när tempen går över 28 grader och stänger av igen när den går tillbaka under, en liten bit på väg iaf:)

Kod: Markera allt

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define ONE_WIRE_BUS 2
#define RELAY1  3                        
#define RELAY2  11                        
#define RELAY3  12                        
#define RELAY4  13

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempProbe = { 0x28, 0xB0, 0x30, 0x7A, 0x05, 0x00, 0x00, 0x1B };
float tempC;

void setup(void)
{
Serial.begin(9600);
    pinMode(RELAY1, OUTPUT);       
    pinMode(RELAY2, OUTPUT);
    pinMode(RELAY3, OUTPUT);
    pinMode(RELAY4, OUTPUT);
sensors.begin();
sensors.setResolution(tempProbe, 10);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("ReefControl Temp");

}
void printTempSerial(float temp)
{
Serial.print("Probe temperature is: ");
if (temp < -100) {
Serial.print("Error getting temperature");
} else {
Serial.print("C: ");
Serial.print(temp);
}
Serial.print("\n\r\n\r");
}

void LCDTemp(float temp)
{
lcd.setCursor(0,1);

if (temp < -100) {
lcd.print("Error: check connection");
} else {
lcd.print (temp);
lcd.print (" Celcius");
}
}

void loop(void)
{
sensors.requestTemperatures();
tempC = sensors.getTempC(tempProbe);
printTempSerial(tempC);
LCDTemp(tempC);
if (tempC > 28)
{
  digitalWrite(RELAY1,HIGH);
}
else
{
  digitalWrite(RELAY1,LOW);
}
delay(2000);
}
X-IL
EF Sponsor
Inlägg: 8479
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Arduino Akvarie controller

Inlägg av X-IL »

Intressant, jag håller precis på att researcha lite för en liknande manick. Jag är dock mer intresserad av pH-värde och helst CO2 men de sensorerna är så dyra.
Har tyvärr inte tid att sätta mig in i din kod nu, men ska kolla ikväll eller så.

Relät som ska dra vid 28 grader, är det för fläktkylning av ytan eller för att pumpa vatten genom en kylare?
nomis_82
Inlägg: 444
Blev medlem: 10 juli 2011, 20:18:07
Ort: Linköping

Re: Arduino Akvarie controller

Inlägg av nomis_82 »

Hej gjorde något liknande i vintras som var till för att styra en motorvärmare på bilen använde pdc8544 display som i en Nokia 5110 men samma temp sensor och rc modul använder också eprom för att spara parametrar när strömmen är frånkopplad. Är på semester så jag har inte så mycket mer info just nu men du kanske kan få någon nytta av koden.. Hoppas länken funkar. https://codebender.cc/sketch:22038

/Simon
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Arduino Akvarie controller

Inlägg av Jonaz »

Kod: Markera allt

   // Initializes all values: 
byte second = 0;
byte minute = 0;
byte hour = 0;
byte weekday = 0;
byte monthday = 0;
byte month = 0;
byte year = 0;

  
Nollställer inte detta klockan?
Arclight
Inlägg: 77
Blev medlem: 31 oktober 2013, 09:49:10

Re: Arduino Akvarie controller

Inlägg av Arclight »

Tack för tip, jo det är en fläkt som ska styras, akvariet jag har är bara ett litet pico dvs det ligger endast på 17L (+ytterfilter på 9L) och nu när sommaren kommit så springer tempen iväg uppåt 28-30 grader vilket inte är bra alls, tom direkt dödligt för mina koraller, och även att det är till storleken litet så kostar det ju en del ändå. och jo, ph hade varit fint, men det känns lite för bökigt just nu eftersom jag inte använder det för tillfället, jag har haft ett 375L växt akvarie som jag körde co2 med ph controller och det var ju ett litet meck med att kalibrera proben mm, men co mätare.. finns det? trodde man bara utgick efter ph där och reglerar co2 så att du får rätt ph balans, annars är ju inte ett ph kit så farligt dyrt, finns på ebay för ca 500.

ang min rtc modul så börjar jag tvivla på om den inte kanske är defekt, läste någonstans att batteribackuphållaren är av dålig kvalite och det finns en fix för det där man får löda om lite grejjer, är inte helt säker på att det gällde just den jag har dock.
För som jag förstått so jo, visst ska det vara så att efter du ställt den så ska den hålla tiden även om man drar ur strömförsörjningen.

Att använda eprom vet jag inte om jag behöver. sketchen sparas väl i arduinons eprom och där ligger ju den info den behöver, vilket just nu bara är 2 tidsintervaller samt en temp nivå, jag har inga problem med att koppla in den i datorn om jag skulle vilja ändra på dessa tider, även om det hade varit lite coolt att ha ett menysystem för knapparna och kunna ändra och spara information utan det, men det får bli ett senare projekt, det är ju även lite bråttom att få det att fungera då värmen redan stigit i huset, jag kan ju iofs redan börja använda den för just fläktstyrningen, sa dagen uppgift blir att leta upp min gamla scythe ita fläkt, som är tunn tyst och mycket effektiv, har använt den tidigare när jag moddade min xtreamer mediaplayer:) tack för din kod nomis, ska se om det är nåt där jag kan använda:)

Vet inte Jonaz om det är det som ställer till problem, men klockan går går tillbaka till 1970 01 01 så om det vore det borde den väl bli 00 00 00?
X-IL
EF Sponsor
Inlägg: 8479
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Arduino Akvarie controller

Inlägg av X-IL »

Nej tiden räknas från 1:a januari 1970.
Arclight
Inlägg: 77
Blev medlem: 31 oktober 2013, 09:49:10

Re: Arduino Akvarie controller

Inlägg av Arclight »

Jo men är det meningen att den ska göra det då?
Vad är i så fall meningen med batteriet?

här är iaf en liten bild på projektet så här långt:) Hela projektet med fler bilder finns på http://magnuslofdahl.com/?page_id=979
Bild
X-IL
EF Sponsor
Inlägg: 8479
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Arduino Akvarie controller

Inlägg av X-IL »

Jag menade bara att om du sätter tiden till 0 med den koden som visades så kommer du sannolikt läsa ut tiden 1970-01-01 00:00:00 precis i det ögonblicket. Men varför tiden nollställs har jag inte analyserat, såg bara Jonaz kommentar.

EDIT: Kollade lite på koden och det verkar ju inte vara initialiseringen som förstör iaf. Ser jag rätt körs ju bara wire.write när du faktiskt ändrat värdena med setTime.

EDIT2: Ser inte var i din kod som du faktiskt sätter systemtiden, bara att du skriver tiden till RTC:n, och läser ut den vid ReadTime(), du är säker på att inte RTC:n faktiskt har rätt tid men du skriver ut tiden från systemklockan som du inte satt till RTC-tiden? Kanske blev svårt att hänga med i mitt resonemang.
X-IL
EF Sponsor
Inlägg: 8479
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Arduino Akvarie controller

Inlägg av X-IL »

Läste igenom databladet nu, det verkar ju på nåt vis som att du inte har kontakt med batteriet alternativ att batteriet är tomt? Om vi förutsätter att du efter att ha skrivit tiden till RTC-kortet kan läsa ut den igen från RTC-kortet och att samma utläsning efter kallstart inte ger den riktiga tiden.

Måste nog beställa en att testa lite med.
Arclight
Inlägg: 77
Blev medlem: 31 oktober 2013, 09:49:10

Re: Arduino Akvarie controller

Inlägg av Arclight »

Batteriet verkar ok, jag testade med multimetern och det visar 3.3v.

Jag har nog testa 5-6 oliak koder för att ställa tiden men den tappar åndå, så jo jag börjar tro på hårdvarufel:/
X-IL
EF Sponsor
Inlägg: 8479
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Arduino Akvarie controller

Inlägg av X-IL »

Har du kollat lödningar och mätt batterispänningen så nära chippet som möjligt?
Användarvisningsbild
FormerMazda
Inlägg: 6442
Blev medlem: 27 februari 2006, 14:59:36
Ort: Asby (Östergötland)

Re: Arduino Akvarie controller

Inlägg av FormerMazda »

Mät på de inringade benen, där ska du ha batteriets spänning.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino Akvarie controller

Inlägg av orvar-e »

Mycket intressant projekt. :)
Arclight
Inlägg: 77
Blev medlem: 31 oktober 2013, 09:49:10

Re: Arduino Akvarie controller

Inlägg av Arclight »

Tack, ska kolla upp rtc modulen och se om det finns spänning vid de markerade benen, givetvis så limmade jag ju fast den med smältlim så jag hoppas bara jag kan få bort den utan att den går sönder, värsta fall får jag beställa en ny.
Skriv svar