prima di iniziare chiedo scusa per gli strafalcioni che ci sono dentro il codice :)7
detto questo , ho PROVATO , a scrivere un codice per gestire il mio acquario,
quello che volevo fare e una gestione della luce, usando tre strice led con luce che va dall infrarosso al uv
poi la somministrazione di mangime, e co2 .
per il momento ho scritto il codice e progettato il circuito per la gestione del tutto .( devo sempre inciderlo su basetta e saldarlo.
sequendo le varie discussioni e i consigli che mi avete dato , ho strutturato il codice in questo modo
un loop() che gestisce le varie funzioni
cibo() , ph() , termometro() luci estate , luci inverno , termometro e un effetto alba tramonto,
compilare lo compila senza errori , ma non so se funzione , appena terminato il circuito .lo provero
ho visto in rete alcuni progetti in cui veniva usato un altro arduino come slave , a me servorebbe poter gestire uin lcd ,
perche fra , tre pin usati per le luci , uno per il termometro , uno per il ph uno per il cibo uno andra usato per attivare l elettro valvola per la co2 e mi vorrei lasciar liberi dei pin per i l riscaldamento e per il filtro e un buzzer come allarme ,
non mi rimangono tanti pin per lcd
ho cercato in rete ma non sono riuscito a trovare nulla su cui lavorare per capirci qualcosa , avete qualche link?
grazie
//_____________________________________________________________________________________________________________________
//VARIABILI RTC
int long ore;
int long minuti ;
int long secondi ;
int long mese;
//___________________________________________________________________________________________________________________
// VARIABILE POSIZIONE SERVO
int pos = 0;
//___________________________________________________________________________________________________________
//USCITE LUCI
#define luce_bianca 3
#define luce_rossa 4
#define luce_blu 5
//______________________________________________________________________________________________________________________
// LIBRERIE RTC
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
//_______________________________________________________________________________________________________________________
//LIBRERIA SERVO
#include <Servo.h>
//_______________________________________________________________________________________________________________________
//LIBRERIE TERMOMETRO LCD
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 12, 7, 8, 9, 10);
#define stermometro 2 //pin collegamento termometro
// Imposta la comunicazione oneWire per comunicare
// con un dispositivo compatibile
OneWire oneWire(stermometro);
// Passaggio oneWire reference alla Dallas Temperature.
DallasTemperature sensors(&oneWire);
//_____________________________________________________________________________________________________________________________
Servo myservo; // create servo object to control a servo
//__________________________________________________________________________
//SONDA PH
const int pinPo = A0;//PIN COLLEGAMENTO SONDA PH
void setup() {
Serial.begin(9600);
//definisco pin luci
pinMode(luce_bianca, OUTPUT);
pinMode(luce_rossa, OUTPUT);
pinMode(luce_blu, OUTPUT);
//definicopin servo cibo
myservo.attach(9);
//_____________________________________________________________________________________________________________________________
//spengo le luci
digitalWrite(luce_bianca, LOW); // spengo il led bianchi
digitalWrite(luce_rossa, LOW); // spengo il led rossi
digitalWrite(luce_blu, LOW); // spengo il led blu
//____________________________________________________________________________________________________________________________
DateTime now = rtc.now();
//Per comodità uso variabili e non direttamente ciò che restituisce il modulo RTC
int long ore = now.hour();
int long minuti = now.minute();
int long secondi = now.second();
int long anno = now.year();
int long mese = now.month();
//_________________________________________________________________________________________________________________________________
//setup lcd /termometro
// Start up the library
sensors.begin();
// Imposta il valore di righe e colonne del display LCD
lcd.begin(16, 2);
// ________________________________________________________________________________________________________________________
//setup ph
Serial.begin(9600);
lcd.begin(16,2);
lcd.setCursor(3,0);
delay(2000);
lcd.clear();
}
void loop()
{
if( mese>=3 && mese<=9 ) // estate da maggio a settembre
{ estate_led_piante();
estate_led_bianchi();
}
else
{ inverno_led_piante();
inverno_led_bianchi();
}
////////////////////loop termometro
termometro();
}
//____________________________________________________________________________________________________________________________
//funzione orari accensione, spegnimento luci piante d estate
void estate_led_piante() {
//per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
if ((ore == 7) && (minuti == 30)) { // se sono le 7,30 accendi luci piante
accensioneLed_piante();
}
if((ore == 19) && (minuti == 30)){// se sono le 19,30 spegni luci piante
spegnimentoLed_piante();
}
}
//____________________________________________________________________________________________________________________________
//funzione orari accensione , spegnimento luci piante d inverno
void inverno_led_piante() {
//per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
if ((ore == 8) && (minuti == 30)) { // se sono le 8,30 accendi luci piante
accensioneLed_piante();
}
if((ore == 18) && (minuti == 30)){// se sono le 18,30 spegni luci piante
spegnimentoLed_piante();
}
}
//FINE FUNZIONE PIANTE
//___________________________________________________________________________________________________________________________
//funzione orari accensione, spegnimento luci bianche estate
void estate_led_bianchi() {
//per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
if ((ore == 7) && (minuti == 40)) { // se sono le 7,40 accendi luci bianche
accensioneLed_bianchi();
cibo();
}
if((ore == 19) && (minuti == 20)){// se sono le 19,20spegni luci piante
spegnimentoLed_bianchi();
}
}
//___________________________________________________________________________________________________________________________
//funzione orari accensione , spegnimento luci bianchi d inverno
void inverno_led_bianchi() {
//per prima cosa controlliamo il contatore se è maggiore di 5 altrmenti salterà tutta la funzione
if ((ore == 8) && (minuti == 40)) { // se sono le 8,40 accendi luci piante
accensioneLed_bianchi();
}
if((ore == 18) && (minuti == 20)){// se sono le 18,20 spegni luci piante
spegnimentoLed_bianchi();
}
}
////////fine funzione estate inverno luci bianche
//____________________________________________________________________________________________________________________________
//fase accensione spegnimento luci per le piantte
void accensioneLed_piante() {
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
analogWrite(luce_rossa, fadeValue);
analogWrite(luce_blu, fadeValue);
delay(20);
}
}
void spegnimentoLed_piante() {
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(luce_rossa, fadeValue);
analogWrite(luce_blu, fadeValue);
delay(20);
}
}
//////////////////////fine funzione luci poiante piante
//______________________________________________________________________________________________________________________________
//funzione accensione , spegnimento luci bianche
void accensioneLed_bianchi() {
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
analogWrite(luce_bianca, fadeValue);
delay(20);
}
}
void spegnimentoLed_bianchi() {
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(luce_bianca, fadeValue);
delay(20);
}
}//fine funzioni luci bianche
//_________________________________________________________________________________________________________________________________
//funzione cibo , copio l esempiuo dell IDE il servo grazie ad una camma mi preme il pulsante del dosatore i valori andranno testati
void cibo() {
for (pos = 0; pos <= 90; pos += 1) { // la camma va da 0 a 90 gradi
// in steps of 1 degree
myservo.write(pos);
delay(15);
}
for (pos = 90; pos >= 0; pos -= 1) { //la camma torna da 909 a 0 grado
myservo.write(pos);
delay(15);
}
}
//fine funzione cibo
//_____________________________________________________________________________________________________________________________________________
//funzione termometro lcd
void termometro()
{
sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
lcd.clear();
lcd.setCursor(0, 0); // bottom left
lcd.print("Temperatura di: ");
lcd.setCursor(0, 1); // bottom left
lcd.print (sensors.getTempCByIndex(0));
lcd.print (" C");
}
// fine funzione termometro
//_____________________________________________________________________
//funzione ph ripresa dal sito del produttore
void ph(){
int pole[10];
int zaloha;
unsigned long int prumerVysl = 0;
// RECUPERA 10 CAMPIONI PER 10MS NELL ARRAY
for (int i = 0; i < 10; i++) {
pole[i] = analogRead(pinPo);
delay(10);
}
// ORDINA NUMERI PER DIMENSIONE
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (pole[i] > pole[j]) {
zaloha = pole[i];
pole[i] = pole[j];
pole[j] = zaloha;
}
}
}
// uložení 2. až 8. výsledku do
// proměnné, z které se vypočte průměr
// (vynechání dvou členů pole na začátku
// a konci pro lepší přesnost)
for (int i = 2; i < 8; i++) {
prumerVysl += pole[i];
}
// výpočet hodnoty pH z průměru
// měření a přepočet na rozsah 0-14 pH
float prumerPH = (float)prumerVysl * 5.0 / 1024 / 6;
float vyslednePH = -5.70 * prumerPH + 21.34;
// vytištění výsledků po sériové lince
Serial.print("pH: ");
Serial.println(vyslednePH);
// pauza 900 ms před novým měřením, celkem tedy 1s
delay(900);
}
ciao...sembra anche questo in I2C.
quindi, cosa che comunque dovevi già fare anche per il solo LCD, devi trovarti l'indirizzo di entrambi.
crearti i due oggetti per la comunicazione seriale con relativo indirizzo.
buon giorno e grazie per le risposte , avete qualche link dove possa trovare della documentazione?
e delle info su come possa collegare un altro arduino per gestire lcd dove le potrei trovare?
grazie
>albepancio: Allora ...prima di tutto studiati cosa è un bus I2C, prima QUI e poi, volendo, anche QUI, poi, nel reference, la libreria Wire ... ti si dovrebbero chiarire un po' di più le idee
//////////////////////FINE FADE VIOLA
//__________________________________________________________________________________________________________
//__FUNZIONE FADE LUCI BIANCHE
void accensione_Led_bianchi() {
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
analogWrite(luci_bianche, fadeValue);
delay(20);
}
}
void spegnimento_Led_bianchi() {
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 1) {
analogWrite(luci_bianche, fadeValue);
delay(20);
}
}
//f///////////////////////FINE FADE BIANCHE
//--------------------------------------------------------------------------------------------------------------------------
//____________________________FUNZIONE CIBO_________________________________________________________________________________
void cibo() {
for (pos = 0; pos <= 90; pos += 1) { // la camma va da 0 a 90 gradi
// in steps of 1 degree
myservo.write(pos);
delay(15);
}
for (pos = 90; pos >= 0; pos -= 1) { //la camma torna da 909 a 0 grado
myservo.write(pos);
delay(15);
}
}
////////////////////////////////FINE FUNZIONE CIBO
//-----------------------------------------------------------------------------------------------------------------------------------
//__________________________________FUNZIONE TERMOMETRO__________________________________________
void termometro()
{
}
////////////////fine funzione termometro
//_____________________________________________________________________________________________________________________________
//FUNZIONE PH COPIATO DAL PRODUTTORE
void ph(){
int pole[10];
int zaloha;
unsigned long int prumerVysl = 0;
// RECUPERA 10 CAMPIONI PER 10MS NELL ARRAY
for (int i = 0; i < 10; i++) {
pole[i] = analogRead(pinPo);
delay(10);
}
// ORDINA NUMERI PER DIMENSIONE
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (pole[i] > pole[j]) {
zaloha = pole[i];
pole[i] = pole[j];
pole[j] = zaloha;
}
}
}
// uložení 2. až 8. výsledku do
// proměnné, z které se vypočte průměr
// (vynechání dvou členů pole na začátku
// a konci pro lepší přesnost)
for (int i = 2; i < 8; i++) {
prumerVysl += pole[i];
}
// výpočet hodnoty pH z průměru
// měření a přepočet na rozsah 0-14 pH
float prumerPH = (float)prumerVysl * 5.0 / 1024 / 6;
float vyslednePH = -5.70 * prumerPH + 21.34;
// vytištění výsledků po sériové lince
Serial.print("pH: ");
Serial.println(vyslednePH);
// pauza 900 ms před novým měřením, celkem tedy 1s
delay(900);
}
leggendo un po di guide e prendendo spunti dai vai progetti ho (provato) a scrivere questo codice che teoricamente dovrebbbe accendere le luci in base alla stagione mostrare temperatura e ph ,codi da apruire o chiudere l elettro valvola dell erogatore , la temperatura e controllata da un sempliceriscaldatore d ' avcquario , scusate le tante righe ma non ho una vista da falco e cosi evitavo di andare su e giu per la pagina . lo compila ma non so se funziona perche non ho ancora saldato tutto sul circuito , in piu ( se mi riesce vorre poter trasmetere i valori temperatura e ph in modo da valutarli anche quando non sono a casa ma questa e un altra storia ) (postato in due parti perche troppo lungo per un post unico ) grazie mille per il tempo che mi dedicate [/code]