Académique Documents
Professionnel Documents
Culture Documents
ELEMENTOS UTILIZADOS:
Arduino MEGA 2560
Electrovlvula
Sensor Higrmetro
Sensor Electrodo PH
Mdulo de 4 Rels
Microcontrolador PIC18f4550
Tarjeta Master-Prog
Fuente de Voltaje
Tarjeta USBP1x
SOFTWARE UTILIZADO:
Microsoft Visual Studio C#
Compilador PIC C
Programador Arduino
En primer lugar, se cre una interfaz en C# para la comunicacin entre la tableta del controlador y
una computadora laptop.
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.Text.RegularExpressions;
namespace Aspersor
{
public partial class Form1 : Form
{
char cara;
double conv = 0;
string Recibirdato;
string BufferEnvio="0";
string BufferIn;
string sensor;
char index;
char index2;
public Form1()
{
InitializeComponent();
if (!serialPort1.IsOpen)
{
try
{
serialPort1.Open();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
serialPort1.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(Recibir);
}
}
private void Recibir(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{
Recibirdato = "";
Thread.Sleep(250);
Recibirdato += serialPort1.ReadExisting();
if (serialPort1.BytesToRead > 0)
Recibirdato += serialPort1.ReadExisting();
string linea;
linea = Recibirdato;
this.Invoke(new EventHandler(actualizar));
}
private void actualizar(object sender, EventArgs e)
{
//int IniAN0 = Recibirdato.IndexOf("W");
//int FinAN0 = Recibirdato.IndexOf("X");
int Tamanio = Recibirdato.Length;
cara = Recibirdato[Recibirdato.Length - 1];
try
{
index = Recibirdato[0];
index2 = Recibirdato[1];
}
catch (Exception ex)
{
index = 'C';
index2 = 'C';
}
label8.Text = index2.ToString()+Recibirdato.Length.ToString() +
Recibirdato;
if (Recibirdato.Length > 8)
{
Recibirdato = "";
}
Recibirdato = Regex.Replace(Recibirdato,"[^0-9]+",string.Empty);
//
/*if (Recibirdato.Length >= 1)
{
int temp = Convert.ToInt32(Recibirdato);
switch (temp)
{
case 0:
BufferEnvio = "0";
break;
case 1:
BufferEnvio = "1";
break;
case 2:
BufferEnvio = "2";
break;
case 3:
BufferEnvio = "3";
break;
case 4:
BufferEnvio = "4";
break;
case 5:
BufferEnvio = "5";
break;
case 6:
BufferEnvio = "6";
break;
case 7:
BufferEnvio = "7";
break;
case 8:
BufferEnvio = "8";
break;
case 9:
BufferEnvio = "9";
break;
default:
break;
}
sensor = "Sensor 1";
temp = 0;
}*/
switch (index)
{
case 'A':
try
{
conv = (Convert.ToDouble(Recibirdato) * 5.7) / 10.24;
//conv = Convert.ToDouble(Recibirdato);
tbxSensorT3.Text = conv.ToString();
if (Convert.ToInt16(conv) < numTmin3.Value)
{
tbxSensorT3.BackColor = Color.LightBlue;
BufferEnvio = "0";
}
else if (Convert.ToInt16(conv) > numTmax3.Value)
{
tbxSensorT3.BackColor = Color.OrangeRed;
BufferEnvio = "1";
}
else
{
tbxSensorT3.BackColor = Color.YellowGreen;
BufferEnvio = "0";
}
}
catch(Exception ex)
{
}
break;
default:
break;
case 'T':
switch (index2)
{
case 'X':
lblHora.Text = Recibirdato;
break;
case 'C':
tbxSensorT1.Text = Recibirdato;
if (Convert.ToInt16(Recibirdato) < numTmin1.Value)
{
tbxSensorT1.BackColor = Color.LightBlue;
}
else if (Convert.ToInt16(Recibirdato) > numTmax1.Value)
{
tbxSensorT1.BackColor = Color.OrangeRed;
}
else
{
tbxSensorT1.BackColor = Color.YellowGreen;
}
break;
case 'A':
conv = (Convert.ToDouble(Recibirdato) * 5.7) / 10.24;
//conv = Convert.ToDouble(Recibirdato);
tbxSensorT3.Text = conv.ToString();
if (Convert.ToInt16(conv) < numTmin3.Value)
{
tbxSensorT3.BackColor = Color.LightBlue;
BufferEnvio = "0";
}
else if (Convert.ToInt16(conv) > numTmax3.Value)
{
tbxSensorT3.BackColor = Color.OrangeRed;
BufferEnvio = "1";
}
else
{
tbxSensorT3.BackColor = Color.YellowGreen;
BufferEnvio = "0";
}
break;
default:
break;
}
break;
/*case 'H':
switch (index2)
{
case 'C':
tbxSensorH1.Text = Recibirdato;
/*if (Convert.ToInt16(Recibirdato) < numTmin1.Value)
{
tbxSensorT1.BackColor = Color.LightBlue;
}
else if (Convert.ToInt16(Recibirdato) > numTmax1.Value)
{
tbxSensorT1.BackColor = Color.OrangeRed;
}
else
{
tbxSensorT1.BackColor = Color.YellowGreen;
}
break;
case 'A':
conv = (Convert.ToDouble(Recibirdato) * .57) / 10.24;
//conv = Convert.ToDouble(Recibirdato);
tbxSensorH3.Text = conv.ToString();
if (Convert.ToInt16(conv) < numHmin3.Value)
{
tbxSensorH3.BackColor = Color.LightBlue;
BufferEnvio = "2";
}
else if (Convert.ToInt16(conv) > numHmax3.Value)
{
tbxSensorH3.BackColor = Color.OrangeRed;
BufferEnvio = "3";
}
else
{
tbxSensorH3.BackColor = Color.YellowGreen;
BufferEnvio = "2";
}
break;
default:
break;
}
break;
default:
break;*/
}
Monitor.Text = "";
Monitor.Text += Recibirdato+"\r\n"+BufferEnvio+" --> "+index2;
chart1.Series["Temperatura"].Points.Clear();
chart1.Series["Temperatura"].Points.AddXY(""+sensor+"",
""+Recibirdato+"");
chart1.Update();
//serialPort1.DiscardOutBuffer();
//serialPort1.Write(BufferEnvio);
Recibirdato = "";
}
private void btnSalir_Click(object sender, EventArgs e)
{
Close();
}
private void btnSendTime_Click(object sender, EventArgs e)
{
string hora, minu, segu;
if(numHora.Value.ToString().Length<2)
{
hora="0"+numHora.Value.ToString();
}
else
{
hora = numHora.Value.ToString();
}
if (numMinu.Value.ToString().Length < 2)
{
minu = "0" + numMinu.Value.ToString();
}
else
{
minu = numMinu.Value.ToString();
}
if (numSegu.Value.ToString().Length < 2)
{
segu = "0" + numSegu.Value.ToString();
}
else
{
segu = numSegu.Value.ToString();
}
lblHoraEnvio.Text = hora+":"+minu+":"+segu;
BufferEnvio = "XX"+hora+minu+segu;
serialPort1.DiscardOutBuffer();
serialPort1.Write(BufferEnvio);
}
}
}
Se utiliz el software Virtual Serial Port Driver para emular los puertos COM al momento de las
simulaciones con Proteus para la correcta comunicacin y recepcin de variables.
int flag;
int seconds=0;
int minutes=0;
int hours=7;
String envio;
void setup()
{
pinMode(VALVPIN1, OUTPUT);
pinMode(VALVPIN2, OUTPUT);
pinMode(VALVPIN3, OUTPUT);
pinMode(VALVPIN4, OUTPUT);
digitalWrite(VALVPIN1,HIGH);
digitalWrite(VALVPIN2,HIGH);
digitalWrite(VALVPIN3,HIGH);
digitalWrite(VALVPIN4,HIGH);
flag = EEPROM.read(sf);
if(flag==0)
{
seconds = EEPROM.read(ss);
minutes = EEPROM.read(sm);
hours = EEPROM.read(sh);
}
// initialize Timer1
cli();
// disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
// set compare match register to desired timer count:
OCR1A = 15624;
// turn on CTC mode:
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);
// enable global interrupts:
sei();
Serial.begin(9600);
}
void loop()
{
Serial.println(minutes);
//RIEGO DE LA MAANA
if((minutes>=0 && minutes<5) && hours==7)
{
digitalWrite(VALVPIN1,LOW);
}
if((minutes>=5 && minutes<10) && hours==7)
{
digitalWrite(VALVPIN2,LOW);
digitalWrite(VALVPIN1,HIGH);
}
if((minutes>=10 && minutes<15) && hours==7)
{
digitalWrite(VALVPIN3,LOW);
digitalWrite(VALVPIN2,HIGH);
}
if((minutes>=15 && minutes<20) && hours==7)
{
digitalWrite(VALVPIN4,LOW);
digitalWrite(VALVPIN3,HIGH);
}
if(minutes>=20 && hours==7)
{
digitalWrite(VALVPIN4,HIGH);
}
//RIEGO DE LA NOCHE
if((minutes>=0 && minutes<5) && hours==21)
{
digitalWrite(VALVPIN1,LOW);
}
if((minutes>=5 && minutes<10) && hours==21)
{
digitalWrite(VALVPIN2,LOW);
digitalWrite(VALVPIN1,HIGH);
}
if((minutes>=10 && minutes<15) && hours==21)
{
digitalWrite(VALVPIN3,LOW);
digitalWrite(VALVPIN2,HIGH);
}
if((minutes>=15 && minutes<20) && hours==21)
{
digitalWrite(VALVPIN4,LOW);
digitalWrite(VALVPIN3,HIGH);
}
if(minutes>=20 && hours==21)
{
digitalWrite(VALVPIN4,HIGH);
}
}
ISR(TIMER1_COMPA_vect)
{
seconds++;
if (seconds >= 60)
{
seconds = 0;
minutes++;
}
if(minutes >= 60)
{
minutes=0;
hours++;
}
if(hours >= 24)
{
hours=0;
}
EEPROM.write(ss, seconds);
EEPROM.write(sm, minutes);
EEPROM.write(sh, hours);
EEPROM.write(sf, 0);
//digitalWrite(LEDPIN, !digitalRead(LEDPIN));*/
}
En la etapa final del proyecto, se sustituy el controlador Arduino por el microcontrolador
PIC18f4550. Las funciones principales que realizaba el anterior controlador se mantuvieron y se
agregaron las funciones de comunicacin RS232, aunque el mdulo Serial a TTL no qued instalado
al final debido a que no era necesario para las funciones que realiza actualmente el controlador,
esto es, la comunicacin con una tableta Raspberry la cual ser proporcionada despus por la
carrera de Ingeniera en Sistemas.
Se emple tambin una tarjeta PICKIT para la instalacin del controlador debido a que esta ya
contaba con los pines necesarios para la conexin con el mdulo de 4 rels, el convertidor Serial a
TTL y la baquela con transistores.
#int_TIMER1
//Interrupcin Timer1
void temp1s(void) //Funcin
{
/////////TIEMPO////////////
if(cont>=25)
{
seg++;
cont=0;
/*printf("TX%u:%u:%u",hor,min,seg);
ind='A';
/*set_adc_channel(0);
hum1=read_adc();
printf("H%c%u",ind,hum1);
/*ind='B';
set_adc_channel(1);
hum2=read_adc();
printf("%c%u",ind,hum2);
ind='C';
set_adc_channel(2);
hum3=read_adc();
printf("%c%u",ind,hum3);
ind='D';
set_adc_channel(3);
hum4=read_adc();
printf("%c%u",ind,hum4);*/
}
if(seg>=60)
{
min++;
seg=0;
}
if(min>=60)
{
hor++;
min=0;
}
if(hor>=24)
{
hor=0;
}
////////RUTINAS DIARIAS//////////
if((hor==7 && (min>=0 && min<5))||(hor==21 && (min>=0 && min<5)))
{
output_LOW(vv1);
}
if((hor==7 && (min>=5 && min<10))||(hor==21 && (min>=5 && min<10)))
{
output_HIGH(vv1);
output_LOW(vv2);
}
if((hor==7 && (min>=10 && min<15))||(hor==21 && (min>=10 && min<15)))
{
output_HIGH(vv2);
output_LOW(vv3);
}
if((hor==7 && (min>=15 && min<20))||(hor==21 && (min>=15 && min<20)))
{
output_HIGH(vv3);
output_LOW(vv4);
}
if((hor==7 && min>20)||(hor==21 && min>20))
{
output_HIGH(vv4);
}
set_timer1 (5536);
//recarga del TMR1
cont++;
}
void main()
{
port_b_pullups(TRUE);
//setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
enable_interrupts(INT_RDA);
setup_timer_1 (T1_INTERNAL |T1_DIV_BY_8);
set_timer1(5536);
enable_interrupts(INT_TIMER1);
enable_interrupts(global);
//habilita interrupcin general
while(1)
{
/*set_timer1(15500);
enable_interrupts(INT_TIMER1);*/
ind='A';
hum1=194;
}
}
Finalmente, es necesario mencionar los objetivos que an quedan pendientes por completar:
lmita a solo poder instalar un nico sensor de PH. Se sugiere un protocolo de esclavomaestro para los microcontroladores.
Probar, programar e instalar el sensor de PH en cada una de las camas.
Se sugiere redisear la estructura de las camas de cultivos actuales debido a que no cuentan
con un espacio para albergar lo cables (los cuales estan expuestos a la intemperie). Tambin
se puede considerar que el nuevo diseo sea cncavo en la base para que, mediante
escurrimiento del agua, se concentre en un solo punto el valor de PH a medir.
En este punto se
sugiere instalar el
sensor de PH para
una medicin ms
precisa de la variable.