Inomhus växa utrymme Automation del 1 (8 / 9 steg)

Steg 8: C# Program & MySQL



Mål: programmet måste styra arduino via USB-seriell port. Koden för att ta itu med hamnen härrör från http://csharp.simpleserial.com/ . All heder till utvecklaren.

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 =

Se Steg
Relaterade Ämnen

Ge din Cisco Linksys NSLU2 några muskler. (del 1)

NSLU2 är slags en NAS (nätverken behandlas lagring) där du måste använda dina egna enheter. Bra för säkerhetskopior och allt, men det kan göra så mycket mer. Det finns alternativa firmware som Openwrt som kan installeras på den för att kunna fungera...

Hur man startar ett företag

starta ett företag är inte svårare än att bestämma att du har den risktolerans och temperamenten för sådan en strävan och beslutar att bara ta din idé och gå för det.Det finns ingen enda recept för att starta ett företag.Trots den catchy titeln, dett...

3D-stereoskopisk fotografering

3D-fotografering eller stereoskopisk fotografi är konsten att fånga och visar två något kompensera fotografier för att skapa tre dimensionella bilder.3D-effekten fungerar på grund av en princip som kallas stereoseende. Varje öga är på en annan plats,...

Hängande lagringsbehållare

Nyligen gjorde jag och installerat några tunga hyllor i mitt hus, som behandlas i detta instructable: enkel tunga hyllor.Rummet där jag installerat dessa hyllor fungerar som mitt hemmakontor liksom min familjs inomhus gör utrymme.Så vi har massor av...

DIY hög rygg klädd sänggavel (med instruktioner)

( se mer instruktioner goto http://cleverdiy.weebly.com/decor-collection27.html )Steg #1. Första saker först, du måste kunna transportera ditt virke till din arbetsplats. Eftersom jag mätte gaveln för att vara 48 in av 60 i för en queen size säng, kö...

Perfekta vandringen: Följ vägen för Backpacker

Vad är den perfekta vandra? Tja, ser jag på det som jag gör en plan landning--någon backpacking resa kan du promenera bort från...Backpacking är konsten att bekvämt överleva i en ogästvänlig miljö med så lite som det är säkert möjligt. Praktiskt tage...

Hur man gör Linocuts!

Syfte: Syftet med detta instructable är att lära dig hur man gör ett linoleumsnitt av din egen.Vad är ett linoleumsnitt?: Linocuts är mycket lika träsnitt. Det är en utskriftsmetod med en ark av linoleum, där en subtraktiv skärande metoden används fö...

Hembakat bröd!

Detta är ett riktigt enkelt recept och brödet smakar verkligen bra:)Svarar för den Make-till-lära ungdomar tävlingVad gjorde du?Jag gjorde 2 limpor vete brödHur gjorde du det?Jo jag fick idén att vi inte hade några bröd:) Och dess hälsosammare att gö...

Hand stämplat Diy Holly omslagspapper.

Under helgen bestämde jag mig att prova på att göra min egen hand stämplat omslagspapper. Jag hade haft att göra min sista massa anpassade eraser stämplar så mycket att det kändes som en perfekt tid att ha en annan gå, denna gång med ett jultema holl...

Gör din egen Diy anpassade Eraser frimärken.

Denna helgen hade jag prova på att göra min egen diy frimärken med suddgummin. Jag gjorde en liten bit av grafik i skolan och jag har undrat nyligen om det fanns ett sätt att göra min egen egna stämplar. Visar sig slätt, vanlig körning av mill suddgu...

(Källa filer för) Hur man gör en OAWR (hinder att undvika Walking Robot)

detta är en utlöpare Instructable från hur man gör en OAWR (hinder att undvika Walking Robot) och innehåller versioner av filer från detta instructable i redigerbart format (alla trevliga och öppna source'ary jag gillar att tänka).(Om det finns någon...

Gör din egen kamouflage

för en av mina ämnen i skolan, jag var tvungen att hitta en klient med ett behov och möta detta behov. Min djur-mutter vän bad mig att göra hans ett objekt av kläder som skulle tillåta honom att observera sin favorit djur i naturen, utan att spotted...

Mmm... (multi-tasking maskulina Media) Rum - dela ditt utrymme med Ikea Challenge

MMM-detta rum skulle se ut verkligen underbart och fungerar bättre med några nya tillägg från Ikea!Detta rum fungerar som:TV-rummettvätt vikning rumrummet där vår son blir redo för idrott i skolan / med förvaring för skolan och team uniformer för fot...

Förvandla ett litet utrymme med mosaik (del 2 av mosaik utrymme)

Har du ett utrymme i källaren eller kanske en gammal stökigt garderob som du vill omforma eller fixa upp?Vi gjorde, och det var under våra källaren trappor. Medan min man hade förvandlade de flesta av våra källare i en vadderad lekplats för våra två...

Installation och konfiguration av OpenHAB. Del 6: Sakernas Internet, Home Automation

FörordSå, om du har följt de tidigare delarna (IoT - "Intranät" saker: Home Automation. Del1: IoT, introduktion och framåt) du kommer att ha dig en IoT nätverk liknar den som visas ovan (bild 2 och 3). I denna del kommer vi lägga sista touch. An...

Skapa din första IoT Ethernet-enhet. Del 5: Sakernas Internet, Home Automation

Detta är en "twofer" (två för en) är den första delen (A) Ethernet motsvarande sin WiFi ESP8266/DHT22 baserat föregångare med en extra I2C LCD-display för sammanfattningsdata (se andra bilden ovan). I del (B) vi kommer att utöka design (se först...

Att inrätta en MQTT mäklare. Del 2: Sakernas Internet, Home Automation

FörordOkej i "Del1: Sakernas Internet, Home Automation", du har skapat och konfigurerat din "Vanilj" Raspberry Pi (ursäkta ordvitsen) och kan fjärransluta till det med kitt. Nu ställer vi in en server som kommer att upprätta din huvuds...

Skapa din första IoT WiFi-enhet. Del 3: Sakernas Internet, Home Automation

Detta Instructable dokument hur man skapar en enkel IoT enhet (bilden ovan) baserat runt ESP8266-01 WiFi aktiverat modulen och är den tredje delen i en serie av Instructables beskriver hur du ställer in egna IoT hemnätverket.IoT enheten i fråga har e...

"Koppleri" din första IoT WiFi-enhet. Del 4: Sakernas Internet, Home Automation

OK, inte så mycket koppleri men att utvidga din första IoT enhetIntroduktionDetta Instructable dokumenterar hur enkelt det är att utvidga och ytterligare utveckla en IoT enhet (bilden ovan) och är uppbyggd kring ESP8266-01 WiFi aktiverat modulen från...