Inomhus växa utrymme Automation del 1 (8 / 9 steg)
Steg 8: C# Program & MySQL
Todo:
-Skapa MySQL-databas och tabeller. Koden nedan C#-kod eller se Garden2.zip.
-Du måste ställa in din MySQL databasanvändarnamn och lösenord i koden.
-Även e du detaljer i funktionen emailStatus.
// ---------------------------------------------------------------------------------------------------------------------------------
med hjälp av systemet.
använder System.Collections.Generic;
använder System.ComponentModel;
med hjälp av System.Data;
med hjälp av System.Drawing;
använder System.Text;
använder System.Windows.Forms;
använder MySql.Data; För MySQL
använda MySql.Data.MySqlClient; För MySQL
använder System.Diagnostics; Att göra emailStatus()
namnområdet trädgård
{
offentliga partiell klass Form1: Form
{
sträng RxString, tester, tempS, ljus, Temp1 Temp2, Temp3, moist1, moist2 = "";
dubbla workD, tmp1, tmp2, tmp3, m1, m2 = 0;
char samtal = "0";
char [] buff = nya char [1].
char [] conv = nya char [70].
int l1, c2, lightOnH, lightOnM, lightOffH, lightOffM = 0;
int count = 0;
bool state = false;
offentliga Form1()
{
InitializeComponent();
Dölja vissa knappar och textrutor. Jag ville skapa ett separat formulär för att ange variabler
dvs. ljus över tid. Jag kunde inte lista ut hur man passera växlande emellan former i c#.
Detta kommer att vara på min önskelista för senare versioner. För nu dölja jag saker för att skapa mer
utrymme i formuläret.
Label3. Synliga = false;
Label4. Synliga = false;
Label5. Synliga = false;
Label6. Synliga = false;
lonhBOX.Visible = false;
lonmBOX.Visible = false;
loffhBOX.Visible = false;
loffmBOX.Visible = false;
saveBUT.Visible = false;
CancelBUT.Visible = false;
}
privata void buttonStart_Click (objekt avsändare, EventArgs e) / / kan börja saker.
{/ / Alla mellanrum behov för att spara i "Inställningar" tabell. Todo.
timer1. Intervall = 10000; Timer för 10 sekunder. Jag visar värden på den från varje
10 sekunder.
timer1. Aktiverat = sant; Starta timern.
timer1. Tickande += nya EventHandler(timer1_Tick); Setup händelsehanteraren för timern.
timer2. Intervall = 500. Detta händer varje.5 andra uppdatera datum och tid
fältet i formuläret.
timer2. Aktiverat = sant;
timer2. Tickande += nya EventHandler(timer2_Tick);
timer3. Intervall = 3600000; Intervall som du vill skicka status till ägaren.
timer3. Aktiverat = sant;
timer3. Tickande += nya EventHandler(timer3_Tick);
serialPort1.PortName = "COM3"; USB-seriell portnummer.
Måste göra detta kan ändras genom att fastställa inställningar.
Att spara i databasen i tabellen "Inställningar".
serialPort1.BaudRate = 9600; Seriell porthastighet.
Ibland måste jag återställa arduino via knappen på styrelsen
för att få saker och ting vid start. Inte säker på varför seriella
kommunikationen fungerar inte alltid direkt. Återställa en gång och
arbetar det håller fungerar, så det inte vägglusen jag för mycket. FYI.
serialPort1.Open(); Öppna seriell port för kommunikation.
om (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = sant;
}
ReadMyData(); Få inställningar från "Inställningar" tabell.
CallA(); Skicka char "a" till arduino att få värden.
}
privata void emailStatus()
{
Processen myProc;
Starta processen.
Hämta SendEmail här: http://caspian.dotconf.net/menu/Software/SendEmail/
myProc = Process.Start ("c:\\email\\sendEmail.exe", "-f -t din -u Status -m" + l1 + "," + tmp1 + "," + tmp2 + "," + tmp3 + "," + m1 + "," + m2 + "; -s your.smtp.com - xu användarnamn - xp lösenord ");
Stoppa processen.
myProc.CloseMainWindow();
}
privata void buttonStop_Click (objekt avsändare, EventArgs e) / / stoppa allt.
{
om (serialPort1.IsOpen)
{
timer1. Aktiverat = false; Stoppa timers.
timer2. Aktiverat = false;
timer3. Aktiverat = false;
serialPort1.Close(); Stäng den seriella porten.
buttonStart.Enabled = sant;
buttonStop.Enabled = false;
}
}
privata void Form1_FormClosing (objekt avsändare, FormClosingEventArgs e)
{
om (serialPort1.IsOpen) serialPort1.Close(); Nära port om vi lämnar.
}
privata void visningstext (objekt avsändare, EventArgs e) / / Visa formulärvärden. Du kan titta här för de
bildar textnamn.
{
lightBox.Text = ljus. Visa värden i textrutorna.
m1Box.text = moist1;
m2Box.text = moist2;
workD = Convert.ToDouble(Temp1) / 10000; Få våra decimaler tillbaka.
tmp1 = workD; Spara för databasen spara.
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;
om (state)
{
stateTextBox.Text = "On";
}
annat
{
stateTextBox.Text = "Off";
}
C2 = c2 + 1.
om (c2 == 6) / / varje 6 10 sekunder spara till databas. Detta är ganska tilld datapunkter.
{
L1 = Convert.ToInt16(light); Konvertera värden till spara i databasen.
M1 = Convert.ToInt16(moist1);
m2 = Convert.ToInt16(moist2);
C2 = 0;
Setup-anslutningssträng.
MySqlConnection MyCon = nya MySqlConnection ("SERVER = localhost;" + "databas = garden2;" + "UID = rot." + "lösenord = lösenord;");
Öppen anslutning.
MyCon.Open();
Installera SQL-strängen.
MySqlCommand kommando = nya MySqlCommand ("insert into avläsningar values (null, null," + l1 + "," + tmp1 + "," + tmp2 + "," + tmp3 + "," + m1 + "," + m2 + ")", MyCon);
Exekvera SQL-strängen på databasen.
kommandot. ExecuteNonQuery();
Nära databasanslutningen.
MyCon.Close();
Göra några logik för att avgöra om byte ljuset på eller av. Detta skulle förmodligen kunna göras i en separat timer-händelsen.
om (DateTime.Now.Hour > = lightOnH)
{
om (DateTime.Now.Hour > = lightOffH)
{
om (DateTime.Now.Minute > = lightOffM)
{
CallC(); Ljus ut.
}
}
annat
{
om (DateTime.Now.Minute > = lightOnM)
{
CallB(); Ljus på.
}
}
}
annat
{
CallC(); Ljus ut.
}
}
}
privata void sortera (objekt avsändare, EventArgs e) / / dissekera den sträng som vi fick från arduino.
{
Tester = "~"; Värdet paus röding.
ljus = ""; Rensa alla värden.
Temp1 = "";
Temp2 = "";
Temp3 = "";
moist1 = "";
moist2 = "";
Count = 0;
medan (RxString [antal]! = testS[0]) / / kolla första röding för break value(~). Upprepa tills hittade.
{
ljus = ljus + RxString [antal]; Om inte Lägg röding till nya string(light).
räkna + = 1; Gå till nästa char.
}
räkna + = 1; Låter gå vidare till nästa char via (antal).
medan (RxString [antal]! = testS[0])
{
Temp1 = Temp1 + RxString [antal];
räkna + = 1;
}
räkna + = 1;
medan (RxString [antal]! = testS[0])
{
Temp2 = Temp2 + RxString [antal];
räkna + = 1;
}
räkna + = 1;
medan (RxString [antal]! = testS[0])
{
Temp3 = Temp3 + RxString [antal];
räkna + = 1;
}
räkna + = 1;
medan (RxString [antal]! = testS[0])
{
moist1 = moist1 + RxString [antal];
räkna + = 1;
}
räkna + = 1;
medan (RxString [antal]! = testS[0])
{
moist2 = moist2 + RxString [antal];
räkna + = 1;
}
Lägga till mer medan uttalanden för extra värden från arduino.
}
public void ReadMyData() / / läsa "Inställningar" tabell.
{
SQL frågesträngen.
string mySelectQuery = "Välj LOnH, LOnM, LOffH, LOffM från inställningar";
Anslutningssträngen för databasen.
MySqlConnection myConnection = nya MySqlConnection ("SERVER = localhost;" + "databas = garden2;" + "UID = rot." + "lösenord = lösenord;");
MySqlCommand Mittkommando = nya MySqlCommand (mySelectQuery, myConnection);
Öppen databasanslutning.
myConnection.Open();
MySqlDataReader myReader;
Köra frågesträngen.
myReader = myCommand.ExecuteReader();
Alltid ringa Läs innan åtkomst till data.
samtidigt (myReader.Read())
{
lightOnH = myReader.GetInt16(0);
lightOnM = myReader.GetInt16(1);
lightOffH = myReader.GetInt16(2);
lightOffM = myReader.GetInt16(3);
}
Ring alltid i närheten när gjort behandlingen.
myReader.Close();
Stäng anslutningen när du är klar med den.
myConnection.Close();
}
privata void serialPort1_DataReceived (objekt avsändare, System.IO.Ports.SerialDataReceivedEventArgs e) / / vi har data i hamnen.
{
System.Threading.Thread.Sleep(50); En fördröjning att se till att alla data tas emot i hamnen.
Switch (Ring)
{
fallet "a": / / vi kallas en "a".
RxString = ""; Rensa och ta emot strängen.
RxString = serialPort1.ReadExisting(); Hämta data från hamnen.
Detta. Åberopa (nya EventHandler(Sort)); Dissekera strängen i enskilda värden.
Detta. Åberopa (nya EventHandler(DisplayText)); Visa värden i formuläret.
bryta;
fallet "c": / / vi kallas ett "c". Framtida användning.
bryta;
fall skulle ": / / vi kallas ett"d". Framtida användning.
bryta;
fallet "e": / / vi kallas ett "e". Framtida användning.
bryta;
}
}
privata void CallA() / / skicka char "en" till seriell port.
{
om (! serialPort1.IsOpen) återvända;
buff [0] = "a";
Ring = "a"; Används för att se vad kallar vi gjort till arduino.
serialPort1.Write (buff, 0, 1);
}
privata void CallB() / / skicka char "b" till seriell port.
{
om (! stat)
{
om (! serialPort1.IsOpen) återvända;
buff [0] = "b";
Ring = "b";
serialPort1.Write (buff, 0, 1);
State = sant;
}
}
privata void CallC() / / skicka char "c" till seriell port.
{
om (staten) {
om (! serialPort1.IsOpen) återvända;
buff [0] = 'c';
Ring = 'c';
serialPort1.Write (buff, 0, 1);
State = false;
}
}
privata void wtime() / / skriver datum/tid till former textrutan.
{
DateBox.Text = Convert.ToString(DateTime.Now);
}
privata void timer1_Tick (objekt avsändare, System.EventArgs e) / / Timer-händelsen.
{
CallA(); Skicka "a". Hämta värden.
}
privata void timer2_Tick (objekt avsändare, System.EventArgs e)
{
wtime(); Anropa wtime funktion.
}
privata void timer3_Tick (objekt avsändare, System.EventArgs e)
{
emailStatus(); Anropa emailStatus funktion.
}
privata void lightOn_Click (objekt avsändare, EventArgs e) / / skicka ljus på rekommenderar till arduino. Röding "b".
{
om (! serialPort1.IsOpen) återvända;
buff [0] = "b";
Ring = "b";
serialPort1.Write (buff, 0, 1);
State = sant;
}
privata void lightOff_Click (objekt avsändare, EventArgs e) / / skicka ljus off rekommenderar till arduino. Röding "c".
{
om (! serialPort1.IsOpen) återvända;
buff [0] = 'c';
Ring = 'c';
serialPort1.Write (buff, 0, 1);
State = false;
}
privata void settingsBUT_Click (objekt avsändare, EventArgs e) / / Låt oss ange nya inställningar.
{
ReadMyData(); Hämta data från tabellen "Inställningar".
stateTextBox.Visible = false;
lightOn.Visible = false;
lightOff.Visible = false;
Label3. Synliga = sant;
Label4. Synliga = sant;
Label5. Synliga = sant;
Label6. Synliga = sant;
lonhBOX.Visible = sant;
lonmBOX.Visible = sant;
loffhBOX.Visible = sant;
loffmBOX.Visible = sant;
saveBUT.Visible = sant;
CancelBUT.Visible = sant;
lonhBOX.Text = Convert.ToString(lightOnH);
lonmBOX.Text = Convert.ToString(lightOnM);
loffhBOX.Text = Convert.ToString(lightOffH);
loffmBOX.Text = Convert.ToString(lightOffM);
}
privata void CancelBUT_Click (objekt avsändare, EventArgs e) / / avbryta. Inga ändringar sparas tabell.
{
Label3. Synliga = false;
Label4. Synliga = false;
Label5. Synliga = false;
Label6. Synliga = false;
lonhBOX.Visible = false;
lonmBOX.Visible = false;
loffhBOX.Visible = false;
loffmBOX.Visible = false;
saveBUT.Visible = false;
CancelBUT.Visible = false;
stateTextBox.Visible = sant;
lightOn.Visible = sant;
lightOff.Visible = sant;
}
privata void saveBUT_Click (objekt avsändare, EventArgs e) / / spara inställningar förändringar "Inställningar".
{
lightOnH = Convert.ToInt16(lonhBOX.Text); Konvertera textrutan strängar till heltal.
lightOnM = Convert.ToInt16(lonmBOX.Text);
lightOffH = Convert.ToInt16(loffhBOX.Text);
lightOffM = Convert.ToInt16(loffmBOX.Text);
Öppna databasanslutning.
MySqlConnection MyCon = nya MySqlConnection ("SERVER = localhost;" + "databas = garden2;" + "UID = rot." + "lösenord = lösenord;");
MyCon.Open();
Uppdatera registret SQL-sträng.
MySqlCommand kommando = nya MySqlCommand ("uppdatera inställningar LOnH =" + lightOnH + ", LOnM =" + lightOnM + ", LOffH =" + lightOffH + ", LOffM =" + lightOffM, MyCon);
kommandot. ExecuteNonQuery();
Nära databasanslutningen.
MyCon.Close();
Fix form.
Label3. Synliga = false;
Label4. Synliga = false;
Label5. Synliga = false;
Label6. Synliga = false;
lonhBOX.Visible = false;
lonmBOX.Visible = false;
loffhBOX.Visible = false;
loffmBOX.Visible = false;
saveBUT.Visible = false;
CancelBUT.Visible = false;
stateTextBox.Visible = sant;
lightOn.Visible = sant;
lightOff.Visible = sant;
}
}
}
// ---------------------------------------------------------------------------------------------------------------------------------
# HeidiSQL Dump
#
# --------------------------------------------------------
# Värdar: 127.0.0.1
# Databas: garden2
# Server version: 5.1.39-community
# Server OS: Win32
# Rikta kompatibilitet: ANSI SQL
# HeidiSQL version: 4.0
# Datum/tid: 2009-11-14 15:57:31
# --------------------------------------------------------
/ *! 40101 SET SQL_MODE = 'ANSI, NO_BACKSLASH_ESCAPES', * /
/ *! 40014 SET FOREIGN_KEY_CHECKS = 0; * /
#
# Databasstrukturen för databasen "garden2"
#
SKAPA databas / *! 32312 om inte EXISTS * / "garden2" / *! 40100 standard TECKENUPPSÄTTNINGEN utf8 * /;
Använd "garden2";
#
# Tabellstruktur för tabellen "behandlingar"
#
Skapa tabell / *! 32312 om inte EXISTS * / "läsningar" ()
"Id" bigint(20) osignerade inte NULL AUTO_INCREMENT,
"dtime" timestamp inte NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"light" int(10) DEFAULT NULL,
"temp1" dubbel DEFAULT NULL,
"temp2" dubbel DEFAULT NULL,
"temp3" dubbel DEFAULT NULL,
"m1" int(10) DEFAULT NULL,
"m2" int(10) DEFAULT NULL,
PRIMÄRNYCKELN ("Id"),
Unik nyckel "Id" ("Id"),
NYCKELN "Id_2" ("Id")
);
#
# Tabellstruktur för tabell 'Inställningar'
#
Skapa tabell / *! 32312 om inte EXISTS * / () "Inställningar"
"LOnH" tinyint(2) osignerade inte NULL,
"LOnM" tinyint(2) osignerade inte NULL,
"LOffH" tinyint(2) osignerade inte NULL,
"LOffM" tinyint(2) osignerade NOT NULL
);
/ *! 40101 SET SQL_MODE =
/ *! 40014 SET FOREIGN_KEY_CHECKS =