Paso 8: Programa de C# y MySQL
Todo:
-Crear las tablas y base de datos MySQL. Código de código de C# a continuación o consulte Garden2.zip.
-Se deben establecer su MySQL base de datos usuario y contraseña en el código.
-También correo en la función emailStatus.
// ---------------------------------------------------------------------------------------------------------------------------------
utilizando el sistema;
utilizando System.Collections.Generic;
utilizando System.ComponentModel;
utilizando System.Data;
utilizando System.Drawing;
utilizar System.Text;
utilizando System.Windows.Forms;
utilizando MySql.Data; Para MySQL
utilizando MySql.Data.MySqlClient; Para MySQL
utilizar System.Diagnostics; Hacer emailStatus()
Jardín de espacio de nombres
{
pública clase parcial Form1: forma
{
cadena de RxString, pruebas, tempS, luz, Temp1 Temp2 Temp3, moist1, moist2 = "";
doble workD tmp1 tmp2, tmp3, m1, m2 = 0;
char llamado = '0';
char buff [] = new char [1];
Char [] conv = new char [70];
int l1, c2, lightOnH, lightOnM, lightOffH, lightOffM = 0;
int cuenta = 0;
bool estado = false;
Form1() pública
{
InitializeComponent();
Ocultar algunos botones y cuadros de texto. Quería crear un formulario separado para ajustar las variables
es decir. luz en el tiempo. No pude averiguar cómo pasar variables entre formularios en c#.
Se trata de mi lista de deseos para las versiones posteriores. Por ahora oculta cosas para crear más
espacio en el formulario.
Label3. Visible = false;
label4. Visible = false;
Label5. Visible = false;
label6. Visible = false;
lonhBOX.Visible = false;
lonmBOX.Visible = false;
loffhBOX.Visible = false;
loffmBOX.Visible = false;
saveBUT.Visible = false;
CancelBUT.Visible = false;
}
privado buttonStart_Click void (remitente de objeto, EventArgs e) / / permite empezar las cosas.
{/ / Los intervalos deben ser guarda en el cuadro de "configuración". Todo.
Timer1. Intervalo = 10000; Temporizador de 10 segundos. Mostrar valores en el de cada
10 segundos.
Timer1. Activado = true; Iniciar el temporizador.
Timer1. Tick += new EventHandler(timer1_Tick); Configurar el controlador de eventos para el temporizador.
TIMER2. Intervalo = 500; Esto sucede cada 5 segundo actualizar la fecha y hora
campo en el formulario.
TIMER2. Activado = true;
TIMER2. Tick += new EventHandler(timer2_Tick);
timer3. Intervalo = 3600000; Intervalo en el que a estado por correo electrónico al propietario.
timer3. Activado = true;
timer3. Tick += new EventHandler(timer3_Tick);
serialPort1.PortName = "COM3"; Número de puerto serie USB.
Necesitan hacer esto cambiante a través de la configuración de ajustes.
Guardar en la base de datos en la tabla "configuración".
serialPort1.BaudRate = 9600; Velocidad del puerto serie.
A veces tengo que reiniciar el arduino mediante botón en el tablero
para que las cosas van en el arranque. No está seguro de por qué la serie
comunicación no siempre funciona de inmediato. Una vez restablecer y
de trabajo se mantiene trabajando, por lo que no me fallo mucho. PARA SU INFORMACIÓN.
serialPort1.Open(); Puerto serial libre para la comunicación.
Si (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}
ReadMyData(); Obtener la configuración de la tabla de "ajustes".
CallA(); Enviar char "a" a la arduino para obtener los valores.
}
privado emailStatus() vacío
{
Proceso myProc;
Iniciar el proceso.
Haz SendEmail aquí: http://caspian.dotconf.net/menu/Software/SendEmail/
myProc = Process.Start ("c:\\email\\sendEmail.exe", "-f su -t su estado -m" l1 + "," tmp1 + "," + tmp2 + "," tmp3 + "," m1 + "," m2 + "; -s your.smtp.com - xu de usuario xp - contraseña ");
Detener el proceso.
myProc.CloseMainWindow();
}
privado buttonStop_Click void (remitente de objeto, EventArgs e) / / detener todo.
{
Si (serialPort1.IsOpen)
{
Timer1. Habilitado = false; Detener los cronómetros.
TIMER2. Habilitado = false;
timer3. Habilitado = false;
serialPort1.Close(); Cerrar el puerto serie.
buttonStart.Enabled = true;
buttonStop.Enabled = false;
}
}
privado void Form1_FormClosing (objeto sender, FormClosingEventArgs e)
{
Si serialPort1.Close() (serialPort1.IsOpen); Cerca de puerto si dejamos.
}
privado textoparamostrar void (remitente de objeto, EventArgs e) / / mostrar valores del formulario. Usted puede buscar aquí el
forma nombres de texto.
{
lightBox.Text = luz; Mostrar valores en cuadros de texto.
m1Box.Text = moist1;
m2Box.Text = moist2;
workD = Convert.ToDouble(Temp1) / 10000; Volver a nuestros lugares decimales.
tmp1 = workD; Guardar para guardar la base de datos.
tempS = workD.ToString("N2");
tempBox1.Text = tempS;
workD = Convert.ToDouble(Temp2) / 10000;
tmp2 = workD;
tempS = workD.ToString("N2");
tempBox2.Text = tempS;
workD = Convert.ToDouble(Temp3) / 10000;
tmp3 = workD;
tempS = workD.ToString("N2");
tempBox3.Text = tempS;
Si (estado)
{
stateTextBox.Text = "On";
}
otra cosa
{
stateTextBox.Text = "Off";
}
C2 = c2 + 1;
Si (c2 == 6) / / cada 6 10 segundos guardar en base de datos. Esto es asignar bastante de puntos de datos.
{
L1 = Convert.ToInt16(light); Convertir los valores a guardar en la base de datos.
M1 = Convert.ToInt16(moist1);
m2 = Convert.ToInt16(moist2);
C2 = 0;
Configuración de cadena de conexión.
MySqlConnection MyCon = new MySqlConnection ("SERVER = localhost;" + "base de datos = garden2;" + "UID = root;" + "PASSWORD = contraseña;");
Conexión abierta.
MyCon.Open();
Configuración de la cadena SQL.
MySqlCommand comando = new MySqlCommand ("inserte valores de lecturas (null, null," + l1 + "," tmp1 + "," + tmp2 + "," tmp3 + "," m1 + "," + m2 + ")", MyCon);
Ejecutar la cadena SQL en la base de datos.
comando. ExecuteNonQuery();
Cerrar la conexión de base de datos.
MyCon.Close();
Hacer poco de lógica para determinar si se va a encender la luz o apagar. Esto probablemente podría hacer en un evento de temporizador independiente.
Si (DateTime.Now.Hour > = lightOnH)
{
Si (DateTime.Now.Hour > = lightOffH)
{
Si (DateTime.Now.Minute > = lightOffM)
{
CallC(); Luz está apagada.
}
}
otra cosa
{
Si (DateTime.Now.Minute > = lightOnM)
{
CallB(); Luz.
}
}
}
otra cosa
{
CallC(); Luz está apagada.
}
}
}
privado tipo void (objeto sender, EventArgs e) / / diseccionar la cadena que recibimos de la arduino.
{
Pruebas = "~"; El char valor de rotura.
luz = ""; Claro todos los valores.
Temp1 = "";
Temp2 = "";
Temp3 = "";
moist1 = "";
moist2 = "";
cuenta = 0;
mientras que (RxString [count]! = testS[0]) / Compruebe el primer carácter de ruptura value(~). Repita hasta encontrar.
{
luz = luz + RxString [count]; Si no añadir al char a string(light) nuevo.
cuenta += 1; Goto siguiente char.
}
cuenta += 1; Vamos al próxima char via (conteo).
mientras que (RxString [count]! = testS[0])
{
Temp1 = Temp1 + RxString [count];
cuenta += 1;
}
cuenta += 1;
mientras que (RxString [count]! = testS[0])
{
Temp2 = Temp2 + RxString [count];
cuenta += 1;
}
cuenta += 1;
mientras que (RxString [count]! = testS[0])
{
Temp3 = Temp3 + RxString [count];
cuenta += 1;
}
cuenta += 1;
mientras que (RxString [count]! = testS[0])
{
moist1 = moist1 + RxString [count];
cuenta += 1;
}
cuenta += 1;
mientras que (RxString [count]! = testS[0])
{
moist2 = moist2 + RxString [count];
cuenta += 1;
}
Agregue más mientras declaraciones de valores adicionales de arduino.
}
público vacío ReadMyData() / leer tabla de "ajustes".
{
Cadena de consulta SQL.
String mySelectQuery = "seleccione LOnH, LOnM, LOffH, LOffM de configuración";
Cadena de conexión de base de datos.
MySqlConnection myConnection = new MySqlConnection ("SERVER = localhost;" + "base de datos = garden2;" + "UID = root;" + "PASSWORD = contraseña;");
MySqlCommand myCommand = new MySqlCommand (mySelectQuery, myConnection);
Conexión de base de datos abierta.
myConnection.Open();
MySqlDataReader myReader;
Ejecutar cadena de consulta.
myReader = myCommand.ExecuteReader();
Llame siempre a Read antes de acceder a los datos.
mientras (myReader.Read
{
lightOnH = myReader.GetInt16(0);
lightOnM = myReader.GetInt16(1);
lightOffH = myReader.GetInt16(2);
lightOffM = myReader.GetInt16(3);
}
Llame siempre a cerrar cuando se hace la lectura.
myReader.Close;
Cierre la conexión cuando se hace con él.
myConnection.Close();
}
privado serialPort1_DataReceived void (remitente de objeto, System.IO.Ports.SerialDataReceivedEventArgs e) / / tenemos datos en el puerto.
{
System.Threading.Thread.Sleep(50); Una demora para asegurarse de que todos los datos se recibieron en el puerto.
interruptor (llamada)
{
caso 'a': / / llamamos a la "a".
RxString = ""; Clara la cadena de recepción.
RxString = serialPort1.ReadExisting(); Obtener los datos desde el puerto.
esto. Invocar (nuevo EventHandler(Sort)); Diseccionar la cadena en valores individuales.
esto. Invocar (nuevo EventHandler(DisplayText)); Mostrar los valores en el formulario.
rotura;
caso 'c': / / se llama una "c". Su uso futuro.
rotura;
caso sería ': / / se llama una "d". Su uso futuro.
rotura;
caso 'e': / / se llama una "e". Su uso futuro.
rotura;
}
}
privado void CallA() / / enviar char "a" Puerto de serie.
{
Si (! serialPort1.IsOpen) volver;
Buff [0] = 'a';
llamar a = 'a'; Usa para ver lo que llaman hicimos a arduino.
serialPort1.Write (buff, 0, 1);
}
privado void CallB() / / enviar char "b" para puerto serie.
{
Si (! estado)
{
Si (! serialPort1.IsOpen) volver;
Buff [0] = 'b';
llamar = 'b';
serialPort1.Write (buff, 0, 1);
Estado = true;
}
}
privado void CallC() / / enviar char "c" a serial port.
{
Si {} (estado)
Si (! serialPort1.IsOpen) volver;
Buff [0] = 'c';
llamar = 'c';
serialPort1.Write (buff, 0, 1);
Estado = false;
}
}
privado void wtime() / / escribe fecha y hora para el control textbox de formularios.
{
DateBox.Text = Convert.ToString(DateTime.Now);
}
privado void timer1_Tick (objeto sender, System.EventArgs e) / / evento Timer.
{
CallA(); Enviar "a". Obtener los valores.
}
privado timer2_Tick void (remitente de objeto, e System.EventArgs)
{
wtime(); Llamar a función Wtiempo.
}
privado timer3_Tick void (remitente de objeto, e System.EventArgs)
{
emailStatus(); Llamar a función emailStatus.
}
privado lightOn_Click void (remitente de objeto, EventArgs e) / / enviar luz a elogiar a arduino. Char "b".
{
Si (! serialPort1.IsOpen) volver;
Buff [0] = 'b';
llamar = 'b';
serialPort1.Write (buff, 0, 1);
Estado = true;
}
privado lightOff_Click void (remitente de objeto, EventArgs e) / / elogiar a enviar luz a arduino. Char "c".
{
Si (! serialPort1.IsOpen) volver;
Buff [0] = 'c';
llamar = 'c';
serialPort1.Write (buff, 0, 1);
Estado = false;
}
privado settingsBUT_Click void (remitente de objeto, EventArgs e) / / vamos a entrar en nuevas configuraciones.
{
ReadMyData(); Obtener los datos de la tabla "configuración".
stateTextBox.Visible = false;
lightOn.Visible = false;
lightOff.Visible = false;
Label3. Visible = true;
label4. Visible = true;
Label5. Visible = true;
label6. Visible = true;
lonhBOX.Visible = true;
lonmBOX.Visible = true;
loffhBOX.Visible = true;
loffmBOX.Visible = true;
saveBUT.Visible = true;
CancelBUT.Visible = true;
lonhBOX.Text = Convert.ToString(lightOnH);
lonmBOX.Text = Convert.ToString(lightOnM);
loffhBOX.Text = Convert.ToString(lightOffH);
loffmBOX.Text = Convert.ToString(lightOffM);
}
privado CancelBUT_Click void (remitente de objeto, EventArgs e) / / Cancel. Sin cambios guardados en la tabla.
{
Label3. Visible = false;
label4. Visible = false;
Label5. Visible = false;
label6. Visible = false;
lonhBOX.Visible = false;
lonmBOX.Visible = false;
loffhBOX.Visible = false;
loffmBOX.Visible = false;
saveBUT.Visible = false;
CancelBUT.Visible = false;
stateTextBox.Visible = true;
lightOn.Visible = true;
lightOff.Visible = true;
}
privado saveBUT_Click void (remitente de objeto, EventArgs e) / / Guardar cambios de configuración a la tabla de "ajustes".
{
lightOnH = Convert.ToInt16(lonhBOX.Text); Convertir cadenas de texto en enteros.
lightOnM = Convert.ToInt16(lonmBOX.Text);
lightOffH = Convert.ToInt16(loffhBOX.Text);
lightOffM = Convert.ToInt16(loffmBOX.Text);
Conexión de base de datos abierta.
MySqlConnection MyCon = new MySqlConnection ("SERVER = localhost;" + "base de datos = garden2;" + "UID = root;" + "PASSWORD = contraseña;");
MyCon.Open();
Actualizar tabla cadena SQL.
MySqlCommand comando = new MySqlCommand ("configuración de actualización conjunto LOnH =" + lightOnH + ", LOnM =" + lightOnM + ", LOffH =" + lightOffH + ", LOffM =" + lightOffM, MyCon);
comando. ExecuteNonQuery();
Cerrar la conexión de base de datos.
MyCon.Close();
Fijar la forma.
Label3. Visible = false;
label4. Visible = false;
Label5. Visible = false;
label6. Visible = false;
lonhBOX.Visible = false;
lonmBOX.Visible = false;
loffhBOX.Visible = false;
loffmBOX.Visible = false;
saveBUT.Visible = false;
CancelBUT.Visible = false;
stateTextBox.Visible = true;
lightOn.Visible = true;
lightOff.Visible = true;
}
}
}
// ---------------------------------------------------------------------------------------------------------------------------------
# Descarga HeidiSQL
#
# --------------------------------------------------------
# Host: 127.0.0.1
# Base de datos: garden2
# Server versión: 5.1.39-community
# Servidor sistema operativo: Win32
# Blanco compatibilidad: ANSI SQL
# HeidiSQL versión: 4.0
Fecha # tiempo: 2009-11-14 15:57:31
# --------------------------------------------------------
/ *! 40101 SET SQL_MODE = 'ANSI, NO_BACKSLASH_ESCAPES'; * /
/ *! 40014 SET FOREIGN_KEY_CHECKS = 0; * /
#
# Estructura base de datos para base de datos 'garden2'
#
CREAR la base de datos / *! 32312 si no existe * / "garden2" / *! 40100 DEFAULT CHARACTER SET utf8 * /;
USO "garden2";
#
# Estructura de tabla 'lecturas'
#
CREATE TABLE / *! 32312 si no existe * / () "lecturas"
«Id» bigint(20) unsigned no NULL AUTO_INCREMENT,
"tiempo" timestamp no NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"la luz" int(10) DEFAULT NULL,
"temp1" doble DEFAULT NULL,
"temp2" doble DEFAULT NULL,
"temp3" doble DEFAULT NULL,
int(10) de "m1" DEFAULT NULL,
"m2" int(10) DEFAULT NULL,
PRIMARY KEY ("Id"),
CLAVE única "Id" ("Id"),
TECLA "Id_2" ("Id")
);
#
# Estructura de tabla 'settings'
#
CREATE TABLE / *! 32312 si no existe * / () "configuración"
Tinyint(2) "LOnH" unsigned NOT NULL,
Tinyint(2) "LOnM" unsigned NOT NULL,
"LOffH" tinyint(2) unsigned NOT NULL,
"LOffM" tinyint(2) unsigned NOT NULL
);
/ *! 40101 SET SQL_MODE =
/ *! 40014 SET FOREIGN_KEY_CHECKS =