Hola a todos,
este es mi primer post en el foro.
Desde hace algún tiempo he estado trabando con arduino, viendo tutoriales, practicando y realizando mis propios proyectos. en este sentido tome la decisión de realizar uno que me apasiona por lo cual he pasado investigando por varios lugares en Internet así como también aquí en el foro en donde hace unos meses atrás observe un código que para ese entonces no comprendía y que ahora después de leer practicar pude modificar para las necesidades de mi proyecto, en ese sentido pasare a explicarlo a continuación:
Quiero hacer el control y monitoreo de agua que ingresa a un tanque(en este caso, pero que puede tener diferentes aplicaciones)para ello el proyecto se divide en dos partes.
_interfaz de usuario
en donde la persona podrá configurar los diferentes parámetros y que consta de un arduino uno, una lcd 16x2 y un teclado 4x4.
_sistema de control
en donde están conectados la motobomba y su tarjeta relay ON/OFF, un sensor de flujo, un buzer, y un servomotor para abrir y cerrar la vavula.
*funcionamiento
en la interfaz puedo digitar la cantidad de agua a utilizar, luego esta información es almacenada por el arduino1 y transmitida al arduino2 vía serial para que este la interprete, abra la valvula y comience el proceso de medición que al llegar a la mitad del valor que configure en la interfaz me envié de nuevo los datos al arduino1 y pueda visualizarlos y asi emitir varias alarmas.
Cabe destacar que ya llevo un poco adelantado el proyecto y que hasta ahora cuento con un prototipo, el inconveniente que me dirige hacia ustedes es que el código es funcional, con esto me refiero a que puedo digitar la cantidad de liquido que quiero, mida la cantidad de agua que ingresa y me la muestre en la lcd y active las diferentes alarmas PERO ahi es donde tengo el inconveniente que por mas que he buscado, escrito y probado ideas que he encontrado en Internet no logro resolverlo y es que el codigo funciona perfectamente en un solo arduino, es decir, que este hace todo.
lo que yo quiero es hacer una comunicación ente los dos arduinos para que estos envíen y reciban información del proceso.
adjunto el código en el cual un arduino hace todo
#include <Servo.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Keypad.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
int lcd_opcion = 0;
int adc_chequear = 0;
int LitrosT;
int LitrosD;
int ledred = 18;
int ledyelow = 19;
int buzzer = 20;
Servo servo1;
#define btnRIGHT 0
#define TotalBotonReset 1 // UP button
#define DiarioBotonReset 2 // Down Button
#define btnNINGUNO 5
#define btnLEFT 3
#define btnSELECT 4
byte sensorInterrupt = 0; //colocar 1 para q trabaje el pin 2
byte sensorPin = 2;
float Factor_calibracion = 6.20;
volatile byte PulsoCont;
float Caudal;
unsigned int FlujoMiliLitros;
unsigned long TotalMiliLitrosA;
unsigned long TotalMiliLitrosB;
//unsigned long limiteTotal = 4000;
unsigned long limiteDiario = 3000;
unsigned long control = 0;
unsigned long alarma;
unsigned long Tiempo;
unsigned long limiteTotal;
long valor = 0; // first
double total = 0;
const byte filas = 4; // nº de filas
const byte columnas = 4; // nº de columnas
byte pinesFilas[filas] = {7, 6, 5, 4}; // orden filas f1, f2, f3, f4
byte pinesColumnas[columnas] = {14, 15, 16, 17}; // orden columnas c1, c2, c3 18, 19, 20, 21};
char teclas [filas] [columnas] = {
{'1','2','3','A',},
{'4','5','6','B',},
{'7','8','9','C',},
{'*','0','#','D',},
};
Keypad teclado = Keypad (makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas);
char tecla;
int numero;
void setup()
{
for(int i=14; i<=17;i++)
{
pinMode(i,INPUT);
}
for(int A=18; A<=21;A++)
{
pinMode(A,OUTPUT);
}
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(4, 0);
lcd.print("Daniela_04");
delay(1000);
lcd.clear();
servo1.attach(3);
pinMode(ledred, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(ledyelow, OUTPUT);
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
PulsoCont = 0;
Caudal = 0.0;
FlujoMiliLitros = 0;
TotalMiliLitrosA = 0;
TotalMiliLitrosB = 0;
Tiempo = 0;
alarma = 0;
servo1.write(0);
delay(50);
attachInterrupt(sensorInterrupt, RPM, FALLING);
}
void loop()
{
tecla = teclado.getKey();
if (tecla != NO_KEY)
{
switch(tecla)
{
case 'A':
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Cantidad:");
lcd.setCursor(15,0);
lcd.print("L");
break;
case '0'...'9':
lcd.setCursor(11,0);
valor = valor*10+(tecla - '0');
lcd.print(valor);
break;
case 'C':
valor = 0;
total = 0;
lcd.clear();
break;
case 'D':
lcd.clear();
valor = ( total != 0 ? total : valor);
total = (valor/0.0010000)+1;
limiteTotal = total;
while(1){
principal();
}
}
}
}// loop
void principal()
{
alarma = (limiteTotal/2);
if((millis() - Tiempo) > 1000UL)
{
char buffer[20], str[6];
detachInterrupt(sensorInterrupt);
Caudal = ((1000.0 / (millis() - Tiempo)) * PulsoCont) / Factor_calibracion;
Tiempo = millis();
FlujoMiliLitros = (Caudal / 60) * 1000;
// Serial.println(FlujoMiliLitros);
// delay(10);
TotalMiliLitrosA += FlujoMiliLitros;
TotalMiliLitrosB += FlujoMiliLitros;
unsigned int frac;
lcd.setCursor(0,0);
lcd.print("Fluj Total Diari");
lcd.setCursor(0,1);
sprintf(buffer, "%4s %4dL %4dL", dtostrf(Caudal, 4,2,str), TotalMiliLitrosA/1000); //1000U transformo float a string con 4 caracters y 2 decimales.
lcd.print(buffer);
Serial.println(buffer);
PulsoCont = 0;
attachInterrupt(sensorInterrupt, RPM, FALLING);
}
}
void RPM() {
PulsoCont++;
}
La verdad les agradeseria mucho si me podrían ayudar con alguna idea de como hacer esto o en el mejor de los caso alguien que tenga un pequeño fragmento de código que yo pueda adecuar ya que me he etascado en este punto.
de antemano gracias..!!