Étape 8: Programme c# et MySQL
TODO :
-Créer la base de données MySQL et les tableaux. Code ci-dessous le code c# ou consultez Garden2.zip.
-Vous devez définir votre nom d’utilisateur de base de données MySQL et le mot de passe dans le code.
-Également vous envoyez les détails dans la fonction EmailEtat fonction.
// ---------------------------------------------------------------------------------------------------------------------------------
using System ;
à l’aide de System.Collections.Generic ;
à l’aide de System.ComponentModel ;
using System.Data ;
à l’aide de System.Drawing ;
using System.Text ;
using System.Windows.Forms ;
à l’aide de MySql.Data ; Pour MySQL
à l’aide de MySql.Data.MySqlClient ; Pour MySQL
using System.Diagnostics ; Faire emailStatus()
Jardin de l’espace de noms
{
partial class Form1 : Form
{
chaîne RxString, les essais, les tempS, lumière, Temp1, Temp2, Temp3, moist1, moist2 = "" ;
double workD, tmp1, tmp2, tmp3, m1, m2 = 0 ;
appel de char = « 0 » ;
Char [] buff = new char [1] ;
Char [] conv = new char [70] ;
int l1, c2, lightOnH, lightOnM, lightOffH, lightOffM = 0 ;
int count = 0 ;
bool état = false ;
public Form1()
{
InitializeComponent() ;
Masquer certains boutons et les zones de texte. J’ai voulu créer un formulaire distinct pour définir des variables
C’est à dire. lumière à l’heure. Je ne pouvais pas comprendre comment passer des variables entre les formes en c#.
Ce sera sur ma liste de souhaits pour les versions ultérieures. Pour l’instant j’ai cacher des choses pour créer plus
espace sur le formulaire.
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 ;
}
' private void buttonStart_Click (object sender, EventArgs e) / / permet de démarrer les choses.
{/ / Tous les intervalles doit être enregistrer dans le tableau « paramètres ». TODO.
Timer1. Intervalle = 10000 ; Minuterie pour 10 secondes. Afficher les valeurs sur le de chaque
10 secondes.
Timer1. Enabled = true ; Démarrer la minuterie.
Timer1. Cochez += new EventHandler(timer1_Tick) ; Configurer le gestionnaire d’événements pour la minuterie.
TIMER2. Intervalle = 500 ; Dans ce cas toutes les 5 secondes pour mettre à jour la date/heure
champ du formulaire.
TIMER2. Enabled = true ;
TIMER2. Cochez += new EventHandler(timer2_Tick) ;
timer3. Intervalle = 3600000 ; Intervalle à laquelle envoyer le statut au propriétaire.
timer3. Enabled = true ;
timer3. Cochez += new EventHandler(timer3_Tick) ;
serialPort1.PortName = « COM3 » ; Numéro de port série USB.
Besoin de faire de cette variable en fixant des paramètres.
Pour enregistrer dans la base de données dans le tableau « paramètres ».
serialPort1.BaudRate = 9600 ; Vitesse du port série.
Parfois j’ai besoin de réinitialiser l’arduino via le bouton sur la planche
pour faire avancer les choses au démarrage. Ne sais pas pourquoi le numéro de série
communication ne fonctionne pas toujours tout de suite. Une fois reset et
travail, il continue à travailler, donc il ne m’énerver trop. POUR INFO.
serialPort1.Open() ; Port série ouvert pour la communication.
Si (serialPort1.IsOpen)
{
buttonStart.Enabled = false ;
buttonStop.Enabled = true ;
}
ReadMyData() ; Obtenir les paramètres de la table « paramètres ».
CallA() ; Envoyer le char « a » à l’arduino pour obtenir des valeurs.
}
Private Sub emailStatus()
{
MyProc de processus ;
Démarrer le processus.
Téléchargez SendEmail ici : http://caspian.dotconf.net/menu/Software/SendEmail/
myProc = Process.Start (« c:\\email\\sendEmail.exe », "-f votre -t votre statut -m" + l1 + «, » tmp1 + «, » tmp2 + «, » + tmp3 + «, » + m1 + «, » + m2 + «; » -s your.smtp.com xu - username - xp mot de passe ") ;
Arrêter le processus.
myProc.CloseMainWindow() ;
}
' private void buttonStop_Click (object sender, EventArgs e) / / tout arrêter.
{
Si (serialPort1.IsOpen)
{
Timer1. Enabled = false ; Arrêter les minuteries.
TIMER2. Enabled = false ;
timer3. Enabled = false ;
serialPort1.Close() ; Fermer le port série.
buttonStart.Enabled = true ;
buttonStop.Enabled = false ;
}
}
private void Form1_FormClosing (object sender, FormClosingEventArgs e)
{
Si (serialPort1.IsOpen) serialPort1.Close() ; Près de port si nous partons.
}
privé DisplayText void (object sender, EventArgs e) / / afficher les valeurs du formulaire. Vous pouvez regarder ici la
noms de formes de texte.
{
lightBox.Text = lumière ; Afficher les valeurs dans les zones de texte.
m1Box.Text = moist1 ;
m2Box.Text = moist2 ;
workD = Convert.ToDouble(Temp1) / 10000 ; Récupérer notre décimales.
tmp1 = workD ; Sauf pour la base de données enregistrer.
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 (État)
{
stateTextBox.Text = « On » ;
}
d’autre
{
stateTextBox.Text = « Off » ;
}
C2 = c2 + 1 ;
Si (c2 == 6) / / chaque 6 10 secondes enregistrer dans la base de données. C’est tout à fait attribuer des points de données.
{
L1 = Convert.ToInt16(light) ; Convertir des valeurs à enregistrer dans la base de données.
M1 = Convert.ToInt16(moist1) ;
m2 = Convert.ToInt16(moist2) ;
C2 = 0 ;
Installation de chaîne de connexion.
MySqlConnection MyCon = new MySqlConnection ("SERVER = localhost;" + "DATABASE = garden2;" + "UID = root;" + "mot de passe = mot de passe;") ;
Connexion ouverte.
MyCon.Open() ;
Configuration de la chaîne SQL.
Commande MySqlCommand = new MySqlCommand ("insert into lectures values (null, null," + l1 + "," tmp1 + "," + tmp2 + "," + tmp3 + "," + m1 + "," + m2 + ")", MyCon) ;
Exécuter la chaîne SQL sur la base de données.
commande. ExecuteNonQuery() ;
Fermer la connexion à la base.
MyCon.Close() ;
Faire une logique pour déterminer s’il faut allumer ou éteindre. Cela pourrait probablement se faire dans un événement distinct.
Si (DateTime.Now.Hour > = lightOnH)
{
Si (DateTime.Now.Hour > = lightOffH)
{
Si (DateTime.Now.Minute > = lightOffM)
{
CallC() ; Lumière éteinte.
}
}
d’autre
{
Si (DateTime.Now.Minute > = lightOnM)
{
CallB() ; Lumière sur.
}
}
}
d’autre
{
CallC() ; Lumière éteinte.
}
}
}
privé type void (object sender, EventArgs e) / / disséquer la chaîne que nous avons obtenues de l’arduino.
{
les testS = "~" ; Le char de rupture de valeur.
lumière = "" ; Effacez toutes les valeurs.
Temp1 = "" ;
Temp2 = "" ;
Temp3 = "" ;
moist1 = "" ;
moist2 = "" ;
Count = 0 ;
tandis que (RxString [count]! = testS[0]) / / vérifier le premier char de rupture value(~). Répéter jusqu'à trouvé.
{
lumière = lumière + RxString [count] ; Si ce n’est pas le cas, ajoutez le char à nouveau string(light).
Count += 1 ; Goto prochain char.
}
Count += 1 ; Permet de passer à la prochaine char par l’intermédiaire de (comte).
tandis que (RxString [count]! = testS[0])
{
Temp1 = Temp1 + RxString [count] ;
Count += 1 ;
}
Count += 1 ;
tandis que (RxString [count]! = testS[0])
{
Temp2 = Temp2 + RxString [count] ;
Count += 1 ;
}
Count += 1 ;
tandis que (RxString [count]! = testS[0])
{
Temp3 = Temp3 + RxString [count] ;
Count += 1 ;
}
Count += 1 ;
tandis que (RxString [count]! = testS[0])
{
moist1 = moist1 + RxString [count] ;
Count += 1 ;
}
Count += 1 ;
tandis que (RxString [count]! = testS[0])
{
moist2 = moist2 + RxString [count] ;
Count += 1 ;
}
Ajouter d’autres tandis que des déclarations de valeurs supplémentaires d’arduino.
}
public void ReadMyData() / / lire la table des « paramètres ».
{
Chaîne de requête SQL.
string mySelectQuery As String = "SELECT LOnH, LOnM, LOffH, LOffM de paramètres" ;
Chaîne de connexion de base de données.
MySqlConnection myConnection = new MySqlConnection ("SERVER = localhost;" + "DATABASE = garden2;" + "UID = racine;" + "mot de passe = mot de passe;") ;
MySqlCommand myCommand = new MySqlCommand (mySelectQuery As String, myConnection) ;
Connexion de base de données ouverte.
myConnection.Open() ;
MyReader MySqlDataReader ;
Exécuter la chaîne de requête.
myReader = myCommand.ExecuteReader() ;
Appelez toujours lire avant d’accéder aux données.
tandis que (myReader.Read())
{
lightOnH = myReader.GetInt16(0) ;
lightOnM = myReader.GetInt16(1) ;
lightOffH = myReader.GetInt16(2) ;
lightOffM = myReader.GetInt16(3) ;
}
Appelez toujours Close quand fait lecture.
myReader.Close() ;
Fermer la connexion lorsque terminé avec lui.
myConnection.Close() ;
}
private void serialPort1_DataReceived (object sender, System.IO.Ports.SerialDataReceivedEventArgs e) / / nous avons données au port.
{
System.Threading.Thread.Sleep(50) ; Un délai pour s’assurer que toutes les données sont reçues au port.
commutateur (appel)
{
cas « a »: / / nous avons appelé un « a ».
RxString = "" ; Effacer la chaîne de réception.
RxString = serialPort1.ReadExisting() ; Téléchargez les données du port.
cela. Invoke (new EventHandler(Sort)) ; Disséquer la chaîne en valeurs individuelles.
cela. Invoke (new EventHandler(DisplayText)) ; Afficher les valeurs dans le formulaire.
rupture ;
case « c »: / / nous avons appelé un « c ». Utilisation ultérieure.
rupture ;
affaire aurait ": / / nous avons appelé un « d ». Utilisation ultérieure.
rupture ;
Case « e »: / / nous avons appelé un « e ». Utilisation ultérieure.
rupture ;
}
}
private void CallA() / / Envoyer un char « a » port de série.
{
Si (! serialPort1.IsOpen) return ;
Buff [0] = « a » ;
Appelez = « a » ; Utilisé pour voir ce que nous avons fait à l’arduino.
serialPort1.Write (chamois, 0, 1) ;
}
private void CallB() / / Envoyer un char « b » au port série.
{
Si (! État)
{
Si (! serialPort1.IsOpen) return ;
Buff [0] = « b » ;
Appelez = « b » ;
serialPort1.Write (chamois, 0, 1) ;
État = true ;
}
}
private void CallC() / / « c » à serial port d’envoi char.
{
Si {(État)
Si (! serialPort1.IsOpen) return ;
Buff [0] = « c » ;
Appelez = « c » ;
serialPort1.Write (chamois, 0, 1) ;
état = false ;
}
}
private void wtime() / / écrit date/heure à textbox forms.
{
DateBox.Text = Convert.ToString(DateTime.Now) ;
}
private void timer1_Tick (object sender, System.EventArgs e) / / événement Timer.
{
CallA() ; Envoyer « a ». Obtenir des valeurs.
}
private void timer2_Tick (object sender, System.EventArgs e)
{
wtime() ; Appelez la fonction wtime.
}
private void timer3_Tick (object sender, System.EventArgs e)
{
emailStatus() ; Appelez la fonction EmailEtat fonction.
}
' private void lightOn_Click (object sender, EventArgs e) / / Send lumière sur recommande à l’arduino. Char « b ».
{
Si (! serialPort1.IsOpen) return ;
Buff [0] = « b » ;
Appelez = « b » ;
serialPort1.Write (chamois, 0, 1) ;
État = true ;
}
' private void lightOff_Click (object sender, EventArgs e) / / Send lumière éteinte recommande à l’arduino. Char « c ».
{
Si (! serialPort1.IsOpen) return ;
Buff [0] = « c » ;
Appelez = « c » ;
serialPort1.Write (chamois, 0, 1) ;
état = false ;
}
' private void settingsBUT_Click (object sender, EventArgs e) / / nous allons entrer de nouveaux paramètres.
{
ReadMyData() ; Récupérez les données de la table « paramètres ».
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) ;
}
' private void CancelBUT_Click (object sender, EventArgs e) / / Cancel. Aucun changement enregistré dans la table.
{
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 ;
}
' private void saveBUT_Click (object sender, EventArgs e) / / enregistrer les modifications de paramètres table « paramètres ».
{
lightOnH = Convert.ToInt16(lonhBOX.Text) ; Convertir des chaînes de textbox en nombres entiers.
lightOnM = Convert.ToInt16(lonmBOX.Text) ;
lightOffH = Convert.ToInt16(loffhBOX.Text) ;
lightOffM = Convert.ToInt16(loffmBOX.Text) ;
Connexion de base de données ouverte.
MySqlConnection MyCon = new MySqlConnection ("SERVER = localhost;" + "DATABASE = garden2;" + "UID = root;" + "mot de passe = mot de passe;") ;
MyCon.Open() ;
Table chaîne SQL de mise à jour.
Commande MySqlCommand = new MySqlCommand ("mise à jour de paramètres définis LOnH =" + lightOnH + ", LOnM =" + lightOnM + ", LOffH =" + lightOffH + ", LOffM =" + lightOffM, Chantal) ;
commande. ExecuteNonQuery() ;
Fermer la connexion à la base.
MyCon.Close() ;
Difficulté de la forme.
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 ;
}
}
}
// ---------------------------------------------------------------------------------------------------------------------------------
# HeidiSQL Dump
#
# --------------------------------------------------------
# Host : 127.0.0.1
# Base de données : garden2
# Version du serveur : 5.1.39-community
# Système d’exploitation serveur : Win32
# Cibler compatibilité : ANSI SQL
# HeidiSQL version : 4.0
No date/time : 2009-11-14 15:57:31
# --------------------------------------------------------
/ *! 40101 SET SQL_MODE = « ANSI, NO_BACKSLASH_ESCAPES »; * /
/ *! 40014 SET FOREIGN_KEY_CHECKS = 0; * /
#
# Structure de base de données pour base de données « garden2 »
#
CREATE DATABASE / *! 32312 sinon EXISTS * / « garden2 » / *! 40100 DEFAULT CHARACTER SET utf8 * / ;
UTILISER « garden2 » ;
#
# Structure de la table pour la table « lectures »
#
CREATE TABLE / *! 32312 sinon EXISTS * / () « lectures »
« Id » bigint(20) unsigned NOT NULL AUTO_INCREMENT,
« dtime » timestamp pas NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
« lumière » int(10) DEFAULT NULL,
« temp1 » double DEFAULT NULL,
« temp2 » double DEFAULT NULL,
« temp3 » double DEFAULT NULL,
int(10) « m1 » DEFAULT NULL,
« m2 » int(10) DEFAULT NULL,
CLÉ primaire ("Id"),
CLÉ UNIQUE "Id" ("Id"),
TOUCHE « Id_2 » ("Id")
);
#
# Structure de la table pour la table « réglages »
#
CREATE TABLE / *! 32312 sinon EXISTS * / « paramètres » ()
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 =