komputer akwariowy

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

komputer akwariowy

Post autor: adrian1311 » 19 sty 2016, 19:48

Witam serdecznie! Zachwycony rzeczami które ludzie wyczyniają w arduino również sobie takie zakupiłem. Chciałem stworzyć komputer akwariowy w którym mógłbym sterować różnymi rzeczami, tzn.:
- sterowanie pompami perystaltycznymi - do podawania nawozów - wymyśliłem, że przez przełącznik - na 4 kanały będę sobie sterował pompami - pompy będą podłączone na 12V z zasilacza, a ja korzystając z modułu RTC DS1307 będę panował nad czasem. Wystarczy 1 raz dziennie, że odpowiednie pompy będą się załączać na odpowiedni czas
- sterowanie podawaniem CO2 w akwarium - do tego również przełącznik - elektrozawór będzie włączał podawanie co2 z butli wysokociśnieniowej, aż do osiągnięcia odpowiedniego pH, a później będzie się wyłączał i tak w kółko do utrzymywania odpowiedniego pH, a pośrednio oczywiście wysycenia wody w CO2
- na wyświetlaczu LCD będzie wyświetlana temperatura, czas - do temperatury podłączam sensor ds18b20

Mniej więcej części już mam, no ale jest oczywiście problem z kodem. Chciałbym móc sterować tymi funkcjami z poziomu arduino i przycików (tact switch). Mam kilka problemów:
1)z użytej z tej strony schematu drabinki rezystorowej ze stroony majsterkowo (niestety nie mogę dodawać linków, jestem nowym użytkownikiem, ale jak wpiszecie drabinka rezystorowa arduino to na pewno coś wam wyleci) nie wiem jak "przypisać" odpowiedni przycisk do funkcji - mianowicie jeśli wychodzą mi jakieś zakresy i jest to przycisk nr 1 chciałbym żeby był on przypisany jako przycisk <do góry>. Analogicznie nr2 - <do dołu>, 3 - <ok>, 4 - <cofnij>, 5 - <menu>. Mam skorzystać ze zmiennej char? int? nie bardzo wiem jakie rozwiązanie będzie dobre.
2) za cholerę nie mogę pojąć jak zrobić menu w arduino - szukałem na różnych stronach, ale nigdzie nie jest to tak wytłumaczone, aby krok po kroku zrobić menu. Czy macie coś, gdzieś gdzie można się tego nauczyć, ja szukałem ale jednak coraz bardziej się zniechęcałem

Na razie chciałbym rozwiązać te problemy. Mam nadzieję że pomożecie, ja nie jestem informatykiem i nie jest dla mnie tak jak dla dużej liczby inżynierów wszystko jasne, liczę na wyrozumiałość.
Pozdrawiam serdecznie

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


crobe
Majsterkowicz
Posty: 114
Rejestracja: 14 gru 2015, 17:56
Lokalizacja: Brzozów
Kontakt:

Re: komputer akwariowy

Post autor: crobe » 19 sty 2016, 22:09

Jeszcze nie dopisałeś o świetle i podajniku pokarmu :)

A tak serio nie za wysoko mierzysz jak na pierwszy projekt ?

Fajny taki sterownik ale jak myślisz dlaczego kosztują z 400 :)

Sonda Ph chyba wymaga dodatkowej elektroniki, ale pewny nie jestem.
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: komputer akwariowy

Post autor: arduino-lab » 19 sty 2016, 22:20

Może zacznij od tego, aby projekt uruchomić bez sterowania klawiaturą, bez menu. Najpierw opanuj działanie tych podzespołów, które posiadasz. Zacznij pisać kod...

Na pierwszy ogień weź czujnik temperatury i wyświetlanie pomiaru na wyświetlaczu. Poradników jest mnóstwo tutaj, w Internecie, nawet na mojej stronie coś się znajdzie. Ale proszę:

Pierwsza strona na głównej "Zrób to sam" oraz na drugiej i trzeciej stronie przydadzą Ci się artykuły:
1. Czujnik DHT21 (AM2301) i Arduino,
2. Termometr z wyświetlaczem LCD,
3. Arduino zegar ds3231 z dużą czytelną czcionką.
Pewnie jakbym przeglądał dalej, byłoby ich więcej

Odnośnie sterowania wszelkiego rodzaju pompami, grzałkami, filtrami, napowietrzaczami chociażby:
1. Podlewaczka

Mało tego..., Kategorie - Arduino: tam na pierwszej i drugiej stronie masz rozwiązania Twoich problemów. Przebrnij przez opanowanie każdego elementu z osobna. Zapisz sobie kody programów. A potem je połącz po kolei dodając jeden do drugiego. Na dzień dzisiejszy nie jest Ci potrzebne sterowanie, bo te możesz zrealizować wewnątrz kodu. Na końcu dorobisz fajne menu :) I nie denerwuj się, bo to tylko dobra rada.
Swoją drogą chyba popełnię taki sterownik na Arduino właśnie.
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 23 sty 2016, 18:22

Witam ponownie. Zacząłem za namową pisać kod wygląda on tak:

Kod: Zaznacz cały

/*
*  LCM1602 & Arduino Uno
*  VCC - > 5 V
*  GND - GND
*  SCL -> A5
*  SDA -> A4
*/
//definicja wyświetlacza
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
//temperatura na onewire
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
//definicja zegara
#include <Time.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

//podłączenie temperatury przez onewire
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  
//zegar rozpoczęcie

 lcd.begin(16,2);   // Inicjalizacja LCD 2x16
 lcd.backlight(); // zalaczenie podwietlenia 
 lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0
 lcd.print("Komputer akwa");
 delay(1000); 
 lcd.clear();
 sensors.begin();//start biblioteki z onewire

}
void loop() {
  {
  //zegar wysw godziny przez serial
  tmElements_t tm;
  RTC.read(tm);{
    lcd.setCursor(0,0);
    LCDprint2digits(tm.Hour);
    lcd.print(':');
    LCDprint2digits(tm.Minute);
    lcd.print(':');
    LCDprint2digits(tm.Second);
    lcd.setCursor (0,1);
    lcd.print(tm.Day);
    lcd.print('/');
    lcd.print(monthName[tm.Month-1]);
    lcd.print('/');
    lcd.print(tmYearToCalendar(tm.Year));
  }

}
{
 sensors.requestTemperatures(); // Send the command to get temperatures
  lcd.setCursor(10,0);
 lcd.print("T:");
 lcd.print(sensors.getTempCByIndex(0));
}
 
}


void LCDprint2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);}

Niestety mam przy nim mały problem: Wyswietlający się zegar ma zwiechy i czasem sekunda nie trwa sekundy - czasem widać że odliczanie trwa 1 sek, a czasem 1,5 sek. Jak temu zaradzić? Widzę, że dzieje się tak wtedy gdy włączę funkcję z termometrem który jest po onewire połączony co rtc 1307. Pozdrawiam
Ostatnio zmieniony 23 sty 2016, 19:49 przez adrian1311, łącznie zmieniany 1 raz.
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: komputer akwariowy

Post autor: stiven » 23 sty 2016, 19:06

By trzeba było wyświetlanie zrobić w przerwaniu zegarowym.
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 28 sty 2016, 21:48

Niestety nie wiem gdzie to wstawić. Możecie mi podpowiedzieć między które linie kodu? Bo nie wiem za bardzo jak to zrobić, tzn. próbuję w różnych miejscach ale rezultat jest ten sam.
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: komputer akwariowy

Post autor: arduino-lab » 28 sty 2016, 21:53

Może wielozadaniowość korzystając na przykład z biblioteki leOS2?
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: komputer akwariowy

Post autor: stiven » 28 sty 2016, 22:01

adrian1311 pisze:Niestety nie wiem gdzie to wstawić. Możecie mi podpowiedzieć między które linie kodu? Bo nie wiem za bardzo jak to zrobić, tzn. próbuję w różnych miejscach ale rezultat jest ten sam.
Jak masz przygotowane przerwanie, to w funkcji wywoływanej przy przerwaniu dajesz obsługę wyświetlacza.
arduino-lab pisze:Może wielozadaniowość korzystając na przykład z biblioteki leOS2?
Nie znam tej biblioteki, ale wygląda dosyć skomplikowanie i chyba nie jest potrzebna aż tak rozbudowana. Ja znam TimerOne.h, ustawia się tylko co ile ma być przerwanie i jaka funkcja ma być wywołana przy przerwaniu. Do tego wystarczy, co nie znaczy, że nie można użyć tamtej.

EDIT

Tak będzie wyglądał kod z tą biblioteką TimerOne.
Link do biblioteki https://code.google.com/archive/p/ardui ... /downloads
Spoiler:
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 28 sty 2016, 22:35

Ok, wstawiłem kod. Teraz nic się nie wyświetla. Podświetlony jest jedynie ekran
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: komputer akwariowy

Post autor: stiven » 28 sty 2016, 22:46

Nie wiem dlaczego. Spróbuj zmienić ten czas na większy, co 1 sekundę może, czyli 1000000 us.
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 28 sty 2016, 23:48

Nic się nie zmienia ... a jak wyglądałoby to bez timera ale z funkcją interrupt? czytałem o przerwaniach, ale nie rozumiem ich...
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: komputer akwariowy

Post autor: arduino-lab » 29 sty 2016, 14:00

Przy wykorzystaniu biblioteki leOS2:

Kod: Zaznacz cały

/*
*  LCM1602 & Arduino Uno
*  VCC - > 5 V
*  GND - GND
*  SCL -> A5
*  SDA -> A4
*/
//definicja wyświetlacza
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
//temperatura na onewire
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
//definicja zegara
#include <Time.h>
#include <DS1307RTC.h>

// wielowatkowosc
#include "leOS2.h"
leOS2 threads;
int czas_godzina = 1000;
int czas_temperatura = 2000;
//

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

//podłączenie temperatury przez onewire
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  
//zegar rozpoczęcie

 lcd.begin(16,2);   // Inicjalizacja LCD 2x16
 lcd.backlight(); // zalaczenie podwietlenia 
 lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0
 lcd.print("Komputer akwa");
 delay(1000); 
 lcd.clear();
 sensors.begin();//start biblioteki z onewire

//wielowatkowosc
  threads.begin(threads.convertMs(15000));
  threads.addTask(wyswietl_czas, threads.convertMs(czas_godzina), SCHEDULED_IMMEDIATESTART);
  threads.addTask(wyswietl_temperature, threads.convertMs(czas_temperatura), SCHEDULED_IMMEDIATESTART);
//

}

void wyswietl_czas {
  tmElements_t tm;
  RTC.read(tm);{
    lcd.setCursor(0,0);
    LCDprint2digits(tm.Hour);
    lcd.print(':');
    LCDprint2digits(tm.Minute);
    lcd.print(':');
    LCDprint2digits(tm.Second);
    lcd.setCursor (0,1);
    lcd.print(tm.Day);
    lcd.print('/');
    lcd.print(monthName[tm.Month-1]);
    lcd.print('/');
    lcd.print(tmYearToCalendar(tm.Year));
  }
}

void LCDprint2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}

void wyswietl_temperature {
 sensors.requestTemperatures(); // Send the command to get temperatures
  lcd.setCursor(10,0);
 lcd.print("T:");
 lcd.print(sensors.getTempCByIndex(0));
}

void loop() {
}
Co dwie sekundy temperatura, co sekundę czas. Nie jestem pewien, ale chyba trzeba jeszcze zakomentować include Time.h.
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 29 sty 2016, 18:23

Nadal kicha, nie działa nadal płynnie. Teraz czas odświeża się co jakieś 2 albo 1 sek, ale ta 1 sek wcale nie trwa 1 sek. O co chodzi?
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 29 sty 2016, 18:42

panowie wielkie dzięki za pomoc. Problem był baaaaaardzo prozaiczny jak sie okazuje :p. W definicji wyświetlacza i onewire pokrywał się pin - był to pin nr4 - zajmując również na wyświetlaczu poz. przypisaną - register/select. Po przestawieniu onewire na pin 9 wszystko śmiga. Oto ostateczny kod. Dzięki za chwilową pomoc, biorę się niedługo za ustawianie relayów pod pompy. Jesteśmy w kontakcie :-)

Kod: Zaznacz cały



/*
*  LCM1602 & Arduino Uno
*  VCC - > 5 V
*  GND - GND
*  SCL -> A5
*  SDA -> A4
*/
//definicja wyświetlacza
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
//temperatura na onewire
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
//definicja zegara
#include <Time.h>
#include <DS1307RTC.h>
const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

//podłączenie temperatury przez onewire
#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
 lcd.begin(16,2);   // Inicjalizacja LCD 2x16
 lcd.backlight(); // zalaczenie podwietlenia 
 lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0
 lcd.print("Komputer akwa");
 delay(1000); 
 lcd.clear();
}
void loop() {
  {
  //zegar wysw godziny przez serial
  tmElements_t tm;

  RTC.read(tm);
  {
    lcd.setCursor(0,0);
    LCDprint2digits(tm.Hour);
    lcd.print(':');
    LCDprint2digits(tm.Minute);
    lcd.print(':');
    LCDprint2digits(tm.Second);    
    lcd.setCursor (0,1);
    lcd.print(tm.Day);
    lcd.print('/');
    lcd.print(monthName[tm.Month-1]);
    lcd.print('/');
    lcd.print(tmYearToCalendar(tm.Year));
  }
}
{
  sensors.requestTemperatures();
  lcd.setCursor(10,0);
  lcd.print("T:");
  lcd.print(sensors.getTempCByIndex(0));  
}
}
void LCDprint2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}


adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 3 maja 2016, 19:31

Witam ponownie! Długo mnie nie było ale poprawiłem kod, tak aby działały w nim 4ry przekaźniki które włączą na 10 sekund każdą z pomp. Wyświetlacz wyświetla już czas, datę, temperaturę. Troszkę przygasa na czas włączania przekaźników, ale ostatecznie będą one zasilane prawdopodobnie z zewnętrznego zasilacza przez przetwornicę step-down.
Obecnie kod wygląda tak:

Kod: Zaznacz cały


/*
*  LCM1602 & Arduino Uno
*  VCC - > 5 V
*  GND - GND
*  SCL -> A5
*  SDA -> A4
*/
//definicja wyświetlacza
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
//temperatura na onewire
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
//definicja zegara
#include <Time.h>
#include <DS1307RTC.h>
const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

//podłączenie temperatury przez onewire
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//definicja przkznikow
#define przekaznik1 7
#define przekaznik2 8
#define przekaznik3 9
#define przekaznik4 12
//1wszy przekaznik
int godz1_ON=19;  
int minuta1_ON=30;
int sekunda1_ON=00;
int godz1_OFF=19;  
int minuta1_OFF=30;
int sekunda1_OFF=10;
//2gi przekaznik
int godz2_ON=19;  
int minuta2_ON=30;
int sekunda2_ON=11;
int godz2_OFF=19;  
int minuta2_OFF=30;
int sekunda2_OFF=21;
//3ci przekanik
int godz3_ON=19;  
int minuta3_ON=30;
int sekunda3_ON=22;
int godz3_OFF=19;  
int minuta3_OFF=30;
int sekunda3_OFF=32;
//4ty przekaznik
int godz4_ON=19;  
int minuta4_ON=30;
int sekunda4_ON=33;
int godz4_OFF=19;  
int minuta4_OFF=30;
int sekunda4_OFF=43;

void setup() {
 lcd.begin(16,2);   // Inicjalizacja LCD 2x16
 lcd.backlight(); // zalaczenie podwietlenia 
 lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0
 lcd.print("Komputer akwa");
 delay(1000); 
 lcd.clear();

// ustawiamy piny Arduino odpowiadające za nasz przekaźnik
  pinMode(przekaznik1, OUTPUT);
  digitalWrite(przekaznik1, HIGH);
  pinMode(przekaznik2, OUTPUT);
  digitalWrite(przekaznik2, HIGH);
  pinMode(przekaznik3, OUTPUT);
  digitalWrite(przekaznik3, HIGH);
  pinMode(przekaznik4, OUTPUT);
  digitalWrite(przekaznik4, HIGH);
 
}
void loop() {
  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 (0,1);
    lcd.print(tm.Day);
    lcd.print('/');
    lcd.print(monthName[tm.Month-1]);
    lcd.print('/');
    lcd.print(tmYearToCalendar(tm.Year));
 } else {
     if (RTC.chipPresent()) {
      lcd.setCursor(0,0);
      lcd.print("Zegar zatrzymany!");
      
    } else {
       lcd.setCursor(0,0);
       lcd.print("Blad odczytu!");
    } 
  }
{
  sensors.requestTemperatures();
  lcd.setCursor(10,0);
  lcd.print("T:");
  lcd.print(sensors.getTempCByIndex(0));  
}
//1szy przekaznik
if((godz1_ON==tm.Hour)&&(minuta1_ON==tm.Minute)&&(sekunda1_ON==tm.Second))
   {
    digitalWrite(przekaznik1, LOW);
   }

  if((godz1_OFF==tm.Hour)&&(minuta1_OFF==tm.Minute)&&(sekunda1_OFF==tm.Second))
  {
   digitalWrite(przekaznik1, HIGH);
  }
//2gi przekaznik
if((godz2_ON==tm.Hour)&&(minuta2_ON==tm.Minute)&&(sekunda2_ON==tm.Second))
   {
    digitalWrite(przekaznik2, LOW);
   }

  if((godz2_OFF==tm.Hour)&&(minuta2_OFF==tm.Minute)&&(sekunda2_OFF==tm.Second))
  {
   digitalWrite(przekaznik2, HIGH);
  }
//3ci przekaznik
if((godz3_ON==tm.Hour)&&(minuta3_ON==tm.Minute)&&(sekunda3_ON==tm.Second))
   {
    digitalWrite(przekaznik3, LOW);
   }

  if((godz3_OFF==tm.Hour)&&(minuta3_OFF==tm.Minute)&&(sekunda3_OFF==tm.Second))
  {
   digitalWrite(przekaznik3, HIGH);
  }
//4ty przekaznik
if((godz4_ON==tm.Hour)&&(minuta4_ON==tm.Minute)&&(sekunda4_ON==tm.Second))
   {
    digitalWrite(przekaznik4, LOW);
   }

  if((godz4_OFF==tm.Hour)&&(minuta4_OFF==tm.Minute)&&(sekunda4_OFF==tm.Second))
  {
   digitalWrite(przekaznik4, HIGH);
  }
}

void LCDprint2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}
Chciałbym zrobić menu, aby poprzez nie zmieniać wartości sekunda1_OFF, sekunda2_OFF, tak aby możliwe było zmiana czasu włączenia/wyłączenia przekaźnika-->pompy-->nawozu, gdyż akwarium jest w miarę stabilne, ale jednak niektóre parametry trzeba zmieniać. Czy macie jakiś prosty sposób na menu? Chciałem zrobić je z 5 przycisków stosując drabinkę rezystorową. Czy może jakieś inne pomysły?
Jeśli macie gdzieś łatwy tutorial menu, to chętnie poczytam, ale ja szukałem i niestety sprawa menu nie jest tam klarownie wytłumaczona.
Pozdrawiam

Edycja:
Dodałem 5 przycisków z drabinką rezystorową - jak przypisać wartości ile odpowiednie akcje tzn. ile=1 - przycisk (OK), ile=2 - przycisk (strzałka w górę), ile=3 (strzałka w dół), ile=4 (powrót), ile=5 (menu). Podaję poprawiony kod

Kod: Zaznacz cały

/*
*  LCM1602 & Arduino Uno
*  VCC - > 5 V
*  GND - GND
*  SCL -> A5
*  SDA -> A4
*/
//definicja wyświetlacza
#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
//temperatura na onewire
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
//definicja zegara
#include <Time.h>
#include <DS1307RTC.h>
const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

//podłączenie temperatury przez onewire
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//definicja przkznikow
#define przekaznik1 7
#define przekaznik2 8
#define przekaznik3 9
#define przekaznik4 12
//1wszy przekaznik
int godz1_ON=19;  
int minuta1_ON=30;
int sekunda1_ON=00;
int godz1_OFF=19;  
int minuta1_OFF=30;
int sekunda1_OFF=10;
//2gi przekaznik
int godz2_ON=19;  
int minuta2_ON=30;
int sekunda2_ON=11;
int godz2_OFF=19;  
int minuta2_OFF=30;
int sekunda2_OFF=21;
//3ci przekanik
int godz3_ON=19;  
int minuta3_ON=30;
int sekunda3_ON=22;
int godz3_OFF=19;  
int minuta3_OFF=30;
int sekunda3_OFF=32;
//4ty przekaznik
int godz4_ON=19;  
int minuta4_ON=30;
int sekunda4_ON=33;
int godz4_OFF=19;  
int minuta4_OFF=30;
int sekunda4_OFF=43;
//zmienne drabinki rezystorowej
int buttonPin = 2;
int buttonValue;
int ile;

void setup() {
 lcd.begin(16,2);   // Inicjalizacja LCD 2x16
 lcd.backlight(); // zalaczenie podwietlenia 
 lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0
 lcd.print("Komputer akwa");
 delay(1000); 
 lcd.clear();
 Serial.begin(9600);

// ustawiamy piny Arduino odpowiadające za nasz przekaźnik
  pinMode(przekaznik1, OUTPUT);
  digitalWrite(przekaznik1, HIGH);
  pinMode(przekaznik2, OUTPUT);
  digitalWrite(przekaznik2, HIGH);
  pinMode(przekaznik3, OUTPUT);
  digitalWrite(przekaznik3, HIGH);
  pinMode(przekaznik4, OUTPUT);
  digitalWrite(przekaznik4, HIGH);
 
}
void loop() {
  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 (0,1);
    lcd.print(tm.Day);
    lcd.print('/');
    lcd.print(monthName[tm.Month-1]);
    lcd.print('/');
    lcd.print(tmYearToCalendar(tm.Year));
 } else {
     if (RTC.chipPresent()) {
      lcd.setCursor(0,0);
      lcd.print("Zegar zatrzymany!");
      
    } else {
       lcd.setCursor(0,0);
       lcd.print("Blad odczytu!");
    } 
  }
{
  sensors.requestTemperatures();
  lcd.setCursor(10,0);
  lcd.print("T:");
  lcd.print(sensors.getTempCByIndex(0));  
}
//1szy przekaznik
if((godz1_ON==tm.Hour)&&(minuta1_ON==tm.Minute)&&(sekunda1_ON==tm.Second))
   {
    digitalWrite(przekaznik1, LOW);
   }

  if((godz1_OFF==tm.Hour)&&(minuta1_OFF==tm.Minute)&&(sekunda1_OFF==tm.Second))
  {
   digitalWrite(przekaznik1, HIGH);
  }
//2gi przekaznik
if((godz2_ON==tm.Hour)&&(minuta2_ON==tm.Minute)&&(sekunda2_ON==tm.Second))
   {
    digitalWrite(przekaznik2, LOW);
   }

  if((godz2_OFF==tm.Hour)&&(minuta2_OFF==tm.Minute)&&(sekunda2_OFF==tm.Second))
  {
   digitalWrite(przekaznik2, HIGH);
  }
//3ci przekaznik
if((godz3_ON==tm.Hour)&&(minuta3_ON==tm.Minute)&&(sekunda3_ON==tm.Second))
   {
    digitalWrite(przekaznik3, LOW);
   }

  if((godz3_OFF==tm.Hour)&&(minuta3_OFF==tm.Minute)&&(sekunda3_OFF==tm.Second))
  {
   digitalWrite(przekaznik3, HIGH);
  }
//4ty przekaznik
if((godz4_ON==tm.Hour)&&(minuta4_ON==tm.Minute)&&(sekunda4_ON==tm.Second))
   {
    digitalWrite(przekaznik4, LOW);
   }

  if((godz4_OFF==tm.Hour)&&(minuta4_OFF==tm.Minute)&&(sekunda4_OFF==tm.Second))
  {
   digitalWrite(przekaznik4, HIGH);
  }
//drabinka rezystorowa
{
buttonValue = analogRead(buttonPin);
  Serial.println(buttonValue);
  if (buttonValue > 503 && buttonValue <515)
  {
    ile = 1;
  }
  else if (buttonValue > 335 && buttonValue <342)
  {
    ile = 2;
  }
  else if (buttonValue > 244 && buttonValue <262)
  {
    ile = 3;
  }
  else if (buttonValue > 200 && buttonValue <209)
  {
    ile = 4;
  }
  else if (buttonValue > 163 && buttonValue <179)
  {
    ile = 5;
  }
  else
  {
    ile = 0;
  }
}
}
void LCDprint2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}
crobe
Majsterkowicz
Posty: 114
Rejestracja: 14 gru 2015, 17:56
Lokalizacja: Brzozów
Kontakt:

Re: komputer akwariowy

Post autor: crobe » 5 cze 2016, 14:55

Do autora jak sterownik działa może dasz filmik na YT ?
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 10 cze 2016, 15:17

Sterownik dziala na ustawieniach zdefiniowanych na włączenie każdej pompy na 10 s. Mogę nagrać filmik jak to wygląda, ale proszę o pomoc w budowie menu i klawiatury z drabinką rezystorową. Pozdrawiam
crobe
Majsterkowicz
Posty: 114
Rejestracja: 14 gru 2015, 17:56
Lokalizacja: Brzozów
Kontakt:

Re: komputer akwariowy

Post autor: crobe » 10 cze 2016, 23:35

jakie menu chcesz ?

menu
podmenu1
podmenu2
podmenu3
itd
?
adrian1311
Młodszy majsterkowicz
Posty: 10
Rejestracja: 9 sty 2016, 17:06

Re: komputer akwariowy

Post autor: adrian1311 » 25 cze 2016, 12:31

Filmik zrobię, ale na razie mam mało czasu - biorę niedługo ślub i sporo jest załatwiania. Ale stay focused!

A menu dokładnie takie jak piszesz.

Menu
podmenu 1 - sterowanie pompami
podmenu 1.2 - ustawienie czasu włączenia dla pompy 1
podmenu 1.3 - ustawienie czasu wyłączenia dla pompy 1
podmenu 1.4 - itp. dla pompy 2,3,4

Pozdrawiam!
ODPOWIEDZ

Strony partnerskie: