Indoor Grow espace bureautique Partie 1 (8 / 9 étapes)

Étape 8: Programme c# et MySQL

Objectif : le programme doit contrôler l’arduino via le port série USB. Le code à traiter le port a été dérivé de http://csharp.simpleserial.com/ . Tout crédit du maître d’ouvrage.

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 =

Articles Liés

Trois partie horloge

Trois partie horloge

une horloge analogique normale est un moyen efficace d'empilage de trois différentes bribes d'information sur le dessus de l'autre. Les heures, minutes et secondes peuvent être lu avec un seul cadran.J'aime ce système, mais après un certain temps, j'
Oubliés les petits espaces

Oubliés les petits espaces

Il y a probablement des espaces dans votre maison que vous même ne reconnaissez pas comme des espaces de stockage. Peut-être qu'ils sont désignés pour autre chose, quelque chose de spécifique. Mais qui ne signifie pas que vous ne pouvez pas pirater e
Comment planifier une tâche partie

Comment planifier une tâche partie

groupe de travail A est un événement dans quel parti membres tirer un seau de tâches (rédigés par l'animateur), effectuent la tâche, écrire un nouveau et continuent. Les tâches peuvent être aussi très imaginatifs que possible et comme l'artisanat-com
Jimmy DiResta Collaboration : 26 géométrie, dirigeants & Patterns atelier conseils

Jimmy DiResta Collaboration : 26 géométrie, dirigeants & Patterns atelier conseils

Salut sa fait un moment depuis ma dernière version mais enfin Voici la quatrième partie de cette série de collaboration Instructables entre Jimmy Diresta et moi. Une des raisons pourquoi il a fallu plus de temps pour créer ce Instructable était l'uti
Faire une mangeoire à oiseaux Bench Swing

Faire une mangeoire à oiseaux Bench Swing

Salut tout le monde !Dans ce instructable je vais vous montrer comment faire une mangeoire à oiseaux banc jolie balançoire de matériaux de rebut.C'est un projet simple et gratuit qui vous mènera à une heure de travail (inclus le temps passé en attent
Poêle à l’alcool en aluminium

Poêle à l’alcool en aluminium

Salut tout le monde !Dans ce guide, je vais vous montrer comment faire un alcool facile poêle à partir d'un aluminium can/bouteille.Je sais... Vous pensez probablement "encore un autre alcool poêle ? « Vraiment? »Eh bien... Je sais que l'internet est
Bug l’optimiste de mécanicien Out Bag

Bug l’optimiste de mécanicien Out Bag

Tout espoir pour l'avenir de l'humanité dans un monde apocalyptique, il faudra les humains à travailler ensemble, la coopération. Personne ne sera capable de survivre complètement seul. Ne vous méprenez pas ici, je ne sais pas il y a environ 50 perso
Horizons : In situ perspectiviste Art Installation

Horizons : In situ perspectiviste Art Installation

En août 2014, mon collaborateur, Sebastian Martin (Instructables membre HotGlue) et j'ai fait une installation in situ à la résidence d'artistes dans le comté de Mendocino. Beaucoup d'artistes utilise l'illusion perspectiviste dans leur travail, et n
LED Cube avec Arduino et PCB personnalisé

LED Cube avec Arduino et PCB personnalisé

cette instructable détaille la conception et la construction des processus pour une 5 x 5 x 5 cube LED, contrôlée avec un Arduino, qui réside sur un circuits imprimés personnalisés.Vidéos, photos et informations supplémentaires se trouvent sur mon si
Planche Ouija

Planche Ouija

je vais vous montrer comment faire une planche ouija, une planche d'ouija est un « portail de l'univers spirituel » tout en un petit Conseil !Étape 1: matériauxvous aurez besoin :marqueurun morceau de carton environ 1 pied de long et 8 pouces de haut
Granny Square chanvre sous-verres

Granny Square chanvre sous-verres

avec l'été approche à grands pas, je contemplais quelque chose je pourrais faire pour apporter en ces jours chauds et moite. Ma famille cuit beaucoup (nous aimons notre temps BBQ et piscine) alors je suis allé immanent à une idée de quelque chose à u
Comment se débarrasser des boutons

Comment se débarrasser des boutons

ce qui se passe sur la façon de se débarrasser des boutons, avec fournitures simples et pas nommé médecine traitant de la marque. C'est très efficace. Je ne sais pas si cela fonctionnera sur l'acné, car j'ai été utilisant cela et n'ont jamais eu de v
Comment construire un 6000 gallons, réservoir d’eau

Comment construire un 6000 gallons, réservoir d’eau

l'idée de « se préparer » peut comprendre beaucoup de choses dans tellement de situations différentes. La clé est de vous demander ce que vous ne pouvez pas, ou ne veux pas, vivre sans. Pour nous, la réponse est l'eau.Si vous habitez hors réseau ou d
Amplificateur stéréo de poche

Amplificateur stéréo de poche

un tout en un aller je suis tombé sur cette instructable : amplificateur de format de poche rechargeableet aimé l'idée d'un ampli audio de format de poche, mais a été déçu mais son manque de capacité, à savoir en utilisant uniquement l'amplification