komputer akwariowy
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
komputer akwariowy
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
- 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
Re: komputer akwariowy
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.
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.
- arduino-lab
- Młodszy majsterkowicz
- Posty: 30
- Rejestracja: 2 gru 2015, 14:41
- Kontakt:
Re: komputer akwariowy
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.
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.
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
Witam ponownie. Zacząłem za namową pisać kod wygląda on tak:
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
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);}
Ostatnio zmieniony 23 sty 2016, 19:49 przez adrian1311, łącznie zmieniany 1 raz.
Re: komputer akwariowy
By trzeba było wyświetlanie zrobić w przerwaniu zegarowym.
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
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.
- arduino-lab
- Młodszy majsterkowicz
- Posty: 30
- Rejestracja: 2 gru 2015, 14:41
- Kontakt:
Re: komputer akwariowy
Może wielozadaniowość korzystając na przykład z biblioteki leOS2?
Re: komputer akwariowy
Jak masz przygotowane przerwanie, to w funkcji wywoływanej przy przerwaniu dajesz obsługę wyświetlacza.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.
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.arduino-lab pisze:Może wielozadaniowość korzystając na przykład z biblioteki leOS2?
EDIT
Tak będzie wyglądał kod z tą biblioteką TimerOne.
Link do biblioteki https://code.google.com/archive/p/ardui ... /downloads
Spoiler:
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
Ok, wstawiłem kod. Teraz nic się nie wyświetla. Podświetlony jest jedynie ekran
Re: komputer akwariowy
Nie wiem dlaczego. Spróbuj zmienić ten czas na większy, co 1 sekundę może, czyli 1000000 us.
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
Nic się nie zmienia ... a jak wyglądałoby to bez timera ale z funkcją interrupt? czytałem o przerwaniach, ale nie rozumiem ich...
- arduino-lab
- Młodszy majsterkowicz
- Posty: 30
- Rejestracja: 2 gru 2015, 14:41
- Kontakt:
Re: komputer akwariowy
Przy wykorzystaniu biblioteki leOS2:
Co dwie sekundy temperatura, co sekundę czas. Nie jestem pewien, ale chyba trzeba jeszcze zakomentować include Time.h.
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() {
}
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
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?
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
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);
}
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
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:
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
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);
}
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);
}
Re: komputer akwariowy
Do autora jak sterownik działa może dasz filmik na YT ?
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
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
Re: komputer akwariowy
jakie menu chcesz ?
menu
podmenu1
podmenu2
podmenu3
itd
?
menu
podmenu1
podmenu2
podmenu3
itd
?
-
- Młodszy majsterkowicz
- Posty: 10
- Rejestracja: 9 sty 2016, 17:06
Re: komputer akwariowy
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!
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!