Karel de Grote – Hogeschool Katholieke Hogeschool Antwerpen Departement Industriële Wetenschappen en Technologie Campus Hoboken
Draadloos embedded meetsysteem via Bluetooth door Kristof Booghmans
promotor: ing Koen Soontjens, campus Hoboken Proefschrift tot het behalen van de graad van Professionele Bachelor in de Elektronica-ICT Antwerpen, april 2007
Karel de Grote – Hogeschool Katholieke Hogeschool Antwerpen Departement Industriële Wetenschappen en Technologie Campus Hoboken
Draadloos embedded meetsysteem via Bluetooth door Kristof Booghmans
promotor: ing Koen Soontjens, campus Hoboken Proefschrift tot het behalen van de graad van Professionele Bachelor in de Elektronica-ICT Antwerpen, april 2007
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Voorwoord en bedanking Toen ons in het laatste jaar MCT werd gevraagd om een bedrijf te kiezen om de stageperiode door te brengen, heb ik geopteerd om deze op mijn eigen school (KDG Hoboken, departement IWT) door te brengen. Dit, omdat ik zelf enkele ideeën had over wat ik ongeveer wou doen als eindwerk. Samen met Koen Soontjens ben ik dan tot een zinvolle en universeel inzetbare invulling gekomen van mijn idee. Deze invulling is een combinatie van mijn eigen idee, namelijk een op afstand controleerbaar meetstation en een PWO-project (Projectmatig Wetenschappelijk Onderzoek) dat al enkele jaren lopende is: ‘Virtiem’. ‘Virtiem’ staat voor Virtual Instrumentation for Embedded Systems en handelt over communicatie via het PRC-principe (Remote Procedure Call) en over de universeel inzetbaarheid dankzij de XDR-encoding (External Data Representation standaard). Deze twee samen hebben dan geleid tot een eindwerk dat de titel ‘Draadloos embedded meetsysteem via Bluetooth’ heeft meegekregen en bijgevolg handelt over een meetstation bij een aquarium in combinatie met draadloze communicatie via bluetooth met een PDA. Deze scriptie is in logische volgorde opgebouwd van meting tot uitlezing. Doorheen de bundel worden alle stappen overlopen: over hoe de waarden worden ingelezen, hoe de data-uitwisseling en -presentatie verloopt en hoe deze wordt weergegeven op de PDA. Ik zou graag alle personen willen bedanken die mij geholpen hebben tijdens de stageperiode en tijdens de voltooiing van dit eindwerk. Een bijzonder woord van dank gaat uit naar mijn promotor Koen Soontjens, de lectoren van de afdelingen elektronica en chemie en de taalkundigen die mijn eindwerk nagelezen hebben. Dankzij hun kennis, begrip en geduld, voor mijn soms vele vragen, is het mogelijk geweest dit eindwerk tot een goed einde te brengen.
Kristof Booghmans
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
II
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Omschrijving van de eindwerkopdracht Naam student:
Kristof Booghmans
Afstudeerrichting:
Professionele bachelor in de elektronica optie Multimedia- en computertechnologie
Promotor:
Koen Soontjens
Bedrijf:
Karel de Grote Hogeschool Departement Industriële Wetenschappen en Technologie Salesianenlaan 30 B-2660 Hoboken
Titel:
Draadloos embedded meetsysteem via bluetooth
Omschrijving: Ontwerp van een embedded meetsysteem, met microcontroller, dat draadloos ingesteld en uitgelezen kan worden met behulp van een PDA. Hierbij moet gebruik gemaakt worden van Bluetooth als communicatielaag. De communicatie geschiedt door middel van remote procedure call. Deze RPC's moeten platform onafhankelijk geïmplementeerd worden met behulp van een universele datarepresentatie, XDR genaamd. Software en hardware voor beide systemen, PDA en embedded systeem met toebehoren, moeten ontwikkeld worden.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
III
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Abstract Draadloos embedded meetsysteem via Bluetooth is een voorbeeld van een praktische uitvoering van een opstelling waarbij er een draadloze communicatie plaatsvindt tussen een embedded systeem, hier een microcontroller, en een controlesysteem op afstand, hier een PDA (Personal Digital Assistent). De communicatie verloopt volgens het RPC principe en is universeel interpreteerbaar door middel van het gebruik van XDR encoding. Er is in dit eindwerk een praktische toepassing uitgewerkt: dit van meting tot weergave. Er is begonnen met de drie verschillende metingen uit te werken welke nodig waren. Verder is er een manier gezocht om deze metingen om te zetten naar digitale informatie die de microcontroller kan verwerken en opslaan. Deze informatie wordt gebruikt voor twee zaken. Ten eerste: sturing van een relais in functie van vooraf opgegeven minimum- en maximumwaarden en ten tweede: kan de gebruiker de meetwaarden van de afgelopen vierentwintig uur opvragen door middel van een draadloze communicatie.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
IV
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Inhoudstafel Voorwoord en bedanking ………………………………………………………..... Omschrijving van de eindwerkopdracht………………………………………….. Abstract ……………………………………………………………………………… Inhoudstafel …………………………………………………………………………. Figurenlijst …………………………………………………………………………… Lijst van afkortingen ………………………………………………………………...
II III IV V VIII IX
1. Inleiding ………………………………………………………………………….. 1 1.1. 1.2.
Voorstelling van het geheel …………………………………………… 1 Toekomst en doel ……………………………………………………… 2
2. Metingen …………………………………………………………………………. 3 2.1.
Temperatuurmeting ……………………………………………………. 2.1.1. Opzet van de meting ……………………………………………. 2.1.2. Bespreking van het schema …………………………………… 2.2. pH-meting ………………………………………………………………. 2.2.1. Opzet van de meting …………………………………………… 2.2.2. Bespreking van het schema …………………………………… 2.3. Niveaumeting …………………………………………………………… 2.3.1. Opzet van de meting ……………………………………………. 2.3.2. Bespreking van het schema ……………………………………
3 3 3 4 4 5 6 6 7
3. Analoog–digitaal omzetting …………………………………………………….. 9 3.1.
MAX1271 analoog digitaal convertor ………………………………… 9 3.1.1. Aansluiting van de ADC ………………………………………… 9 3.1.2. Omzetting van de meetwaarden ………………………………. 9 3.1.3. Communicatie met de ADC ……………………………………. 10
4. Microcontroller unit ……………………………………………………………… 12 4.1. 4.2. 4.3.
Eigenschappen van de microcontroller ……………………………….. 12 Extra externe SRAM ……………………………………………………. 12 Seriële datasignalen ……………………………………………………. 14
5. Relaisunit …………………………………………………………………………. 16 5.1. 5.2.
Shiftregister ……………………………………………………………… 16 Relaisaansluiting ………………………………………………………... 16
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
V
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
6. Microcontroller programma in C ……………………………………………….. 17 6.1. 6.2.
Schematische opbouw van het programma ………………………….. 17 Algemene instellingen ………………………………………………….. 18 6.2.1. Include-files ……………………………………………………… 18 6.2.2. Define van de naamuitgangen …………………………………. 18 6.2.3. Globale variabelen ………………………………………………. 18 6.3. Interrupts …………………………………………………………………. 18 6.3.1. Interrupt klok ……………………………………………………... 19 6.3.2. Interrupt seriële poorten ………………………………………… 19 6.4. Extra subs ……………………………………………………………….. 19 6.5. Main programma ………………………………………………………… 19 6.5.1. Instellingen timers en interrupts ……………………………….. 19 6.5.2. Whilelus ………………………………………………………….. 19 6.5.2.1. Detectie op Bluetooth verbinding ……………………… 19 6.5.2.2. Detectie op einde dataoverdracht ……………………... 19 6.5.2.3. Meten aquariums ………………………………………... 21 6.5.2.4. Bewaren van de gemeten waarden …………………… 22 6.5.2.5. Het sturen van het relais en het shiftregister ………… 22 7. Draadloze communicatie ……………………………………………………….. 23 7.1.
Bluetooth …………………………………………………………………. 23 7.1.1. Wat is Bluetooth? ……………………………………………….. 23 7.1.2. Werking en toepassingen ………………………………………. 23 7.1.3. Voor- en nadelen t.o.v. andere systemen ……………………. 25 7.1.4. Bluetooth IC ……………………………………………………… 25 7.1.5. SimplyBlue commander ………………………………………… 28 7.2. XDR (external data representation standard) ………………………… 31 7.2.1. Standaard ………………………………………………………… 31 7.2.2. Voor- en nadelen ………………………………………………… 33 7.3. RPC (remote procedure call) ………………………………………….. 33 8. PDA en programma in C#.NET ………………………………………………... 36 8.1. 8.2. 8.3. 8.4.
Schematische opbouw van het programma …………………………. 36 Gebruik van functies in virtiem.cs …………………………………….. 38 Timer …………………………………………………………………….. 39 Hoofdprogramma ……………………………………………………….. 39 8.4.1. Connection ………………………………………………………. 39 8.4.2. Aanvragen van data …………………………………………….. 39 8.4.3. Ontvangen van data …………………………………………….. 39 8.4.4. Versturen van data ……………………………………………… 40
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
VI
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
9. Besluit ……………………………………………………………………………. 41 9.1. 9.2. 9.3. 9.4.
Inzetbaarheid van het project ………………………………………..... Behaald eindresultaat ………………………………………………….. Verbeteringen naar de toekomst ……………………………………... Gebruik van dergelijke systemen ……………………………………..
41 41 41 42
10. Bibliografie ……………………………………………………………………….. 43 10.1. 10.2. 10.3. 10.4.
Eindwerken …………………………………………………………….... 43 Boeken …………………………………………………………………… 43 Sites ………………………………………………………………………. 43 Datasheets ………………………………………………………………. 44
11. Bijlagen …………………………………………………………………………… 45 11.1. Stage agenda …………………………………………………………… 45 11.2. Code ……………………………………………………………………… 52 11.2.1. Microcontroller in C …………………………………………... 52 11.2.2. .NET Framework in C# ………………………………………. 73 11.3. Schema, PCB en componentenlijst …………………………………. 102 11.3.1. Bluetooth IC ………………………………………………….. 102 11.3.2. Microcontrollerunit …………………………………………… 103 11.3.3. Meetunit ………………………………………………………. 107 11.3.4. Relaisunit …………………………………………………….. 111 11.4. Datasheets ( enkel op CD-ROM ) …………………………………… 114 11.4.1. SN74LS125 ………………………………………………….. 114 11.4.2. NE555 ………………………………………………………… 114 11.4.3. CA3140 ………………………………………………………. 114 11.4.4. TL081P ……………………………………………………….. 114 11.4.5. 74HC86 ………………………………………………………. 114 11.4.6. SN74HC595 …………………………………………………. 114 11.4.7. MAX1271 …………………………………………………….. 114 11.4.8. DS89C450 …………………………………………………… 114 11.4.9. MAX882 – MAX883 ………………………………………… 114 11.4.10. MAX3235 – MAX3233 ……………………………………… 114 11.4.11. BC550 ………………………………………………………… 114 11.4.12. BC337 ………………………………………………………… 114
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
VII
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Figurenlijst Fig 1.1a:
algemene opbouw ………………………………………………..…
2
Fig 2.1.2a: Fig 2.2.1a: Fig 2.2.1b: Fig 2.2.2a: Fig 2.3.1a: Fig 2.3.2a: Fig 2.3.2b:
aansluiting LM35 ……………………………………………………. opbouw van de pH elektrode ………………………………………. uitgangsspanning van de meetelektrode i.f.v. de pH ……………. elektrisch principeschema pH-meting …………………………….. print niveausensor …………………………………………………… algemeen principeschema: wisselende spanning ……………….. algemeen principeschema: niveaumeting …………………………
3 4 5 6 6 7 8
Fig 3.1.1a: Fig 3.1.2a: Fig 3.1.3a: Fig 3.1.3b:
power-supply grounding connections …………………………….. transfer function …………………………………………………….. control byte format …………………..……………………………… dataoverdracht bij external clock mode …………………………..
9 10 10 11
Fig 4.2a: Fig 4.2b: Fig 4.2c: Fig 4.3a: Fig 4.3b:
memorymap DS89C450 …………………..……………………….. memory timing nonpage mode data memory ……………………. aansluitschema van datamemory (nonpage mode) …………….. aansluiting MAX323xE …………………..…………………………. aansluiting voor programmeren van microcontroller……………..
13 14 14 15 15
Fig 5.2a:
algemeen elektrisch schema relais aansluiting …………………. 16
Fig 7.1.1a: Fig 7.1.4a: Fig 7.1.4b: Fig 7.1.4c: Fig 7.1.4d: Fig 7.1.4e: Fig 7.1.5a: Fig 7.1.5b: Fig 7.1.5c: Fig 7.1.5d: Fig 7.2.1a: Fig 7.2.1b: Fig 7.2.1c: Fig 7.3a: Fig 7.3b: Fig 7.3c:
Bluetooth logo …………………..…………………..………………. 23 UART speed selection …………………..…………………………. 26 LMX8920 in BGA uitvoering …………………..…………………… 26 foto printplaat van de LMX9820 …………………………………… 27 foto van flowoven ………………..…………………………………. 27 soldeercurve …………………..…………………..………………… 28 package framing …………………..……………………………….. 29 set fixed pin request …………………..……………………………. 30 write local name request …………………..………………………. 30 change UART speed request …………………..………………….. 31 XDR integer …………………..…………………..……………..….. 32 XDR unsigned integer …………………..………………………..… 32 XDR floating point …………………..………………………………. 33 principe Remote Procedure Call . ………………………………… 34 overdracht functienummer en parameters ………………………. 34 opbouw einde data …………………..……………………………… 35
Fig 8a:
PDA …………………..…………………..………………………….. 36
Fig 11.3.1a: Fig 11.3.1b: Fig 11.3.2a: Fig 11.3.2b: Fig 11.3.2c: Fig 11.3.3a:
copper top Bluetooth PCB …………………..………………..….. 102 copper bottom Bluetooth PCB …………………..…………..…… 102 silkscreen top microcontrollerunit PCB ……………………..……103 copper top microcontrollerunit PCB …………………………..…. 104 copper bottom microcontrollerunit PCB ……………………..….. 105 silkscreen top meetunit PCB ……………………………………... 107
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
VIII
Kristof Booghmans
Fig 11.3.3b: Fig 11.3.3b: Fig 11.3.4a: Fig 11.3.4b: Fig 11.3.4b:
Draadloos embedded meetsysteem via Bluetooth
copper top meetunit PCB ………………………………………….108 copper bottom meetunit PCB …………………………………….. 109 silkscreen top relaisunit PCB …………………………………….. 111 copper top relaisunit PCB ……………………………………..…. 112 copper bottom relaisunit PCB ………………………………..….. 112
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
IX
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Lijst van afkortingen A (mA) ADC BCC BGA CS Din DIP Dout ETX EXOR GHz GND GPS GSM HCl IC IWT K KDG LCD LSB MCT MSB PAN PCB PDA PIN PWO RD REQ RPC SCLK SRAM SSTRB STX SYCLK TCP/IP UART V (mV) VAC VDC VIRTIEM Vref W (mW) WR XDR
ampère analoog-digitale convertor block check character ball grid array chip select data in dual inline package data out end of text exclusieve OR gigahertz ground global position system global system for mobile communications waterstof chloride integrated circuit industriële wetenschap en technologie Kelvin Karel de Grote liquid crystal display least significant bit (byte) Multimedia en computer technologie most significante bit (byte) personal area network printed circuit board personal digital assistent personal identification number projectmatig wetenschappelijk onderzoek read request remote procedure call shift clock static random access memory serial strobe output start of text system clock transmission control protocol / internetprotocol universal asynchronous receiver/transmitter volt (millivolt) volt alternating current volt direct current virtual instrumentation for embedded systems referentiespanning watt (milliwatt) write external data representation standaard
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
X
Kristof Booghmans
1
Inleiding
1.1
Voorstelling van het geheel
Draadloos embedded meetsysteem via Bluetooth
Draadloos embedded meetsysteem via Bluetooth is een praktische uitwerking van het project ‘Virtiem’ dat staat voor Virtual Instumentation for Embedded System. Dit project handelt over programmeerbare interfaces die dienst kunnen doen om embedded systemen op afstand, al dan niet draadloos, te besturen. Dit besturen kan geïnterpreteerd worden als sturen van uitgangen op afstand, aanvraag van inlezen of bewaarde gemeten waarden op afstand, zelfs programma- of functieveranderingen en herprogrammeren. Voorbeelden van dit systeem zijn talrijk te vinden in de moderne technologische wereld. Een belangrijk voorbeeld hiervan zijn bedrijven waar er meer en meer systemen van op afstand worden gecontroleerd en gestuurd. Maar ook in de moderne particuliere toepassingen vinden deze systemen hun intrede. Een mooi voorbeeld hiervan is het domoticasysteem waarbij er toch een persoonlijke invulling kan ontstaan bij het gebruik van standaard universele units. Deze universele invulling is vooral te danken aan de opbouw van het systeem. Er is veel aandacht besteed aan de algemeen universaliteit. Heel wat producten bevatten soortgelijke functies, denken we maar aan een outdoor draadloze thermometer met een indoor aflezing op een LCD of een thermometer in een serre dewelke via een netwerk wordt ingelezen op een computer of PDA. Al deze systemen zijn soortgelijk en toch zijn ze meestal niet onderling koppelbaar. Dit geeft ongetwijfeld nadelen naar de uitbreidbaarheid en koppelbaarheid van deze systemen. Deze nadelen probeert men weg te werken door een systeem te creëren waarbij de communicatie tussen de instrumentation en het embedded systeem verloopt via een vaste standaard. Deze standaard is de XDR standaard: External Data Representation standaard. Hierin wordt beschreven hoe de dataopbouw er moet uitzien als de data worden aangeboden voor communicatie. Verder wordt er gebruik gemaakt van een systeem dat RPC oftewel Remote Procedure Call genoemd wordt. Hierbij is het belangrijk op te merken dat dit systeem functies op afstand uitvoert. Dit wil zeggen dat bijvoorbeeld de dataverwerking gebeurt in het embedded systeem zelf en enkel de eindwaarden van deze verwerking teruggestuurd worden naar het instumentation-gedeelte. Het resultaat hiervan is een systeem dat universeel inzetbaar is en zeer flexibel werkt zodat het vervangen, koppelen of uitbreiden van het systeem mogelijk wordt zonder veel en ingewikkeld programmeerwerk. Bijvoorbeeld als men bij deze praktische toepassing de PDA op termijn wil vervangen door een PC kan dit zonder veel herprogrammeerwerk. Ook het veranderen van het communicatiemiddel van bijvoorbeeld Bluetooth naar infrarood of TCP/IP wordt zo mogelijk zonder veel herprogrammeerwerk.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
1
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
De algemene opbouw van het eindwerk ziet er als volgt uit:
Fig 1.1a: algemene opbouw Vooreerst gebeuren er een aantal continue metingen in drie verschillende aquariums. Deze omvatten in dit project temperatuur-, pH- en niveaumeting. De meetwaarden van deze analoge metingen worden omgezet door middel van een analoog–digitaal omzetter naar een 12 bits digitale waarde. Deze waarde wordt ingelezen door een microcontroller en er wordt nagegaan of deze waarde voldoet aan de minimum- en maximuminstellingen. Eventueel wordt er ook een relais geschakeld op basis van metingen welke, uit de opgegeven range vallen of op basis van in- en uitschakeltijden. Verder worden deze meetwaarden om het uur bewaard in het extern geheugen van de microcontroller. Verder is er een PDA aanwezig waarop een uitlezing van de meetwaarden kan gebeuren en waarop de minimum- en maximumwaarden kunnen worden ingegeven en uitgelezen, alsook de in- en uitschakeltijden voor de verlichting. De dataoverdracht tussen deze twee systemen verloopt draadloos door middel van Bluetooth. Bluetooth is een systeem dat vooral wordt toegepast bij dataoverdracht op korte afstanden (1 tot 100 meter) en vooral groot geworden is bij particuliere toepassingen om korte draden rond bijvoorbeeld een computer, te vermijden. 1.2
Toekomst en doel
Het doel van dit project is, bij het lezen van voorgaande paragraaf, waarschijnlijk al lang duidelijk geworden. Het is een project dat, nu het eenmaal zijn kinderschoenen ontgroeid is, zijn toepassing zal vinden in tal van systemen om zo de compatibiliteit en inzetbaarheid van embedded systemen in onze maatschappij ten goede te komen.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
2
Kristof Booghmans
2
Draadloos embedded meetsysteem via Bluetooth
Metingen
In dit werk worden drie verschillende metingen gebruikt om de staat en kwaliteit van het aquariumwater te controleren. Men kan zich natuurlijk drie industriële meters aanschaffen waarop een analoge uitgang van nul tot tien volt of van vier tot twintig milliampère beschikbaar is, maar hier is geprobeerd om deze metingen zelf te ontwerpen. Hoe deze meters en sensoren opgebouwd zijn en hoe deze werken zal in dit hoofdstuk apart besproken worden. 2.1
Temperatuurmeting 2.1.1
Opzet van de meting
Een temperatuurmeting is één van de meest gebruikte metingen ter wereld. In dit werk wordt deze meting gebruikt om een indicatie weer te geven van de temperatuur en om een relais uit te schakelen dat de stroom naar de verwarming kan onderbreken bij te hoge temperaturen. Hier is gebruik gemaakt van de LM35, een eenvoudig aan te sluiten low cost temperatuur sensor. De temperatuursensor, hier in TO-92 plastic package, wordt ingesmolten in een krimpkous zodanig dat de sensor in het water kan geplaatst worden. 2.1.2
Bespreking van het schema
De LM35 is eenvoudig aan te sluiten en heeft een lineaire output van 10mV/K wat uiteraard overeenkomt met 10mV/°C. Deze analoge output kan men rechtstreeks inlezen met de analoog-digitaal convertor.
Fig 2.1.2a: aansluiting LM351
1
Figuur datasheet LM35
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
3
Kristof Booghmans
2.2
Draadloos embedded meetsysteem via Bluetooth
pH-meting 2.2.1
Opzet van de meting
PH-meting staat voor de zuurtegraadmeting. De pH-schaal loopt van 0 tot 14 waarbij de waarden van 0 tot 6 staan voor zuren en de waarden van 8 tot 14 voor basen. PH 7 wordt als neutraal beschouwd. De pH of zuurtegraad kan op verschillende manieren gemeten worden, door indicatiestrookjes, door toevoeging van pH neutraliserende oplossingen of door meting met pH-elektroden. Deze laatste soort meting, de pH-elektroden, is hier toegepast. De pH-elektrodemeting is één van de eenvoudigste, meest betrouwbare en nauwkeurigste manier van pH-meting. De zilverchloride-elektrode is hardwarematig als volgt opgebouwd
Fig 2.2.1a: opbouw van de pH-elektrode2 1. 2. 3. 4. 5. 6. 7.
2
speciaal iongevoelig glas zilverchloride neerslag vuloplossing (bij pH-meting is dat 0,1 mol HCl) inwendige elektrode (een zilverchloride–elektrode) elektrodenwand (in een niet-geleidende stof) referentie-elektrode junctie
Figuur Wikipedia
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
4
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Een meting met een pH-elektrode gebeurt met een meet- en een referentieelektrode. De meetelektrode geeft een spanning afhankelijk van de pH-waarde. De referentie-elektrode geeft een vaste referentiespanning. De pH-meter meet het spanningsverschil tussen beide elektroden en rekent dit verschil om tot een pHwaarde. Deze uitgangsspanning ligt tussen de -414mV voor pH 0 en de +414mV voor pH 14. Dit komt overeen met een 59,1mV per pH bij 25°C.
Fig 2.2.1b: uitgangsspanning van de meetelektrode i.f.v. de pH3 Tenslotte nog even opmerken dat de pH-meting kan beïnvloed worden door de temperatuur. Bij temperaturen hoger dan 25°C neemt de spanningsverandering toe en bij temperaturen lager dan 25°C neemt de spanningsverandering af. Sommige pH-meters hebben een interne temperatuurcompensatie, bij andere meters dient er rekening mee gehouden te worden bij metingen in stoffen met temperatuurwisselingen. De meting moet regelmatig gekalibreerd worden. Dit kan men doen door de pHmeter in daarvoor voorziene kalibratievloeistoffen te dompelen en dan de meting te controleren. Deze vloeistoffen zijn te verkrijgen in pH 4, pH 7 en pH 10. 2.2.2
Bespreking van het schema
De spanning van de meetelektrode is niet rechtstreeks bruikbaar om door de analoog-digitaal convertor gelezen te worden. De elektrode heeft een hoge uitgangsimpedantie, enkele honderden mega-ohm, en dusdoende moet een hoog-ohmmig meetapparaat gebruikt worden om deze spanning te kunnen meten. In deze toepassing is er gebruik gemaakt van een hoog-ohmmige opamp als buffer en versterker. Deze opamp is geschakeld als niet-inverterende versterker en zal het signaal bufferen en versterken naar een grotere spanning. Deze versterking is instelbaar door middel van een potentiometer. Een tweede opamp is geschakeld als buffer en zorgt voor een aanpassing van de offset, eveneens instelbaar met een potentiometer. De meting, die tot hiertoe nog positief en negatief kon zijn, kan nu als enkel positief geregeld worden. Deze aanpassing is nodig voor de inlezing op bijvoorbeeld een analoog–digitaal convertor met enkel positieve spanningsingangen. 3
Figuur Hanna instruments
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
5
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 2.2.2a: elektrisch principeschema pH-meting 2.3
Niveaumeting
Niveaumetingen kan men op verschillende manieren voltrekken, al dan niet door een meting die de te meten stof raakt. Voorbeelden van niet-rakende metingen zijn metingen met een lichtstraal of radar. Rakende metingen zijn metingen met een borrelpijp, een drijvende indicator of gebruik makend van de geleidbaarheid van de te meten stof zoals hier toegepast wordt. 2.3.1
Opzet van de meting
In dit werk is er een niveausensor toegepast waarbij de geleidbaarheid van de te meten vloeistof wordt gebruikt om het niveau te meten. In de vloeistof wordt een print aangebracht met daarop drie baantjes van verschillende lengten. Deze baantjes hebben een lengteverschil van 2 cm onderling en dusdoende kan men zo verschillende vloeistof niveaus onderscheiden.
Fig 2.3.1a: print niveausensor Belangrijk bij metingen als deze in vloeistoffen is de kans op aantasting van de elektrodenbaantjes door elektrolyse. Moest er een gelijkstoom door deze stof vloeien dan zouden in de kortste keren de elektrodenbaantjes aangetast worden. Om dit effect tegen te gaan wordt er gebruik gemaakt van een snel wisselde stroom. Hierbij wordt het effect van ontbinding en aantasting weggewerkt. Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
6
Kristof Booghmans
2.3.2
Draadloos embedded meetsysteem via Bluetooth
Bespreking van het schema
De wisselende spanning wordt opgewekt door een schakeling met een 555 timer IC. De frequentie kan berekend worden door de formule: f = 1,44 / (Ra + 2Rb) * C = 576 De duty cycle moet 50% bedragen en kan worden bijgesteld door de potentiometer. De duty cycle kan met volgende formule berekend worden: Duty Cycle = R1/R2 * 100 = 50% Deze wisselende spanning wordt enerzijds door de 74HC86, een 4 poorts EXOR-IC, omgevormd tot een inverse wisselende spanning en anderzijds wordt de wisselende spanning de vloeistof ingestuurd en bij het passende niveau weer opgevangen door een ander sensorbaantje. Op de aansluiting van de niveausensor zijn condensatoren voorzien om de laatste gelijkspanningscomponenten die aanwezig kunnen zijn, weg te filteren. Als er geleiding is dan heffen de wisselende spanning en inverse wisselende spanning elkaar op en komt de uitgang van de EXOR-poort hoog. Deze uitgangsspanning stuurt dan een transistor aan die een bepaalde weerstand in een serieweerstandsnetwerk overbrugt. De waarden van de weerstanden van dit serieweerstandsnetwerk zijn zo berekend dat de analoge spanningswaarde linear verandert in functie van het gemeten niveau. De spanningsuitgang van het weerstandsnetwerk wordt ingelezen door de analoogdigitaal omzetter.
Fig 2.3.2a: algemeen principeschema: wisselende spanning
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
7
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 2.3.2b: algemeen principeschema: niveaumeting In essentie kan de niveaumeting herleid worden tot een impedantiemeting van de te meten vloeistof. De impedantie van de vloeistof, of lucht indien er geen vloeistof gedetecteerd wordt, wordt in principe vergeleken met R25. Hiertoe worden twee blokgolven gegenereerd die elkaars inverse zijn (XOR_A). Beide blokgolven komen toe in het punt tussen R23 en R24. De ene blokgolf gaat echter door een vaste weerstand van 1 mega-ohm, de andere gaat, al dan niet, door de te meten vloeistof. Het hangt nu af van de impedantie tussen de meetbaantjes, de impedantie van vloeistof of lucht, welke fase op punt A overheerst. Met behulp van XOR_B wordt de overheersende fase gedetecteerd.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
8
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
3
Analoog–digitaal omzetting
3.1
MAX1271 Analoog-digitaal convertor
De gekozen analoog–digitaal omzetter is een 8 kanaals seriële 12 bit ADC, hier gebruikt in een 24 pins DIP behuizing. Deze ADC heeft acht multirange analoge ingangen. Dit wil zeggen dat men kan kiezen tussen welke range de ingang gelegen is. Bijvoorbeeld 0 tot Vref, 0 tot Vref/2, ± Vref/2 of ± Vref. Dit heeft alleen maar voordelen; zo kan men per kanaal de gewenste range selecteren. Een ander voordeel is de seriële communicatie. Dit wil zeggen dat men enkel een aansluiting voor de data input, data output en voor enkele stuursignalen nodig heeft om 8*12 bit waarden uit te lezen. Dit bespaart een hele hoop ingangen aan de microcontroller en aan bedrading. 3.1.1
Aansluiting van de ADC
Het hoeft geen betoog dat een ADC als deze, met zeer grote resolutie, moet beschikken over een voldoende afgevlakte en constante voedingsspanning, dit zowel voor de DAC als voor de metingen zelf. Hiervoor in het nodig dat men, bij het ontwerpen van de PCB, voldoende ontkoppelcondensators gebruikt en men de aansluitregels in de datasheet voldoende respecteert. Verder kan men ervoor zorgen dat deze omzetter wordt gevoed door een eigen spanningsstabilisator. De kleine MAX883 van Maxim is hiervoor een goede oplossing. Deze geeft een zeer stabiele spanning af van 5 VDC met een maximum stroom van 200 mA.
Fig 3.1.1a: power-supply grounding connections4 3.1.2
Omzetting van de meetwaarden
Zoals al aangehaald heeft men bij deze ADC de keuze tussen vier analoge input ranges waarvan twee bipolair. Het is belangrijk na te kijken hoe deze waarden in digitale vorm worden doorgegeven. Zo wordt, bij deze ADC in bipolaire toepassing, de binaire waarde in 2-complement-vorm uitgevoerd dit in tegenstelling tot bij de unipolaire instelling. 4
Figuur datasheet MAX1270 / MAX1271
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
9
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 3.1.2a: transfer function5 In deze toepassing is de bipolaire vorm niet gebruikt. Voor de temperatuurmeting is gekozen voor een ingangsrange tussen de 0 volt en Vref/2, voor de pH-meting tussen de 0 volt en Vref en voor de niveaumeting ook tussen de 0 volt en Vref. 3.1.3
Communicatie met de ADC
De communicatie tussen de microcontroller en de ADC verloopt serieel. Dit wil zeggen dat de data serieel over één hardwarematige ‘draad’ wordt uitgeklokt door middel van een kloksignaal op de SCLK aansluiting. Er kan gekozen worden voor een interne of een externe klok. Bij deze toepassing is er gekozen voor een externe klok die geleverd wordt door de microcontroller. Allereerst wordt een signaal van de microcontroller naar de ADC gestuurd. Deze data bevat: • 1 startbit • 3 kanaalselectie bits • 2 bits voor de range bepaling • 2 bits om de klokinstelling te bepalen
Fig 3.1.3a: control byte format6 Hierna volgt de informatieverwerking in de ADC terwijl de klok verder loopt, na 13 klokpulsen komt dan, via DOUT, de opgevraagde data naar buiten en kan deze ingelezen worden in de microcontroller voor verdere verwerking. 5 6
Figuur datasheet MAX 1270 / MAX1271 Figuur datasheet MAX 1270 / MAX1271
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
10
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Deze manier van werken zorgt ervoor dat men zo elk kanaal in elke range direct kan meten.
Fig 3.1.3b: dataoverdracht bij external clock mode7
7
Figuur datasheet MAX 1270 / MAX1271
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
11
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
4
Microcontroller Unit
4.1
Eigenschappen van de microcontroller
De gekozen microcontroller is de DS89C450 van Maxim. Dit is een veelzijdige microcontroller, een opvolger van de vroegere 8051 reeks. Deze microcontroller beschikt over: • • • • •
2 seriële poorten 32 bi-directionele I/O pinnen 3 16-bits timers 13 interrupt bronnen 1kB*8 SRAM intern
Deze microcontroller kan uitgebreid worden met extra SRAM geheugen. Door de twee seriële poorten is het mogelijk om seriële communicatie met Bluetooth, te combineren met een tweede seriële communicatie voor debugging en herprogrammeren met een computer. 4.2
Extra externe SRAM
De DS89C450 is voorzien van 64kB Flash geheugen wat voldoende is voor het stockeren van het programma. Voor de data zelf echter was, buiten de 1kB intern geheugen nog extra geheugen noodzakelijk. Er moet extra aandacht besteed worden aan de manier waarop men de hoeveelheid van het geheugen berekent. Niet enkel de geheugenplaatsen, voor de op te slagen data, moeten geteld worden maar ook de geheugenplaatsen nodig voor lokale variabelen gebruikt voor tussenresultaten moet in rekening gebracht worden. Ook moet men rekening houden met de geheugenplaats voor de stack bij sprongen in het programma of interrupts. De DS89C450 ondersteunt de opties van page en nonpage mode external data memory.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
12
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 4.2a: memorymap DS89C4508 Er kan in de standaard 8052 geheugenmodi maximaal 64kB extra SRAM data memory worden bijgeschakeld. In deze toepassing is 32kB extra externe SRAM bijgeschakeld. Dit was voldoende. Het extra geheugen is, zoals al aangehaald, SRAM geheugen. SRAM staat voor Statische RAM, dit soort RAM-geheugen bestaat uit een reeks flip-flops en wordt vooral gebruikt bij geheugenuitbreidingen van microcontrollers of bij cache-memory van computers. De sturing van het geheugen gebeurt in twee stappen. Dit omdat poort 0 zowel gebruikt wordt voor data als adresbus. Dit principe noemt men multiplexing. Eerst wordt op beide poorten het adres weergegeven. Daarna wordt poort 0 voor de dataoverdracht gebruikt. Door middel van een extra latch tussen poort 0 en de acht laagste adres-bits, adresingangen van het geheugen, blijft het volledige adres aangeboden aan de memory-IC.
8
Figuur datasheet DS89C450
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
13
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 4.2b: memory timing nonpage mode data memory9 Poort 0 dient dus zowel voor de acht databits als voor de acht laagste adresbits. Poort 2 wordt dan gebruikt voor de acht hoogste adresbits.
Fig 4.2c: aansluitschema van datamemory (nonpage mode)10 4.3
Seriële datasignalen
De microcontroller beschikt over twee seriële poorten: • •
Seriële poort 0 wordt gebruikt voor de communicatie met de computer bij debugging. Seriële poort 1 wordt gebruikt voor communicatie met het Bluetooth IC.
De opbouw van de seriële data mag dan wel steeds van dezelfde aard zijn, toch zijn er verschillen. De microcontroller werkt met spanningen tussen de 0 en de 5 volt. De signalen voor seriële communicatie moeten dus ook in deze range aangeboden worden. Voor het Bluetooth IC moeten deze spanningen liggen tussen 0 en 3,3 volt. 9
Figuur datasheet DS89C450 Figuur datasheet DS89C450
10
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
14
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
De computer echter geeft spanningen tussen de -15 volt en 15 volt uit. Het spreekt voor zich dat er, als deze onderdelen zonder problemen willen communiceren met elkaar, een spanningsniveauaanpassing noodzakelijk is. Hiervoor zijn er seriële communicatie spanningsniveauomvormers aanwezig, de MAX3235 en MAX3233. De MAX3235 doet een spanningsomzetting van de RS-232 spanning naar 0 tot 5 volt. De MAX3233 doet een spanningsomzetting van de RS-232 spanning naar 0 tot 3,3 volt.
Fig 4.3a: aansluiting MAX323xE Verder is er gebruik gemaakt van een 3-state buffer om de directe herprogrammering en de communicatie met de bootloader mogelijk te maken. Dit werd aangesloten zoals in de datasheet is aangegeven.
Fig 4.3b: aansluiting voor programmeren van microcontroller.11 11
Figuur datasheet DS89C450
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
15
Kristof Booghmans
5
Draadloos embedded meetsysteem via Bluetooth
Relaisunit
De relais zijn op een aparte PCB ondergebracht. Deze print wordt serieel aangestuurd. Een shiftregister op de relaisprint zorgt voor de omzetting van seriële naar parallelle context. 5.1
Shiftregister
In deze toepassing wordt er gebruik gemaakt van een acht bits shiftregister (SN54HC595). De microcontroller voorziet een kloksignaal dat nodig is om de data in te klokken. Verder is er ook nog een datasignaal nodig waarop de seriële data wordt aangeboden. Eens alle benodigde bits zijn aangeboden, wordt er een tweede signaal hoog gebracht dat ervoor zorgt dat de uitgangen aangepast worden aan de zonet ingeklokte data. 5.2
Relaisaansluitingen
De relais worden gestuurd door transistoren achter het shiftregister. Over het relaisspoel is het zeer belangrijk om een extra diode aan te brengen. Dit om de door de spoel opgewekte spanningen, bij het uitschakelen van het relais, kort te sluiten. Deze kunnen geen schade aanrichten aan de andere onderdelen. Verder is er nog een controle-led voorzien bij elk relais. Deze led’s geven een indicatie van de stand van het relais. Tenslotte zijn er aansluitingen en extra brede banen voorzien om 230 VAC te kunnen schakelen.
Fig 5.2a: algemeen elektrisch schema relais aansluiting
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
16
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
6
Microcontroller programma in C
6.1
Schematische opbouw van het programma
In onderstaand schema is de algemene structuur van het programma van de microcontroller weergegeven. De nummers voor de regels geven de lijnnummers weer in de programmacode. ALGEMEEN 4 12 28
include files define globale variabelen
INTERRUPTS 128 130 148 153 186 191
interruptvector klok interruptsub klok Æ 78 uuraanpassing interruptvector seriële poort 0 interruptsub seriële poort 0 interruptvector seriële poort 1 interruptsub seriële poort 1 Æ 178 seriële interrupt sub
EXTRA SUBS 163
debugg ( stuurt seriele poort 0)
MAIN 988 instellingen timer 0 voor klok 1001 instellingen timer 1 voor seriële poort 1 1010 instellingen timer 2 voor seriële poort 0 1019 interrupts toelaten 1026 opstartvoorwaarden 1082 while lus Æ 1091 detectie op verbinding met Bluetooth IC Æ 1106 detectie op einde dataoverdracht Æ 482 functiekeuze Æ 341 aanvraagData Æ 235 xdr_EncodeInt Æ 207 stuurserieel Æ 291 xdr_EncodeFloat Æ 207 stuurserieel Æ 414 dataAquarium Æ 246 xdr_DecodeInt Æ 261 xdr_DecodeFloat Æ 436 dataUur Æ 246 xdr_DecodeInt Æ 443 uurtest Æ 235 xdr_EncodeInt Æ 207 stuurserieel Æ 457 juistgemeten Æ 235 xdr_EncodeInt Æ 207 stuurserieel
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
17
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth Æ 291
xdr_EncodeFloat Æ 207 stuurserieel
Æ 1152 meten aquariums 1, 2 en 3 Æ 840 meten aquarium Æ 816 meten Æ 526 meetaanvraag Æ 518 delay Æ 733 meetOphalen Æ 518 delay Æ 1156 bewaar metingen Æ 1173 relais Æ 1174 shiftregister Æ 518 delay
6.2
Algemene instellingen 6.2.1
Include-files
Include-files zijn handige files waarin definities en macro’s terug te vinden zijn die in het programma kunnen gebruikt worden. Hier is gebruik gemaakt van ioDS89C450.h als include-file van de microcontroller zelf en van math.h voor de wiskundige functies bij de XDR omzettingen. 6.2.2
Define van de naamuitgangen
Om vlot en snel te kunnen werken wordt vaak gebruik gemaakt van logischverstaanbare namen in de code. Deze namen worden dan eerst gedefinieerd waarbij verwezen wordt naar een ingang, uitgang of dergelijke meer. Hier worden de gebruikte in- en uitgangen voor de ADC en het shiftregister gedefinieerd. 6.2.3
Globale variabelen
Globale variabelen zijn variabelen die in de globale context van het programma worden gedeclareerd. Op deze manier zijn ze in het hele programma beschikbaar en worden er, van begin af aan, geheugenplaatsen voor deze variabelen voorzien. De globale variabelen worden gebruikt voor het bufferen van ontvangen data, variabelen voor de tijdinstelling, variabelen voor minimum en maximum waarden, variabelen voor de gemeten waarden en status variabelen voor het relais. 6.3
Interrupts
Interrupt-subs zijn subs die niet aangeroepen worden in de gewone programmastructuur maar enkel als er een bepaalde gebeurtenis plaatsvindt. Deze gebeurtenis kan bijvoorbeeld het ontvangen van data op een seriële poort, een interrupt ingang die actief wordt of een timer, zijn. In dit programma zijn drie interrupts gebruikt, één voor de klok en twee voor de seriële communicatiepoorten.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
18
Kristof Booghmans
6.3.1
Draadloos embedded meetsysteem via Bluetooth
Interrupt klok
Timer 0 is berekend op honderd microseconden. Als er tien keer honderd microseconden worden geteld, komt er één milliseconde bij en zo wordt er verder gerekend tot de uren. Op deze manier wordt de tijd bijgehouden. 6.3.2
Interrupt seriële poorten
Bij het ontvangen van data op de seriële poort 0 of seriële poort 1 wordt er een interrupt ontvangen in het programma en wordt de data weggeschreven in een buffer. 6.4
Extra subs
Tot deze categorie behoren subs die niet gebruikt worden in het normale programma. Hier is er aan de code één extra sub toegevoegd. Deze extra sub, ‘debugg’ genaamd, dient om in het programma op bepaalde plaatsen informatieve data te kunnen sturen naar de PC om zo het C-programma te kunnen debuggen of op z’n werking te controleren. 6.5
Main programma
Het main programma is het hoofdprogramma, hierin staan de instellingen en wordt de programmalus doorlopen. 6.5.1
Instellingen timers en interrupts
In dit programma worden drie timers gebruikt. Eén timer om de tijd up-to-date te houden en twee timers voor de seriële communicatiepoorten. 6.5.2
Whilelus
Deze lus wordt constant doorlopen en voert de hoofdopdracht van het programma uit. Dit omvat een detectie op ontvangen data en een constante lus van meten, bewaren van data en sturen van de relais. 6.5.2.1
Detectie op Bluetooth verbinding
Wanneer het Bluetooth IC op spanning gebracht wordt, staat dit in automatic mode. In deze mode wordt er bij het verbinden configuratiedata uitgewisseld die niets te maken heeft met de eigenlijke datacommunicatie tussen de microcontroller en de PDA. Deze data wordt wel ontvangen in de databuffer en wordt gedetecteerd door deze functie. Na het ontvangen van de data, die gepaard gaat bij het verbinden, zal de buffer terug worden leeggemaakt. 6.5.2.2
Detectie op einde dataoverdracht
Ontvangen data wordt door de interrupt routine, die de dataontvangst detecteert, in een buffer geladen. Wanneer alle benodigde data overgedragen is, wordt er op het
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
19
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
einde een herkenbaar eindpatroon toegevoegd. Dit patroon wordt gedetecteerd door deze functie. Indien het eindpatroon ontvangen wordt, wordt de interrupt van deze seriële poort uitgeschakeld en wordt de data in de buffer verwerkt. Na de verwerking wordt deze interrupt weer aangezet. De data bestaat uit een functienummer en functieparamaters. Aan de hand van de functienummers weet het programma welke functie moet worden uitgevoerd met de ontvangen data. Een overzicht van de functies wordt hieronder weergegeven. • • •
Functie 1: Aanvraag om data van aquarium 1 terug te sturen. Functie 2: Aanvraag om data van aquarium 2 terug te sturen. Functie 3: Aanvraag om data van aquarium 3 terug te sturen.
De functie ‘aanvraagData’ wordt aangeroepen en het aquariumnummer wordt meegegeven. De, over de laatste vierentwintig uur gemeten data, wordt teruggestuurd samen met de minimum- en maximuminstellingen. Dit gebeurt van zowel de temperatuur, pH en het niveau. Ten slotte worden ook de aan- en uittijden van het licht teruggestuurd. Dit gebeurt door de, in het geheugen opgeslagen, waarden mee te geven bij het oproepen van de ‘xdr_EncodeInt’ of ‘xdr_EncodeFloat’ sub. Vanuit deze subs wordt dan ook de sub ‘stuurserieel’ aangeroepen waarmee de data wordt verzonden. • • •
Functie 4: Doorgeven van data voor aquarium 1. Functie 5: Doorgeven van data voor aquarium 2. Functie 6: Doorgeven van data voor aquarium 3.
De functie ‘dataAquarium’ wordt aangeroepen. De data, die met deze functie wordt meegestuurd, omvat de minimum- en maximumtemperaturen en de aan- en uitschakeltijden van het bepaalde aquarium en wordt door het oproepen van de functies ‘xdr_DecodeFloat’ en ‘xdr_DecodeInt’ gedecodeerd en in het geheugen weggeschreven. Op deze functie wordt geen data teruggezonden. •
Functie 7: Inklokken van het real-time-uur.
De functie ‘dataUur’ wordt aangeroepen. De data, die met deze functie wordt meegestuurd, omvat het huidige uur van de PDA opgedeeld in uren, minuten en seconden. Deze waarden worden gedecodeerd met behulp van de functie ‘xdr_DecodeInt’ en aan het geheugen toegevoegd. •
Functie 8: Aanvraag van het real-time-uur.
De functie ‘uurtest’ wordt aangeroepen. Met deze functie kan men het huidige realtime-uur van het embedded systeem opvragen ter controle. Ook hier wordt weer verwezen naar de ‘xdr_EncodeInt’ sub waarbij de data geëncodeerd en verstuurd worden.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
20
Kristof Booghmans
•
Draadloos embedded meetsysteem via Bluetooth
Functie 9: Aanvraag van de laatst gemeten waarden.
De functie ‘juistgemeten’ wordt aangeroepen. In deze functie worden de laatst gemeten waarden opgehaald uit het geheugen en meegegeven bij het oproepen van de functie ‘xdr_EncodeFloat’ Deze functie encodeert de waarden en zendt ze naar de PDA met behulp van de functie ‘stuurserieel’. Belangrijk te vermelden is nog dat bij functieaanroepen, waarbij data wordt teruggestuurd, er in de eerste plaats een functienummer wordt toegevoegd om de functieherkenning in het PDA te voltrekken. 6.5.2.3
Meten aquariums
Bij regelmaat wordt de functie ‘meten_aquarium’ aangeroepen en worden de nummers van de meetunits meegegeven. In deze functie worden de Chip-Selectlijnen van de drie analoog-digitaal omzetters geschakeld en wordt de sub ‘meten’ opgeroepen. In deze functie ‘meten’ wordt het meten van drie kanalen ( temperatuur, pH en niveau ) gestuurd. Vervolgens wordt de gemeten waarde omgerekend naar de juiste grootheid en tenslotte opgeslagen in het geheugen. Voor uitleg over het sturen van de analoog-digitaal omvormer wordt verwezen naar het hoofdstuk ‘Analoog-digitaal omzetting’. •
Het berekenen van de temperatuur gebeurt door volgende formule:
(gemeten waarde * ( 2.048 / 4095 ) * 100 )
De uitgang van de temperatuurmeting bedraagt 10 mV / °C. Met andere woorden: als er gemeten is hoeveel de spanning aan de ingang bedraagt, kan eenvoudigweg de temperatuur berekend worden. De meting gebeurt tussen de 0 volt en Vref/2 en Vref bedraagt 4,096 volt. •
Het berekenen van de pH-waarde gebeurt op de volgende manier:
(-1 * (( gemeten waarde - 250 ) / (( 2876 – 250 ) / 6 ) - 10 ))
De meetrange loopt van 0 volt tot Vref. Vref bedraagt 4,096 volt. De meetbare pH-range loopt van pH 4 tot pH 10. Uit metingen van referentievloeistoffen werden de volgende waarden bepaald: PH 4 komt overeen met 2,876 volt oftewel stap 2876. PH 10 komt overeen met 0,25 volt oftewel stap 250. De pH-range loopt dus van pH 4 tot pH 10 over 2876 – 250 stappen. De gemeten waarde, min de waarde van pH 10, gedeeld door waarde per pH, te beginnen bij pH 10, geeft dus een getal met de juiste eenheid. •
Van de niveaumeting wordt de gemeten waarde gewoon doorgegeven en achteraf in het programma op de PDA omgerekend naar een niveau.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
21
Kristof Booghmans
6.5.2.4
Draadloos embedded meetsysteem via Bluetooth
Bewaren van de gemeten waarden
Om het uur worden de huidige meetwaarden opgeslagen in het geheugen. Zo kunnen tot 24 uur nadien alle gemeten waarden worden opgevraagd door de functie 1, 2 of 3 aan te roepen vanuit een extern toestel, hier de PDA. 6.5.2.5
Het sturen van het relais en het shiftregister
Via de PDA kunnen de minimum- en maximumwaarden en de licht- en donkertijden voor elk aquarium apart worden ingesteld. In het programma wordt de functie ‘relais’ opgeroepen waarin de huidige meetwaarden worden vergeleken met deze minimum-, maximum- of uurinstellingen. Indien nodig zal een bit in het geheugen hoog gebracht worden die dan achteraf zal zorgen dat het relais geschakeld wordt. Dit schakelen van het relais gebeurt door data in een shiftregister te klokken. Dit gebeurt in de functie ‘shiftregister’. De data die naar het shiftregister gestuurd wordt is bepaald op basis van de eerder opgeslagen bits in de functie ‘relais’.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
22
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
7
Draadloze communicatie
7.1
Bluetooth 7.1.1
Wat is Bluetooth?
Wat is Bluetooth? Bluetooth is een draadloze communicatievorm die veel bij elektronische apparatuur wordt gebruikt om kabels te vermijden. Denken we maar aan GPS, GSM, computer, printer, … . Er zijn talloze voorbeelden. Bluetooth werd vooreerst in 1994 ‘uitgevonden’ door Ericson. Later werd deze nieuwe vorm van draadloze communicatie verder uitgewerkt door een gezelschap van bedrijven waaronder Ericson, Nokia, IBM, Toshiba en Intel met als resultaat dat Bluetooth V1.0 in 1999 beschikbaar was op de markt. In 2004 werd er een tweede versie van dit draadloos communicatie medium op de markt gebracht, Bluetooth V2.0. De naam ‘Bluetooth’ is afkomstig van de 10de eeuwse Deense koning Harald Blåtand (letterlijk vertaald in het Engels ‘Blue tooth’) die toen Denemarken en Noorwegen verenigde, net als de draadloze Bluetooth-technologie nu verschillende apparaten verenigt. Het Bluetooth logo is opgebouwd uit de initialen H en B van deze koning en geschreven in noordelijke runentekens.
Fig 7.1.1a: Bluetooth logo 7.1.2
Werking en Toepassingen
Iets technischer gezien kunnen we zeggen dat Bluetooth een voorbeeld is van een PAN oftewel Personal Area Network. Een netwerk van communicerende Bluetooth apparaten wordt een piconet genoemd. Er kunnen in dit piconet twee vormen van communicatie plaatsvinden namelijk point to point- en point to multipoint-communicatie. Met Point to point-communicatie bedoelt men een communicatie tussen één master en één slave. Bij point to multipoint-communicatie wordt er gebruik gemaakt van één master en meerdere slaves. Binnen een piconet zijn er steeds één master en maximum zeven verschillende slaves mogelijk. Meerdere piconets kunnen ook onderling met elkaar communiceren door middel van een gemeenschappelijk Bluetooth apparaat. Dergelijke netwerken noemt men dan scatternets. De Bluetooth communicatie is steeds bidirectioneel. Bluetooth maakt gebruik van de 2,45 GHz ISM (Industrial Scientific Medical) band. Deze band wordt sinds enkele jaren wereldwijd ondersteund voor dit soort communicatienetwerken en ligt, om exact te zijn, tussen de 2,402 GHz en de 2,480 GHz. Storingen door interferentie met andere apparaten in de 2.45GHz band worden vermeden door gebruikt te maken van een techniek waarbij 1600 keer per seconde van frequentie gewisseld wordt. Er zijn hiervoor zo’n 79 frequenties beschikbaar.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
23
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Verder wordt er gebruik gemaakt van drie vermogen klassen. • • •
Klasse 1: Er wordt gezonden met een vermogen van 100 mW en daarmee kan men een afstand bereiken tot 100 meter. Klasse 2: Er wordt gezonden met een vermogen van 2,5 mW en daarmee kan men een afstand tot 10 meter overbruggen Klasse 3: Er wordt gezonden met een vermogen van 1 mW en daarmee kan een afstand van maximaal 1 meter overbrugd worden.
De data overdrachtsnelheid van versie 1.0 is maximaal 723,1 kbits/s. Versie 2.0 deed het beter met overdrachtsnelheden tot 2,1 Mbits/s; dit noemt men EDR (Enchanced Data Rate). Nadeel hierbij was dat ook het stroomverbruik steeg. De koppelbaarheid van Bluetooth systemen is uiterst eenvoudig. Telkens als een Bluetooth systeem wordt aangezet begint deze automatisch signalen uit te zenden om zo andere apparaten in zijn buurt te detecteren. Ieder Bluetooth device heeft een eigen adres meegekregen dat bestaat uit 48 bits. Verder kan men ook elk apparaat een eigen naam toekennen om deze eenvoudig te kunnen herkennen. Tevens kan men opteren voor het automatisch koppelen van toestellen, dit is bijvoorbeeld handig om synchronisatie tussen een PDA en een computer thuis te verkrijgen bij het binnenkomen van de woning. Kort samengevat worden er 4 zaken uitgewisseld. • • • •
De device naam De device klasse Een lijst van services (ondersteuning van geluidsoverdracht, seriële poort, …) Algemene technische informatie
Wat betreft de veiligheid van Bluetooth zijn er verschillende security levels. • • •
Silent: Er kan geen verbinding worden opgebouwd. Private: Er kan enkel een verbinding gelegd worden met systemen die reeds geregistreerd zijn in het adresboek van de master. Public: Er kan verbinding gemaakt worden met alle Bluetooth systemen.
Verder bestaan er drie security modes bij Bluetooth verbindingen. • • •
Nonsecure: Hierbij wordt er geen gebruik gemaakt van een beveiliging. Service-level enforced security mode: Wanneer er gevraagd wordt om een verbinding te leggen tussen twee apparaten, wordt de veiligheidsconnectieprocedure doorlopen. Link-level enforced security mode: De veiligheidsprocedure wordt automatisch doorlopen als er een ander apparaat gevonden wordt.
Tenslotte nog een kort woordje over het gebruik van de encryptie van data. Net zoals bij verbindingen over internet wordt er hier gebruik gemaakt van data encrypties. Dit houdt in dat de PIN-code gebruikt wordt om verschillende paren sleutels te vormen van 128 bits. Deze sleutels worden gebruikt op de zender en
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
24
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
ontvanger om data te coderen (= versleutelen) en gecodeerd te verzenden. Andere ontvangers die de datastroom willen ‘afluisteren’ kunnen de data dan misschien wel ontvangen maar niet decoderen zonder deze vastgelegde sleutels. Zoals al eerder aangehaald is het energieverbruik bij Bluetooth belangrijk. Er wordt steeds nagegaan hoe men tot het laagste energieverbruik kan komen. Dit omdat Bluetooth vooral ontwikkeld werd voor draagbare en dus op batterij-werkende toestellen. Er zijn drie low-power modes: • • •
Sniff mode: De slave is geen actief lid van het net en luistert enkel. Hold mode: De device is geen actief lid van het netwerk maar zijn klok blijft gesynchroniseerd met de master. Zijn gebruikersadres wordt bijgehouden. Park mode: De device is geen actief lid van het netwerk, zijn klok blijft gesynchroniseerd met de master maar zijn gebruikersadres wordt niet onthouden. 7.1.3
Voor- en nadelen t.o.v. andere systemen
Uiteraard zijn er aan een systeem als Bluetooth voor- en nadelen verbonden, net zoals aan elk ander, al dan niet, draadloos systeem. Voordelen: • Beide gebruikers moeten elkaar niet ‘zien’. • De gebruikers mogen bewegen ten opzicht van elkaar. • Ondersteuning van multipoint connectie. • Beveiligde dataoverdracht. • Minimum stroomverbruik, speciaal voor draagbare toestellen. Nadelen: • Enkel gebruik bij korte afstanden. • Lage snelheid van dataoverdracht. 7.1.4
Bluetooth IC
Voor het Bluetooth IC is de LMX9820A van National Semiconductor gekozen. De reden voor deze keuze is dat dit kleine maar handige IC vele interessante eigenschappen bezit en de meest gebruikte services aan boord heeft. Deze services kunnen makkelijk gebruikt worden zonder dat er extra software nodig is.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
25
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Door middel van twee logische signalen op de ISEL aansluitingen kan de dataoverdrachtsnelheid tussen de microcontroller en de LMX9820 ingesteld worden volgens volgende tabel:
Fig 7.1.4a: UART speed selection12 Als NVS (Non-volatile storage) instelling is hier gekozen voor een snelheid van 57600 baud (ISEL 1 en 2 naar massa) Tevens is er ook een geheugen aanwezig in het IC. Hierin kan men een PIN-code vastleggen, de device een eigen naam geven en dergelijke meer. De LMX9820A, uitgevoerd in BGA, meet 10,1 mm op 14 mm. Op deze kleine oppervlakte zijn er 116 aansluitingen voorzien. Niet alle aansluitingen moeten verbonden worden. Toch is het niet gemakkelijk geweest om hiervoor een goede print met slechts twee layers te ontwerpen en de LMX8920A hier zonder problemen op te solderen.
Fig 7.1.4b: LMX8920 in BGA uitvoering13 De aansluitingen, welke verbonden moeten worden, zijn: • • • •
12 13
Clk+ : voor de klokingang 12MHz, ± 18ppm precies. RF_inout : voor de antenne, via een ontkoppelcondensator. ISEL1 en ISEL2 : voor selectie van de dataspeed (via jumper aan massa of voeding). UART: Uart_tx : datauitgang naar de MAX3233. Uart_rx : dataingang naar de MAX3233. Uart_rts# : handshake-lijn voor uitgaande dataoverdracht. Uart_cts# : handshake-lijn voor inkomende dataoverdracht, (aan ground).
Tabel datasheet LMX9820 Figuur datasheet LMX9820
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
26
Kristof Booghmans
• • • •
Draadloos embedded meetsysteem via Bluetooth
IOVcc en Vcc: Voedingsspanning van ± 3,3 volt, voldoende ontkoppeld met condensatoren. Env0 en Env1 : Werkings-mode-keuze (via jumper aan massa of voeding). Reset_b# en Reset_5100# : resets (via jumper aan massa of voeding). RF GND, Dig_gnd_1 en Dig_gnd_2 : massa
Verder is er op de print nog plaats voorzien voor de oscillator.
Fig 7.1.4c: foto printplaat van de LMX9820 Het solderen van dergelijke IC’s moet gebeuren in een flowoven. Omdat dit echter niet beschikbaar was, is er gebruikgemaakt van een iets minder professionele manier van solderen. Er werd een basic flowoven nagebouwd om zo het IC te kunnen solderen. Deze oven is gebouwd uit ronde conservenblikken met als verwarming een warme lucht soldeerbout en als controle een thermokoppel boven het IC op de print. Op deze manier werd geprobeerd om de soldeercurve zo goed mogelijk te volgen.
Fig 7.1.4d: foto van flowoven
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
27
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
De solderingscurve ziet er uit als volgt:
Fig 7.1.4e: soldeercurve14 De temperatuur moet geleidelijk stijgen tot een temperatuur van 130°C over een tijd van ongeveer 210 sec. Na een korte pauze stijgt de temperatuur verder tot 183°C in ongeveer 110 sec. Daarna stijgt de temperatuur tot een maximum van 220°C in 55 sec. De temperatuur van 220°C wordt dan 70 seconden aangehouden en tenslotte daalt de temperatuur terug. De voeding van het Bluetooth IC moet liggen tussen de 2,85 en de 3,6 volt, dit kan bekomen worden met een klein IC van Maxim dat een exacte 3,3 volt uitgeeft, namelijk de MAX882. De communicatie verloopt via de UART en gebeurt met een snelheid van 57600 baud. De spanningsaanpassing van deze datasignalen gebeurt door de MAX3233 en MAX3235. 7.1.5
SimplyBlueCommander
SimplyBlueCommander is een handig programma, speciaal voor deze LMX9820A. Door eenvoudigweg de UART van de IC aan een computer te koppelen waarop dit programma draait, kan men verweg alle instellingen raadplegen en instellen. Belangrijk is dat het IC in de juiste werkingsmode is ingesteld om een verbinding tot stand te kunnen brengen. De standaard ingestelde opstartmode (Automatic mode) analyseert alle inkomende data en gaat na of het gewoon door te sturen data betreft of het commando voor zichzelf bedoeld is.
14
Figuur datasheet LMX9820A
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
28
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Er bestaan nog verschillende andere werkingsmodes namelijk: • • • • •
Automatic mode Command mode Command Master mode Command Slave mode Transparent mode
Een overzicht van wat mogelijk is in welke mode bevindt zich in tabel 1-2 in de datasheet. De opbouw van de commando’s gebeurt steeds op dezelfde wijze.
Fig 7.1.5a: package framing 15 • •
•
• • • •
Start delimiter: Deze wordt steeds weergegeven om aan te geven dat er een nieuw datapacket start. Hier wordt het “STX” karakter gebruikt (STX = 0x02). Packet type identification: Hier wordt het doel van het datapacket duidelijk gemaakt. In dit project is de belangrijkste het Request (REQ) karakter ‘R’ (0x52). Lijst van alle codes is te vinden in de datasheet tabel 4-2. Opcode: Hierin wordt weergegeven voor welke opdracht de data bedoeld is. De opcodes welke hier gebruikt worden zijn de: o GAP_WRITE_LOCAL_NAME op 0x04 o GAP_SET_FIXED_PIN op 0x17 o CHANGE_NVS_UART_SPEED op 0x23 Lijst van alle opcodes is weer te vinden in de datasheet tabel 4-3. Datalenght: Aantal bytes in het ‘packet data’ deel Checksum: Dit is een BCC controlesom van alle bytes van het deel packet type en datalenght, de doorgestuurde byte is de low byte van de som. Packet data: data pakket zelf End delimiter: Deze dient om het packet af te sluiten. Hier wordt het “ETX” karakter gebruikt (ETX = 0x03).
Elke opdracht staat apart weergegeven in de datasheet. De aangepaste instellingen bij dit project zijn: •
PIN-code: Om te vermijden dat iedereen onze waarden zou kunnen uitlezen of aanpassen heeft elke device zijn eigen PIN-code. De gekozen PIN is ‘3333’ (standaard was deze 0000)
15
Figuur datasheet LMX9820
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
29
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Bijgevolg moet dan het volgende naar het Bluetooth IC gezonden worden: 02 S T X
52 R E Q
17 05 00 6E 04 33 33 33 33 03 O E P 3 3 3 3 T C X
Fig 7.1.5b: set fixed pin request16 •
Device name: Een goede herkenbare naam is steeds een must. Dit is handig om apparaten uit elkaar te houden of te weten welk apparaat voor wat staat. De gekozen naam hier is ‘Bluetooth Aquarium’ Bijgevolg moet dan het volgende naar de Bluetooth IC gezonden worden:
02 S T X
52 R E Q
04 14 00 6A 13 42 6C 75 65 74 6F 6F 74 68 20 61 71 75 61 72 69 75 6D 00 03 O E P B l u e t o o t h a q u a r i u m T C X
Fig 7.1.5c: write local name request17
16 17
Tabel datasheet LMX9820 Tabel datasheet LMX9820
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
30
Kristof Booghmans
•
Draadloos embedded meetsysteem via Bluetooth
UART speed: De snelheid van de dataoverdracht is aangepast aan deze van de microcontroller. Deze snelheid bedraagt 57600 baud. Bijgevolg moet dan het volgende naar het Bluetooth IC gezonden worden:
02 S T X
52 R E Q
23 01 00 76 06 O 0 P x C 06
03 E T X
Fig 7.1.5d: change UART speed request18 Verdere commando’s en instellingen zijn terug te vinden in de datasheet. 7.2
XDR (external data representation standard)
XDR staat voor external data representation standard. Dit is een standaard voor dataoverdracht die toelaat, zonder al te veel dataoverlast, gegevens te verzenden tussen verschillende systemen die gebruik maken van een andere dataopbouw. 7.2.1
Standaard
De standaard omvat zowat alle datatypes die gebruikt kunnen worden en bepaalt de opbouw en de lengte van de datablokken.
18
Tabel datasheet LMX9820
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
31
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
In dit project zijn de types integer en floating point gebruikt, deze worden hieronder besproken. •
Algemene voorwaarden van XDR
De datablokken moeten een lengte hebben dat een veelvoud is van 4 bytes. De minimumgrootte van een pakket is dus 32 bits. Ook indien de data maar 1 byte groot is, moet dus de rest van de datablok, de overige 3 bytes, overgestuurd worden. Deze extra bytes worden dan gevuld met nullen. Verder is er afgesproken dat er gebruik wordt gemaakt van de little endian notatie. Bij deze notatie wordt de most significante byte (MSB) eerst genoteerd. •
Integer
De XDR (signed) integer is een 32 bits blok met een range van -2 147 483 648 tot 2 147 483 647. De integer wordt voorgesteld in 2-complement voorstelling. De MSB komt links te staan.
Fig 7.2.1a: XDR integer •
Unsigned Integer
De XDR unsigned integer wordt voorgesteld door een 32 bits blok. De range ligt tussen de 0 en de 4 294 967 295. De MSB komt links te staan.
Fig 7.2.1b: XDR unsigned integer •
Floating point
De XDR Floating point, of ook wel drijvende kommanotatie genoemd, wordt eveneens voorgesteld in een 4 bytes blok. Deze blok bevat drie verschillende elementen die samen een kommagetal voorstellen. De eerste bit wordt tekenbit genoemd en bepaalt of het getal positief of negatief is. Het tweede element, de exponent, wordt met 127 (de bias) verminderd en bepaalt de exponent van grondtal 2. Het derde element is de mantisse en bepaalt de eigenlijke cijfers van het floating point-getal.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
32
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Dit alles gebeurt volgens de volgende formule: (-1)S * 2(E-127) * F waarbij S de tekenbit voorstelt, E de exponent en F de mantisse.
Fig 7.2.1c: XDR floating point 7.2.2
Voordelen en nadelen
Voordeel van deze techniek is dat verschillende systemen, die verschillende opbouw van data gebruiken, toch zonder problemen kunnen samenwerken en data uitwisselen. Dit komt doordat alle gebruikers de data omvormen tot éénzelfde vastgelegde opbouw. Op deze manier wordt er dus komaf gemaakt met problemen tussen systemen die bijvoorbeeld little endian- en big endian-notatie gebruiken. Het nadeel, dat deze techniek met zich meebrengt, is dat er bij de vaste dataopbouw van 4 bytes, regelmatig bytes worden overgestuurd zonder echte functie. Dat zorgt voor een vertraagde dataoverdracht. In deze toepassing is dat echter verwaarloosbaar kort. Bij grote datablokken over trage overdrachtmedia kan dit echter wel problemen geven. 7.3
RPC (remote procedure call)
RPC staat voor remote procedure call wat zoveel wil zeggen als procedureoproep op afstand. Het principe is net hetzelfde als bij een gewone functieaanroep. Het enige verschil zit hem erin dat deze opgeroepen functie niet lokaal (op apparaat A) wordt uitgevoerd maar op de andere device (apparaat B). Die tweede device (B) stuurt dan zijn returnwaarden terug naar het eerste device (A), eveneens met een functieaanroep. De uitvoering van de opgeroepen functie gebeurt dus niet op dezelfde hardware als de functieaanroep.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
33
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Een voorbeeld:
Fig 7.3a: principe Remote Procedure Call Er wordt op apparaat A (hier de PDA) een functie aangeroepen, bijvoorbeeld ‘haal de waarden op van meting 1’. Deze actie roept dan een functie aan op apparaat B (hier de microcontroller). Deze functie voert de nodige acties uit, bijvoorbeeld een waarde meten of opvragen uit het geheugen en roept dan een functie aan op apparaat A om de resultaten terug te sturen. Apparaat A ontvangt deze waarden en geeft deze bijvoorbeeld weer. Hoe weet apparaat B welke functie hij moet oproepen bij de ontvangen informatie? Hiervoor wordt aan elke overdracht een functienummer toegekend. Dit staat in de eerste 4 bytes van de overdracht in integer vorm. Door middel van dit nummer wordt de juiste functie opgeroepen op apparaat B en worden de parameters juist verwerkt. Bijvoorbeeld functie 1 kan zijn: ‘opvragen van parameters’; functie 2 is dan eventueel: ‘bijstellen van de juiste tijd’.
Fig 7.3b: overdracht functienummer en parameters De hoeveelheid data is niet vast bepaald en afhankelijk van functie tot functie. Het doorsturen van 10 instellingswaarden zal meer data en tijd vragen dan een cijfer door te zenden van de op te vragen databundel. Het is dan ook belangrijk te weten wanneer een dataoverdracht eindigt zodanig dat dan de verwerking van de data kan
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
34
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
beginnen of afgewerkt worden. In dit project wordt het einde van de dataoverdracht naar de microcontroller gedetecteerd door middel van elke dataoverdracht te beëindigen met een datablok van 4 bytes met een vaste herkenbare en nergens anders voorkomende combinatie. Hier ziet die er als volgt uit: 0 Byte 0
0 Byte 1
255 Byte 2
255 Byte 3
Fig 7.3c: opbouw einde data Er valt ook op te merken dat het niet noodzakelijk is dat de functie een waarde teruglevert. Zo is het bijvoorbeeld mogelijk om een functie aan te roepen die enkel waarden moet opslaan of een uitgang moet schakelen op apparaat B. Belangrijk ook is op te merken dat het kan voorvallen dat door bepaalde omstandigheden de connectie tussen beide apparaten slecht of niet meer kan plaatsvinden; denken we maar aan storingen die aanleiding geven tot slechte dataoverdracht. Met andere woorden: er moet voor gezorgd worden dat beide devices ook kunnen verder werken als de opgevraagde data niet toegezonden worden. Dit kan gedaan worden door een time out detectie of dergelijke meer. Tot slot valt nog op te merken dat alle verzonden data beantwoordt aan de XDR standaard.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
35
Kristof Booghmans
8
Draadloos embedded meetsysteem via Bluetooth
PDA en programma in C#.NET
PDA oftewel Personal Digital Assistent is een klein draagbaar toestel, vergelijkbaar met een zakcomputer, dat dienst doet als elektronische agenda, telefoon, adresboek, filemanager en nog veel meer. Met Microsoft.NET kan men via het compact framework programma’s schrijven speciaal voor eigen toepassingen die ook draaien op zulke PDA’s. Microsoft.NET is een platform- en architectuuronafhankelijke omgeving waarin verschillende talen ondersteund worden. Naast de mogelijkheid om hierin programma’s te schijven voor computers ondersteunt .NET sinds enkele jaren ook de mogelijkheid om zelf programma’s te schrijven voor PDA’s. Dit kan gebeuren met behulp van het compact framework en op gelijkaardige manier als voor gewone computers; dit alles zonder veel te moeten inboeten aan functionaliteit.
Fig 8a: PDA 8.1
Schematische opbouw van het programma
Hieronder is de schematische opbouw van het programma weergegeven. De nummers voor de regels komen overeen met de regelnummers in de code. De recht gedrukte verwijzingen bevinden zich in het bestand frmMain.cs, de cursief gedrukte verwijzingen bevinden zich in virtiem.cs. FUNCTIES VOOR VIRTIEM 5 29 30 31
using virtiem SerialConnection conn XdrConvertor xdr Connection.Buffer buf
GLOBALE VARIABELEN 66 67 68
recbuf recbufTeller tijdVoorTimeOut
TIMER 603
timer
BUTTONS 644
btnConnect
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
36
Kristof Booghmans
663 670
Draadloos embedded meetsysteem via Bluetooth
Æ 545 conn.Connect btnDisconnect Æ 570 conn.Close btnQuit Æ 570 conn.Close
1096 aqua1 Æ 942
1123 aqua2 Æ 958
1150 aqua3 Æ 975
call_OpvragenEen Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 577 conn.Send call_OpvragenTwee Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 577 conn.Send
call_OpvragenDrie Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 577 conn.Send 1177 uurControll Æ 991 call_OpvragenVier Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 577 conn.Send 1202 momenteleaanvraag Æ 1007 call_OpvragenVijf Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 577 conn.Send 1227 aqua1Update Æ 1027 call_UpdateEen Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 922 WaardenUpdate Æ 261 buf.AddFloat Æ 41 xdr.EncodeFloat Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 577 conn.Send 1239 aqua2Update Æ 1039 call_UpdateTwee Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 922 WaardenUpdate Æ 261 buf.AddFloat Æ 41 xdr.EncodeFloat Æ 245 buf.AddInt32
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
37
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Æ 76 xdr.EncodeInt32 Æ 577 conn.Send 1251 aqua3Update Æ 1051 call_UpdateDrie Æ 234 buf.Clear Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 922 WaardenUpdate Æ 261 buf.AddFloat Æ 41 xdr.EncodeFloat Æ 245 buf.AddInt32 Æ 76 xdr.EncodeInt32 Æ 577 conn.Send 1263 uurUpdate Æ 1063 call_UpdateUur Æ 234 buf.Clear Æ 245 buf.AddInt32 ONTVANGEN DATA 819
8.2
receive (databuffer) Æ 57 xdr.DecodeInt32 Æ 698 return_een Æ 27 xdr.DecodeFloat Æ 62 xdr.DecodeInt32 Æ 762 return_twee Æ 62 xdr.DecodeInt32 Æ 769 return_drie Æ 27 xdr.DecodeFloat
Gebruik van functies in virtiem.cs
Het programma bestaat eigenlijk uit twee bestanden: het eigenlijke programma en het bestand virtiem.cs. Virtiem.cs bevat de code die nodig is om omzettingen te doen op basis van XDR conversie en verzorgt de connectie. In het bestand Virtiem.cs zijn er verschillende connectiemogelijkheden voorzien. Hier is de connectie via de seriële poort gebruikt. Bluetooth op een PDA krijgt de seriële poort nummer acht. Van in het specifieke hoofdprogramma, dat geschreven wordt door de gebruiker, kunnen dan vastgelegde aanroepen gebeuren in virtiem.cs dat eigenlijk dienst doet als bibliotheek. Het voordeel van deze manier van werken is dat men niet telkens code moet schrijven voor de XDR conversie en de communicatie. Het kan simpelweg gebeuren door de juiste delen aan te roepen in deze bibliotheek. Men kan deze dus telkens opnieuw gebruiken bij het schrijven van een programma. Dit zorgt ervoor dat men minder programmeerwerk heeft en men minder fouten kan maken. Bovenaan in het hoofdprogramma moet natuurlijk een verwijzing worden gemaakt naar het virtiem.sc bestand. Dit gebeurt op de regels 6 en 29 tot en met 31. Hier worden de nodige klasses aangeroepen in het virtiem.sc bestand zodat deze in het programma kunnen gebruikt worden.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
38
Kristof Booghmans
8.3
Draadloos embedded meetsysteem via Bluetooth
Timer
Er is een timer gebruikt voor het controleren van een eventuele timeout. Timeouts kunnen optreden als halverwege de communicatie wegvalt, als er één van beide toepassingen zou vastlopen en dergelijke meer. Aangezien de programmaopbouw met de remote procedure call geen rekening houdt met het feit dat er al dan niet data moet teruggestuurd worden, moet er toch enige vorm van controle optreden. De timer zal telkens gestart worden bij een data-aanvraag en gereset worden bij het detecteren van het einde van de overdracht. Indien het einde van de dataoverdracht niet wordt gedetecteerd binnen een bepaalde tijd zal een messagebox worden weergegeven met een foutmelding. 8.4
Hoofdprogramma 8.4.1
Connection
Door de knoppen ‘connect’ en ‘disconnect’ te gebruiken wordt er een sprong gemaakt naar de klasse ‘SerialConnection’ in virtiem.cs. Hierin staan de nodige instellingen en de specifieke code die nodig is om de verbinding op te bouwen. 8.4.2
Aanvragen van data
Als er op één van de knoppen gedrukt wordt die instaan voor de data aanvraag, worden er de nodige labels zichtbaar gemaakt om aan te geven dat de dataverwerking bezig is. De timer voor timeouts wordt hier gestart en er wordt gesprongen naar een sub ‘call_Opvragen…’ . In deze sub wordt de buffer leeggemaakt en wordt het benodigde functienummer en de bytes voor het detecteren van het einde van de overdracht toegevoegd aan de buffer. Dit is ook een verwijzing naar de externe bibliotheek virtiem. De data die aan de buffer wordt toegevoegd, wordt door de bufferfuncties zelf omgezet volgens de XDR standaard. Tenslotte wordt de buffer verzonden met de opgegeven verbinding. In dit programma zijn er vijf verschillende functies voorzien om data aan te vragen. De eerste drie omvatten de meetwaarden van de afgelopen vierentwintig uur van een bepaald aquarium, de vierde omvat een uurcontrole van het embedded systeem en de vijfde omvat een aanvraag van de laatst gemeten waarden van alle drie de meetunits. 8.4.3
Ontvangen van data
Indien data wordt ontvangen, wordt deze gebufferd in een daar voor voorziene buffer, binnen het hoofdprogramma. Indien het einde van de overdracht gedetecteerd wordt, zullen de eerste vier bytes van de ontvangen data geconverteerd door een XDR functie in virtiem om het functienummer te verkrijgen. In functie van het functienummer wordt dan gesprongen naar één van de ‘return_...’ subs. In deze subs wordt de data per vier bytes uit de buffer gelezen, geconverteerd en weergegeven in een textbox of statusbox. Tenslotte worden, na dit alles, de labels weer aangepast om weer te geven dat de data-aanvraag ten einde is. Ook de timer wordt gereset.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
39
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Naar gelang er vijf verschillende soorten van data-aanvraag kunnen gebeuren, is het, in het programma, maar mogelijk om drie verschillende soorten van waarden te ontvangen. Immers de data van de verschillende aquariums worden in dezelfde boxen weergegeven. De drie verschillende soorten ontvangen data zijn de data van een bepaald aquarium van de afgelopen vierentwintig uur, de huidige tijd ingesteld op het embedded systeem en tenslotte de data van de momentele waarden van de drie meetunits. 8.4.4
Versturen van data
Tenslotte zijn er ook nog knoppen die instaan voor het versturen van data. Indien men deze knoppen gebruikt worden de nodige labels aangepast om aan te geven dat er dataoverdracht bezig is en wordt er gesprongen naar een sub ‘call_update…’. In deze sub wordt de buffer, met te versturen data, gereset en wordt de functienummer toegevoegd aan de buffer. Indien het een update van minima-, maxima- en schakeltijden betreft, wordt verder gesprongen naar de sub ‘WaardenUpdate’ waarin deze waarden worden toegevoegd aan de buffer. Indien het een update betreft van het uur, wordt het real-time-uur opgevraagd en toegevoegd aan de buffer. De getallen toegevoegd aan de buffer worden automatisch geconverteerd volgens de XDR standaard. Tenslotte wordt de buffer met de data verzonden naar het embedded systeem en worden de nodige labels weer aangepast.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
40
Kristof Booghmans
9
Besluit
9.1
Inzetbaarheid van het project
Draadloos embedded meetsysteem via Bluetooth
Door gebruik te maken van External Data Representation en Remote Procedure Call bij de datacommunicatie en van klassen bij het programmeren in het .NET framework wordt de universele invulling van het geheel vergroot. De basis van dit hele project kan gebruikt worden in tal van toepassingen. Dit vergroot uiteraard het gemak om producten uit te breiden of om nieuwe producten te ontwikkelen. Ook het wijzigen van het communicatiemedium van Bluetooth naar bijvoorbeeld infrarood of TCP/IP kan eenvoudig gebeuren. Eenmaal alle noodzakelijk programmeerwerk gebeurd is bij ontwikkeling, kan dit achteraf zeer eenvoudig geselecteerd worden. Ook het veranderen van PDA naar bijvoorbeeld computer kan zeer eenvoudig gebeuren. 9.2
Behaald eindresultaat
Het eindresultaat van dit eindwerk voldoet in grote maten aan de vooropgestelde verwachtingen. De opdrachtomschrijving is nagekomen. Het geheel zoals hier beschreven en uitgewerkt is, kan meteen ingezet worden in de toepassing waarvoor het ontwikkeld is. Zowel de theoretische als de praktische uitwerking is hier gebeurd. Het geheel is afgewerkt op de nodige printplaten die onderling eenvoudig koppelbaar zijn door middel van vaste draadverbindingen. Op eenvoudige wijze kan men deze koppelen aan de meetunits met RJ-45 stekkers zodat de meetunits op andere plaatsen kunnen gebruikt worden. De Bluetooth IC socket kan eventueel worden vervangen door een socket met IC voor een ander communicatiemedium. De software voor de PDA is eenvoudig te gebruiken, het geheel wijst zichzelf uit en er zijn geen extra instellingen of driver-installaties noodzakelijk. Verder is er een mogelijkheid tot herprogrammatie van de microcontroller voorzien en de Bluetooth IC. Ook debugging is mogelijk gemaakt door de seriële aansluiting op de microcontroller-unit te gebruiken. Het systeem zoals hier beschreven is een systeem dat zeer weinig afregeling vraagt. Eenmaal geïnstalleerd werkt het geheel zelfstandig en kan het ten alle tijden gecontroleerd of heringesteld worden. 9.3
Verbeteringen naar de toekomst
Uiteraard zijn er altijd nog zaken die beter kunnen of voor uitbreiding vatbaar zijn. Als de voedingsspanning wegvalt dan wordt de microcontroller en het geheugen gereset. Dit wil zeggen dat alle meetwaarden en instellingen verdwijnen. Een backup-batterij zou hierbij een goede oplossing kunnen zijn. De printplaat met microcontroller is zo ontworpen dat er twee aansluitingen zijn voor de voeding: één
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
41
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
algemene en één specifiek voor backup-spanning enkel voor de microcontroller en het geheugen. De uitlezingen moeten nu steeds gebeuren via een PDA. Het zou ook handig kunnen zijn moest er een LCD display voor handen zijn waarop men de momentele meetwaarden kan uitlezen. Voor een eenvoudig en snelle uitlezing is een LCD display over het algemeen handiger dan een PDA. De dataoverdracht van de microcontroller naar de PDA verloopt veel trager t.o.v. de dataoverdracht van de PDA naar de microcontroller. Ook worden er al eens foute waarden ontvangen. Dit kan wel gecontroleerd worden in het programma en er kan een foutmelding of een heraanvraag van de data gebeuren maar het zou uiteraard beter zijn dat deze fouten zich niet voordeden. Andere communicatievormen dan Bluetooth zijn uiteraard ook mogelijk. Het zou handig zijn om de noodzakelijke code hiervoor al op voorhand mee te voorzien zodat bij omschakelen van het communicatiemedium dit direct kan gebeuren door een instelling in een keuzemenu te wijzigen. Het uur wordt ingesteld aan de hand van het uur op de PDA dat wordt doorgestuurd naar de microcontroller. Het zou handiger zijn moest het uur automatisch aangepast worden. Dit kan gebeuren door middel van een DCF77 module. Het ontwikkelen van een systeem dat aan automatische codegeneratie doet. Het doel is om de gebruiker, de programmeur, te ontlasten van steeds weerkomend programmeerwerk. Enkel specifieke functies moeten dan nog geprogrammeerd worden. 9.4
Gebruik van dergelijke systemen.
Ook in de industriële wereld worden er zeer veel meetsystemen gebruikt. Deze systemen zijn door de jaren heen geëvolueerd van opstellingen waar elke meting zijn eigen kabel had naar opstellingen over al dan niet een eigen netwerk tot nu zelfs meer en meer draadloze toepassingen. Er zijn twee grote soorten van draadloze systemen. Ten eerste: systemen waarvan de metingen draadloos zijn en ten tweede: systemen waar de meetunit draadloos is. Bij de eerste soort is het van groot belang dat er nooit een fout mag optreden. Immers als de meting fout is zal ook de regeling fout zijn. Systemen zoals het tweede worden vooral gebruikt als controle van regelsystemen.
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
42
Kristof Booghmans
10
Bibliografie
10.1
Eindwerken
• •
Joris Dupont, Virtiem, Hoboken, KdG-Hogeschool, 2005 Roger Amat Escalera, Anna Delgado Martin, Joan Fresno Haro, Claudia Garcia España, Bluetooth and IrDA communication technology as a control for a robot, Hoboken, KdG-Hogeschool, 2006
10.2 • •
• •
Boeken
Douglas Bell, Mike Parr, Visual Basic.NET voor studenten, Amsterdam,2003 Matthew Telles, C# Grand Cru, Easy computing NV, Brussel, 2002
10.3 • • • • • • • •
Draadloos embedded meetsysteem via Bluetooth
Sites
Bluetooth http://www.national.com/bluetooth http://electronics.howstuffworks.com/bluetooth.htm http://www.bluetooth.com http://www.bluetooth.org http://en.wikipedia.org/wiki/Bluetooth http://www.national.com/appinfo/wireless/bluetooth.html http://www.elektrozine.be/functions/reportages.asp?lang=nl&pag=16&Verslag=475 http://www.logitech.com/index.cfm?countryid=22&languageid=13&page=produ cts/features/cordlesstopics&CRID=463&parentCRID=272&contentID=7233 http://www.faqs.org/rfcs/rfc1832.html http://www.scholieren.com/werkstukken/2310
•
.NET http://www.15seconds.com/issue/020815.htm http://www.codeproject.com/cs/miscctrl/PocketPCColourBtn.asphttp:// http://blogs.msdn.com/davidklinems/archive/2006/03/09/548235.aspx http://www.devtips.net/Default.aspx http://samples.gotdotnet.com/quickstart/CompactFramework/doc/picturebutton .aspx http://www.cplusplus.com/reference/clibrary/cmath/pow.html http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/Co mpactFramework/samples/picturebutton/picturebutton.src http://www.scholieren.com/werkstukken/2310
• • • •
pH http://nl.wikipedia.org/wiki/Afbeelding:Glass_electrode_scheme.jpg http://www.sensorex.com/support/education/pH_education.html http://www.cypresssystems.com/Electrodes/pHElectrode.html http://www.eidusa.com/ph_Electrodes.htm
• • • • • • •
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
43
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
•
seriële poort http://www.vbib.be/index.php?name=PNphpBB2&file=viewtopic&t=1001&highli ght=seriele+poort http://www.devx.com/dotnet/Article/31001/1954?pf=true
• •
XDR http://en.wikipedia.org/wiki/External_Data_Representation http://www.faqs.org/rfcs/rfc1832.html
• •
andere http://www.iar.com/ http://www.picbasic.nl/
•
10.4
Datasheets
• • • • • • • • • • • • •
LMX9820A, Bluetooth, http://www.national.com SN74LS125, Quad 3-state buffers, http://www.motorola.com NE555, Timer, http://www.philips.com CA3140, OPAMP, http://www.intersil.com TL081P, OPAMP, http://www.alldatasheet.com/ 74HC86, Quadruple 2-input EXOR, http://www.alldatasheet.com/ SN74HC595, 8-bit shift register, http://www.alldatasheet.com/ MAX1271, ADC, http://www.maxim-ic.com DS89C450, Microcontroller, http://www.maxim-ic.com MAX882, 3,3 volt voeding, http://www.maxim-ic.com MAX883, 5 volt voiding, http://www.maxim-ic.com MAX3235, dual RS-232 Transceiver, http://www.maxim-ic.com MAX3233, dual RS-232 Transceiver, http://www.maxim-ic.com
• •
BC550, transistor, http://www.motorola.com BC337, transistor, http://www.motorola.com
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
44
Kristof Booghmans
11
Bijlagen
11.1
Stage agenda
Draadloos embedded meetsysteem via Bluetooth
week 1: 12/02 – 16/02 maandag 12/02/2007 • • • •
testen van de Bluetooth connectie solderen van de MAX3233 voor communicatie tussen bluetooth-IC en de PC testen van de communicatie bluetooth-IC - PC werking uitzoeken van SimplyBlueCommander o aanpassen van de pincode o aanpassen van de naam o aanpassen van de verbindingssnelheid
dinsdag 13/02/2007 • • • • • •
aanpassen van de datasnelheid van de UART van de bluetooth-IC testen communicatie microcontroller – bluetooth-IC solderen van de bluetooth-IC solderen van de oscillators solderen van de print (jumpers, condensators, …) testen van de bluetooth communicatie
woensdag 14/02/2007 • • • • • •
dataoverdracht methode bekijken (XDR) solderen van de bluetooth-IC op de print + proberen solderen van oscillators uitzoeken van VB.NET voor PDA communicatie pc met PDA installeren uitzoeken werking COM-poort aansturen in VB.NET
donderdag 15/02/2007 • • • •
uitzoeken werking COM-poorten aansturen in VB.NET communicatie tot uitvoeren van programma’s op de PDA onderzoeken grafische opmaak van het VB.NET programma programmeren in VB.NET van COM-poort
vrijdag 16/02/2007 • • •
grafische opmaak van het VB.NET programma programmeren in VB.NET van COM-poort Code van Virtiem project ontleden
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
45
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
week 2: 19/02 – 23/02 maandag 19/02/2007 •
omvormen van XDR conversie van C# naar C
dinsdag 20/02/2007 •
schrijven code in C voor microcontroller voor ontvangen en omzetten van data
woensdag 21/02/2007 • •
schrijven code in C voor microcontroller voor ontvangen en verzenden data schrijven code in C voor microcontroller voor dataopslag
donderdag 22/02/2007 • •
schrijven code in C voor microcontroller voor dataopslag in SRAM schets aansluiting van de microcontroller: relais, MAX1271, communicatie.
vrijdag 23/02/2007 • •
hardware aansluitingen van het geheel bekijken grote structuur van het eindwerkboek uitzetten
week 3: 26/02 – 02/03 maandag 26/02/2007 • •
eindwerkboek schrijven: Bluetooth deel C programma: functies
dinsdag 27/02/2007 • • •
PDA programma klassen bekijken elektrisch schema microcontroller print schetsen eindwerkboek schrijven: Bluetooth deel
woensdag 28/02/2007 •
PDA programma klassen bekijken
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
46
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
donderdag 01/03/2007 • •
Bekijken mogelijkheden om op de PDA tekenen van grafieken mogelijk te maken herwerken van aansluitschema
vrijdag 02/03/2007 • •
PDA programma voor sturen van waarden schrijven microcontroller aanpassen voor gebruik met 2 poorten
week 4: 05/03 – 09/03 maandag 05/03/2007 • • •
microcontroller aanpassen voor gebruik met 2 poorten oplossing zoeken om op de PDA ontvangen waarden in textboxen te laten weergeven debugging microcontroller programma
dinsdag 06/03/2007 • • •
oplossing zoeken om op de PDA ontvangen waarden in textboxen te laten weergeven debugging microcontroller programma tekenen testprint extra RAM voor microcontroller
woensdag 07/03/2007 • •
tekenen testprint extra RAM voor microcontroller + solderen microcontroller programma aanpassen aan gebruik van externe RAM
donderdag 08/03/2007 •
debuggen programma’s (dataoverdracht, …)
vrijdag 09/03/2007 •
debuggen programma’s (dataoverdracht, …)
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
47
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
week 5: 12/03 – 16/03 maandag 12/03/2007 • •
debuggen programma’s microcontroller programma aanpassen aan gebruik van externe RAM
dinsdag 13/02/2007 • •
debuggen programma’s metingen aansluiten en testen
woensdag 14/03/2007 • • •
jobdag metingen testen debuggen programma’s
donderdag 15/03/2007 •
shiftregister programmeren en testen
vrijdag 16/03/2007 • •
shiftregister programmeren en testen debuggen dataoverdracht microcontroller naar DPA
week 6: 19/03 – 23/03 maandag 19/03/2007 • •
debuggen dataoverdracht microcontroller naar DPA backupbatterij overwegen (opzoeken van mogelijkheden: IC’s + batt)
dinsdag 20/03/2007 • •
pH- en niveaumeting uitzoeken shiftregister proberen
woensdag 21/03/2007 •
pH- en niveaumeting
donderdag 22/03/2007 •
pH- en niveaumeting
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
48
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
vrijdag 23/03/2007 • •
pH- en niveaumeting pH- en niveaumeting in programma invoeren
week 7: 26/03 – 30/03 maandag 26/03/2007 • •
pH- en niveaumeting in C programma storingen bij temperatuurmeting debuggen
dinsdag 27/03/2007 • •
pH- en niveaumeting in C programma tekenen schema en print van meetunit
woensdag 28/03/2007 • •
tekenen schema en print van meetunit tekenen schema en print van relaisunit
donderdag 29/03/2007 • •
tekenen schema en print van relaisunit tekenen schema en print van microcontrollerunit
vrijdag 30/03/2007 • •
tekenen schema en print van microcontrollerunit print van niveausensor etsen
week 8: 02/04 – 06/04 maandag 02/04/2007 • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
49
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
dinsdag 03/04/2007 • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst
woensdag 04/04/2007 • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst
donderdag 05/04/2007 • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst
vrijdag 06/04/2007 • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst
week 9: 09/04 – 13/04 maandag 09/04/2007 • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst
dinsdag 10/04/2007 • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst
woensdag 11/04/2007 • • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst solderen van PCBs
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
50
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
donderdag 12/04/2007 • • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst solderen van PCBs
vrijdag 13/04/2007 • • • •
informatie opzoeken figuren en schema’s tekenen schrijven eindwerktekst solderen van PCBs
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
51
Kristof Booghmans
11.2
Draadloos embedded meetsysteem via Bluetooth
Code 11.2.1 Microcontroller in C
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
52
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
//***************************************************************************************************** //* include *// //*****************************************************************************************************
#include #include
//***************************************************************************************************** //* define *// //***************************************************************************************************** #define CS1 P1_bit.P10_T2 #define CS2 P1_bit.P11_T2EX #define CS3 P1_bit.P14_INT2 #define DataOUT P1_bit.P15_INT3 #define DataIN P1_bit.P16_INT4 #define clock P1_bit.P17_INT5 #define DataReg P3_bit.P32_INT0 #define ClokReg P3_bit.P33_INT1 #define UitPuls P3_bit.P34_T0
//***************************************************************************************************** //* globale variablen *// //*****************************************************************************************************
// --> in extern geheugenplaatsen!!! //
char ontvagenDataBuffer_Data [52] ; char ontvagenDataBuffer_index;
// buffers van 1 byte // 11*4byte +4 = 48 geheugenplaatsen min
// real time klok unsigned char hmicros; unsigned char millis; unsigned char hmillis; unsigned char seconden; unsigned char minuten; unsigned char uur; float float float float float float char char char char
tempMax [3]; // 1 = kan 1, 2 = kan 2, 3 = kan 3 tempMin [3]; phMax [3]; phMin [3]; nivMax [3]; nivMin [3];
uurAan [3]; // 1 = kan 1, 2 = kan 2, 3 = kan 3 uurUit [3]; minutenAan [3]; minutenUit [3];
float temp [24] [3]; // array 24 rijen (uren), 3 kolommen (kanalen) float ph [24] [3]; float niv [24] [3];
Page 1 of 20
// opgeslagen data over 24 uur
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
float temp_gemeten [3]; // de momenteel gemeten waarden float ph_gemeten [3]; float niv_gemeten [3]; int relaisTempAqua1; int relaisLichtAqua1; int relaisTempAqua2; int relaisLichtAqua2; int relaisTempAqua3; int relaisLichtAqua3;
//***************************************************************************************************** //* timer voor klok *// //*****************************************************************************************************
uuraanpassingIntSub () { hmicros++; if(hmicros == 10) { millis++; hmicros = 0; if(millis == 100) { hmillis++; millis=0; if(hmillis == 10) { seconden++; hmillis=0; if(seconden == 60) { minuten++; seconden = 0; if(minuten == 10) //if(minuten == 60) { uur++; minuten = 0; if(uur == 24) { uur = 0; } } } } } } }
Page 2 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
//******************//* timer interrupt service routine *//******************************************** #pragma vector = TF0_int // gebruik van interrupt vector voor timer 0
//******************//* timer interrupt vector *//***************************************************** __interrupt void timer0int (void) // timer0int is gekozen naam { // TF0 wordt automatisch gereset, timer wordt automatisch herladen uuraanpassingIntSub(); }
//***************************************************************************************************** //* serieel *// //***************************************************************************************************** //************************* seriele poort 0 voor debugging ******************************************** //***************************************************************************************************** //* serieel interrupt service routine *// #pragma vector = RI_0_int // gebruik van interrupt vector voor SERIEEL INIT
//***************************************************************************************************** __interrupt void debuggserieel (void) // gekozen naam { // nakijken of het ontvangen of van zenden was de interupt --> nodig ? SCON0_bit.RI_0 = 0 ; // flags terug op 0 zetten SCON0_bit.TI_0 = 0 ; // flags terug op 0 zetten } //******************************************************************************************** void debugg (char c) // char !!! { SBUF0 = c ; // versturen data unsigned long a; for (a=0;a<3000;a++) { } }
// korte wachttijd
//***************************************************************************************************** //************************* seriele poort 1 voor bluetooth ******************************************** //*****************************************************************************************************
serieelIntSub () { ontvagenDataBuffer_Data[ontvagenDataBuffer_index] = SBUF1; ontvagenDataBuffer_index = ontvagenDataBuffer_index + 1; } //***********//* serieel interrupt vector *//*************************************************** #pragma vector = RI_1_int // gebruik van interrupt vector voor SERIEEL INIT
Page 3 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
//***********//* serieel interrupt service routine *//******************************************* __interrupt void serieel (void) // serieel is gekozen naam { // nakijken of het ontvangen of van zenden was de interupt --> nodig ? //if (SCON1_bit.RI_1 == 1) //{
serieelIntSub (); // verwijzing naar extra sub omdat in de interrupt sub geen voltaire var's gebruikt SCON1_bit.RI_1 = 0 ; // flags terug op 0 zetten SCON1_bit.TI_1 = 0 ; // flags terug op 0 zetten }
//**********************//* seriele versturing van data *//******************************************** void stuurserieel(char c) //char = 1 byte // byte voor byte sturen dus { /* //TEST debugg('s'); char first,second; first=(c % 16); second=(c / 16); if (second>9) debugg(55+second); else debugg(48+second); if (first>9) debugg(55+first); else debugg(48+first); debugg('S'); // EINDE TEST */ SBUF1 = c ; unsigned long a; for (a=0;a<6000;a++) { }
// versturen data
// korte wachttijd
}
//***************************************************************************************************** //* XDR omzettingen *// //***************************************************************************************************** void xdr_EncodeInt (long waarde) // long is 4 bytes // byte voor { stuurserieel ((char) (waarde >> 24 )); //byte 1 stuurserieel ((char) (waarde >> 16 )); //byte 2 stuurserieel ((char) (waarde >> 8 )); //byte 3 stuurserieel ((char) (waarde )); //byte 4
byte zenden sturen met conversie naar 8 bits sturen sturen sturen
}
//***************************************************************************************************** long xdr_DecodeInt() { long r = 0;
Page 4 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
r r r r
+= += += +=
( ( ( (
(long) (long) (long) (long)
ontvagenDataBuffer_Data[ontvagenDataBuffer_index]) << 24; // maak van de char e ontvagenDataBuffer_Data[ontvagenDataBuffer_index+1]) << 16; // en schuif op naar ontvagenDataBuffer_Data[ontvagenDataBuffer_index+2]) << 8; ontvagenDataBuffer_Data[ontvagenDataBuffer_index+3]); // r is uiteindelijk
ontvagenDataBuffer_index+=4; // buffer 4 vooruit zetten return r; }
// keer terug en geef r mee
//***************************************************************************************************** long xdr_DecodeFloat() { int exponent; char firstbyte; char secondbyte; long binfrac; float value; firstbyte=ontvagenDataBuffer_Data[ontvagenDataBuffer_index]; secondbyte=ontvagenDataBuffer_Data[ontvagenDataBuffer_index+1]; exponent=((firstbyte << 1) + (secondbyte >> 7)) & 0xFF; exponent-=127; //anti bias binfrac=((long)(secondbyte & 127)) << 16; binfrac+=((long)(ontvagenDataBuffer_Data[ontvagenDataBuffer_index+2])) << 8; binfrac+=(long)(ontvagenDataBuffer_Data[ontvagenDataBuffer_index+3]); value=((float)binfrac / 8388608.0)+1; if (firstbyte & 128) value=-value; value=value*pow(2.0,exponent); ontvagenDataBuffer_index+=4; return value; }
//***************************************************************************************************** void xdr_EncodeFloat(float value) { int exponent; char firstbyte = 0; char secondbyte; long binfrac = 0; float fraction ;
if (value<0) { firstbyte+=128; // tekenbit zetten value = -value; // waarde pos maken } if (value==0.0) //als getal = 0.0 --> exponent = 0 en mantise = 0 { exponent=0; fraction=0.0; }
Page 5 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
else { exponent=floor(log(value)/0.69314718055994529); // If you want to always round down then you // (System.Math.Floor) Floor will take a doub // it to the smallest whole number. fraction=(value/pow(2.0,exponent))-1.0; exponent+=127; }
firstbyte+=(((char)exponent) >> 1) & 127;
// shift right and clip
stuurserieel(firstbyte); secondbyte=(((char)exponent) << 7); // last bit of exponent binfrac=floor(fraction * 8388608.0); // these are the bits secondbyte+=((char)(binfrac >> 16)); stuurserieel(secondbyte); stuurserieel( (char)(binfrac >> 8) ); stuurserieel( (char)(binfrac) ); }
//***************************************************************************************************** //* eigenlijke opdrachten *// //*****************************************************************************************************
void aanvraagData (int nr) // --> 82 waarden versturen * 4 byte = 328 byte { // sturen van data van het aquarium unsigned long a;
//debugg(' '); xdr_EncodeInt (1); //functieaanvraag op de PDA for (a=0;a<24;a++) { // debugg(' '); xdr_EncodeFloat(temp [a] [nr-1]); // sturen van temp_ }
(nr) 0 - 23 uur
//debugg(' '); // tempMax [nr-1] = 1; // tempMin [nr-1] = 2; xdr_EncodeFloat(tempMax [nr-1]); xdr_EncodeFloat(tempMin [nr-1]);
// sturen van tempMax (nr) // sturen van tempMin (nr)
//debugg(' '); for (a=0;a<24;a++) { //debugg(' '); xdr_EncodeFloat(ph [a] [nr-1]);
// sturen van PH_(nr)0 - 23 uur
Page 6 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
} //debugg(' '); // phMax [nr-1] = 3; // phMin [nr-1] = 4; xdr_EncodeFloat(phMax [nr-1]); xdr_EncodeFloat(phMin [nr-1]);
// sturen van phMax (nr) // sturen van phMin (nr)
//debugg(' '); for (a=0;a<24;a++) { //debugg(' '); xdr_EncodeFloat(niv [a] [nr-1]); // sturen van niveau_(nr) 0 - 23 uur } //debugg(' '); // nivMax [nr-1] = 5; // nivMin [nr-1] = 6; xdr_EncodeFloat(nivMax [nr-1]); xdr_EncodeFloat(nivMin [nr-1]);
// sturen van nivMax (nr) // sturen van nivMin (nr)
//uurAan [nr-1]= 1; //uurUit [nr-1]= 2; //minutenAan [nr-1]= 3; //minutenUit [nr-1]= 4; //debugg(' '); xdr_EncodeInt xdr_EncodeInt xdr_EncodeInt xdr_EncodeInt
(uurAan [nr-1]); (uurUit [nr-1]); (minutenAan [nr-1]); (minutenUit [nr-1]);
// // // //
sturen sturen sturen sturen
van van van van
uurAan (nr) uurUit (nr) minutenAan (nr) minutenUit (nr)
xdr_EncodeInt (90); //einde van de overdracht } //********************************************************************************* void dataAquarium (int nr) { // debugg('B'); tempMax [nr-1] = xdr_DecodeFloat(); // 2de=float = temp_max tempMin [nr-1] = xdr_DecodeFloat(); // 3de=float = temp_min phMax [nr-1] = xdr_DecodeFloat(); // 4de=float = ph_max phMin [nr-1] = xdr_DecodeFloat(); // 5de=float = ph_min nivMax [nr-1] = xdr_DecodeFloat(); // 6de=float = niv_max nivMin [nr-1] = xdr_DecodeFloat(); // 7de=float = niv_min uurAan [nr-1] = xdr_DecodeInt(); uurUit [nr-1] = xdr_DecodeInt(); minutenAan [nr-1] = xdr_DecodeInt(); minutenUit [nr-1] = xdr_DecodeInt(); //debugg('E'); } //*********************************************************************************
Page 7 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
void dataUur () { uur = xdr_DecodeInt(); // 1ste=int = uur minuten = xdr_DecodeInt(); // 2de=int = min seconden = xdr_DecodeInt(); // 3de=int = sec } // ********************************************************************************* void uurtest () { debugg(' '); xdr_EncodeInt (2); //functieaanvraag op de PDA xdr_EncodeInt (uur); // sturen van uur xdr_EncodeInt (minuten); // sturen van minuten xdr_EncodeInt (seconden);// sturen van seconden xdr_EncodeInt (90); //einde van de overdracht } // ********************************************************************************* void juistgemeten() { debugg(' '); xdr_EncodeInt (3); //functieaanvraag op de PDA xdr_EncodeFloat(temp_gemeten [0]); xdr_EncodeFloat(temp_gemeten [1]); xdr_EncodeFloat(temp_gemeten [2]); xdr_EncodeFloat(ph_gemeten [0]); xdr_EncodeFloat(ph_gemeten [1]); xdr_EncodeFloat(ph_gemeten [2]); xdr_EncodeFloat(niv_gemeten [0]); xdr_EncodeFloat(niv_gemeten [1]); xdr_EncodeFloat(niv_gemeten [2]); xdr_EncodeInt (90); //einde van de overdracht }
//***************************************************************************************************** //* functie ingelezen waarden *// //***************************************************************************************************** void functiekeuze() { debugg('t'); switch (xdr_DecodeInt()) { case 1 : debugg('a'); break; case 2 : debugg('b'); break; case 3 : debugg('c'); break; case 4 : debugg('d'); break;
// eerste int geeft de functie weer aanvraagData (1); aanvraagData (2); aanvraagData (3); dataAquarium (1);
Page 8 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
case 5 : debugg('e'); break; case 6 : debugg('f'); break; case 7 : debugg('g'); break; case 8 : debugg('h'); break; case 9 : debugg('i'); break;
dataAquarium (2); dataAquarium (3); dataUur (); uurtest (); juistgemeten ();
default : debugg('D'); //juistgemeten (); break; } }
//***************************************************************************************************** //* METINGEN *// //***************************************************************************************************** void delay() { int i; for (i=0;i<900;i++); } //******//* meetaanvraag kanaal 1 (temp) *//******************************************************* void meetaanvraag_1 (void) { unsigned long i;
clock = 0; DataIN = 1; //START --> DataIN delay(); clock = 1;
// startbit = 1
delay(); clock = 0; DataIN = 0; //SEL2 delay(); clock = 1;
--> DataIN
// kanaalkeuze = 0 // kanaal 0
delay(); clock = 0; DataIN = 0; //SEL1 delay(); clock = 1;
--> DataIN
// kanaalkeuze = 0
delay(); clock = 0; DataIN = 0; //SEL0 delay(); clock = 1;
--> DataIN
// kanaalkeuze = 0
--> DataIN
// input range = 0 //0 tot Vref/2
delay(); clock = 0; DataIN = 0; //RNG delay();
Page 9 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
clock = 1; delay(); clock = 0; DataIN = 0; //BIP delay(); clock = 1;
--> DataIN
// input range = 0
delay(); clock = 0; DataIN = 0; //PD1 delay(); clock = 1;
--> DataIN
// power down and clock // normal = 0
delay(); clock = 0; DataIN = 1; //PD0 delay(); clock = 1;
--> DataIN
// power down and clock // externe clock = 1
delay(); DataIN = 0; //terug 0 zetten for(i=1;i<=6;i++) { clock = 0; delay(); clock = 1; delay(); } } //******//* meetaanvraag kanaal 2 (ph) *//******************************************************** void meetaanvraag_2 (void) { unsigned long i;
clock = 0; DataIN = 1; //START --> DataIN delay(); clock = 1;
// startbit = 1
delay(); clock = 0; DataIN = 0; //SEL2 delay(); clock = 1;
--> DataIN
// kanaalkeuze = 0 // kanaal 1
delay(); clock = 0; DataIN = 0; //SEL1 delay(); clock = 1;
--> DataIN
// kanaalkeuze = 0
--> DataIN
// kanaalkeuze = 1
delay(); clock = 0; DataIN = 1; //SEL0
Page 10 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
delay(); clock = 1; delay(); clock = 0; DataIN = 1; //RNG delay(); clock = 1;
--> DataIN
// input range = 0 //0 tot Vref
delay(); clock = 0; DataIN = 0; //BIP delay(); clock = 1;
--> DataIN
// input range = 0
delay(); clock = 0; DataIN = 0; //PD1 delay(); clock = 1;
--> DataIN
// power down and clock // normal = 0
delay(); clock = 0; DataIN = 1; //PD0 delay(); clock = 1;
--> DataIN
// power down and clock // externe clock = 1
delay(); DataIN = 0; //terug 0 zetten for(i=1;i<=6;i++) { clock = 0; delay(); clock = 1; delay(); } } //******//* meetaanvraag kanaal 3 (niv) *//******************************************************** void meetaanvraag_3 (void) { unsigned long i;
clock = 0; DataIN = 1; //START --> DataIN delay(); clock = 1; delay(); clock = 0; DataIN = 0; //SEL2 delay(); clock = 1;
--> DataIN
// startbit = 1
// kanaalkeuze = 0 // kanaal 2
delay(); clock = 0;
Page 11 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
DataIN = 1; //SEL1 delay(); clock = 1;
--> DataIN
// kanaalkeuze = 1
delay(); clock = 0; DataIN = 0; //SEL0 delay(); clock = 1;
--> DataIN
// kanaalkeuze = 0
delay(); clock = 0; DataIN = 1; //RNG delay(); clock = 1;
--> DataIN
// input range = 0 //0 tot Vref
delay(); clock = 0; DataIN = 0; //BIP delay(); clock = 1;
--> DataIN
// input range = 0
delay(); clock = 0; DataIN = 0; //PD1 delay(); clock = 1;
--> DataIN
// power down and clock // normal = 0
delay(); clock = 0; DataIN = 1; //PD0 delay(); clock = 1;
--> DataIN
// power down and clock // externe clock = 1
delay(); DataIN = 0; //terug 0 zetten for(i=1;i<=6;i++) { clock = 0; delay(); clock = 1; delay(); } } //******//* meetwaarden ophalen *//********************************************************* float {
meetOphalen (void) //waarde terugsturen
float gemetenWaarde; clock = 1; gemetenWaarde = (DataOUT * 2048); delay(); clock = 0; delay(); clock = 1;
Page 12 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
gemetenWaarde = gemetenWaarde + (DataOUT * 1024); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 512); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 256); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 128); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 64); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 32); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 16); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 8); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 4); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 2); delay(); clock = 0; delay(); clock = 1; gemetenWaarde = gemetenWaarde + (DataOUT * 1); delay();
Page 13 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
clock = 0; delay(); return gemetenWaarde ; } //******//* meetwaarden ophalen *//*********************************************************
meten (nr) { //debugg ('M'); //debugg (nr+48); void
float tssresultaat;
meetaanvraag_1 (); // sturen van de info (kan + range) // temperatuur tssresultaat = meetOphalen() ; // ophalen waarden en wegschrijven naar de juiste geheugen temp_gemeten [nr-1] = (tssresultaat * (2.048/4095) *100); // voor MAX1271: 0 _ Vref/2 =
meetaanvraag_2 (); // sturen van de info (kan + range) // ph tssresultaat = meetOphalen () ; // ophalen waarden en wegschrijven naar de juiste geheugen ph_gemeten [nr-1] = (-1*((tssresultaat-250)/((2876-250)/6)-10)); // voor MAX1271: 0 _ Vre //ph_gemeten [nr-1] = tssresultaat ; meetaanvraag_3 (); // sturen van de info (kan + range) // niveau tssresultaat = meetOphalen () ; // ophalen waarden en wegschrijven naar de juiste geheugen niv_gemeten [nr-1] = tssresultaat ; // voor MAX1271: 0 _ Vref = 4.096 V } //******//* meten van aquaria *//**************************************************** void meten_aquarium (nr) { switch (nr) { case 1 : CS1 = 0; // selecteren meten(1); CS1 = 1; // selecteren break; case 2 : CS2 = 0; // selecteren meten(2); CS2 = 1; // selecteren break; case 3 : CS3 = 0; // selecteren meten(3); CS3 = 1; // selecteren break; } }
meetunit 1 met CS1 aan meetunit 1 met CS1 uit meetunit 2 met CS2 aan meetunit 2 met CS2 uit meetunit 3 met CS3 aan meetunit 3 met CS3 uit
//******//* sturen relais *//**************************************************** void relais() { if (temp_gemeten [0] > ((tempMax [0]) + 1)) { relaisTempAqua1 = 0; //debugg('U'); } if (temp_gemeten [0] < ((tempMax [0]) - 1))
Page 14 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
{ relaisTempAqua1 = 1; //debugg('A'); } ///////////////////////////////////////////////// if (temp_gemeten [1] > ((tempMax [1]) + 1)) { relaisTempAqua2 = 0; } if (temp_gemeten [1] < ((tempMax [1]) - 1)) { relaisTempAqua2 = 1; } ///////////////////////////////////////////////// if (temp_gemeten [2] > ((tempMax [2]) + 1)) { relaisTempAqua3 = 0; } if (temp_gemeten [2] < ((tempMax [2]) - 1)) { relaisTempAqua3 = 1; } ///////////////////////////////////////////////// ///////////////////////////////////////////////// if ((uurAan [0] == uur) & ( minutenAan [0] == minuten)) { relaisLichtAqua1 = 1; } if ((uurUit [0] == uur) & ( minutenUit [0] == minuten)) { relaisLichtAqua1 = 0; } ///////////////////////////////////////////////// if ((uurAan [1] == uur) & ( minutenAan [1] == minuten)) { relaisLichtAqua2 = 1; } if ((uurUit [1] == uur) & ( minutenUit [1] == minuten)) { relaisLichtAqua2 = 0; } ///////////////////////////////////////////////// if ((uurAan [2] == uur) & ( minutenAan [2] == minuten)) { relaisLichtAqua3 = 1; } if ((uurUit [2] == uur) & ( minutenUit [2] == minuten)) { relaisLichtAqua3 = 0; }
} //******//* effectief sturen van relais via shuifregister *//****************************************** shiftregister() { UitPuls = 0; delay(); ClokReg = 0; //DataReg = 1; //
Page 15 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
DataReg = relaisTempAqua1; //1 /uitgang 6 delay(); ClokReg = 1; delay(); ClokReg = //DataReg DataReg = delay(); ClokReg = delay(); ClokReg = //DataReg DataReg = delay(); ClokReg = delay(); ClokReg = //DataReg DataReg = delay(); ClokReg = delay(); ClokReg = //DataReg DataReg = delay(); ClokReg = delay(); ClokReg = //DataReg DataReg = delay(); ClokReg =
0; = 0; // relaisLichtAqua1; //2 /uitgang 5 1;
0; = 0; // relaisTempAqua2; //3 /uitgang 4 1;
0; = 0; // relaisLichtAqua2; //4 /uitgang 3 1;
0; = 0; // relaisTempAqua3; //5 /uitgang 2 1;
0; = 0; // relaisLichtAqua3; //6 /uitgang 1 1;
delay(); ClokReg = 0; UitPuls = 0; delay(); UitPuls = 1; //uitgangan doorvoeren delay(); ClokReg = 0; }
//***************************************************************************************************** //* MAIN *// //***************************************************************************************************** void main (void) { //******//*timer 0 init*//********************************************************* TMOD_bit.M00 = 0; TMOD_bit.M10 = 1; TMOD_bit.C_T0 = 0;
// timer mode select bits (mode2 ) // timer mode select bits (mode2 ) // counter/timer selector
Page 16 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
TMOD_bit.GATE0 = 0; TL0 = 164; TH0 = 164;
// gate control enable
// = 99,826 µs
TCON_bit.TF0 = 0; TCON_bit.TR0 = 1;
// timer waarde vullen // timer hervul waarde vullen
// timer 0 run control // timer 0 overflow flag
//******//*init voor timer 1 en seriele poort 1 *//************************************ TMOD |= 0x20; // VOOR timer 1 WDCON |= 0x80; // VOOR timer 2 TH1 = 0xFF; TCON_bit.TR1 = 1; SCON1 = 0x50; SCON1_bit.TI_1 = 1;
// VOOR seriele : mode settings // VOOR seriele : flag
// SCON=0x50; // TI=1;
//******//*init voor timer 2 en seriele poort 0 *//************************************ T2CON=0x34; RCAP2L=0xFA; RCAP2H=0xFF; T2CON_bit.TR2 = 1; SCON0 = 0x50; SCON0_bit.TI_0 = 1;
// TR2=1; // SCON=0x50; // TI=1;
//********//*int systeem*//********************************************************* IE_bit.ET0 = 1; IE_bit.ES1 = 1; IE_bit.ES0 = 1; IE_bit.EA = 1;
// // // //
init van timer 0 init van seriele init van seriele global interrupt
toelaten poort 1 toelaten poort 0 toelaten enable
//********//* opstartvoorwaarden*//************************************************ ontvagenDataBuffer_index = 0; // ontvangstbuffer op 0 zetten // PMR_bit.DME0 = 1; // bit hoog zetten voor extra SRAM geheugen te kunne gebruiken // PS1: --> NU IN CSTARTUP.S51 // PS2: niet meer nodig met extra ram IC CS1 = 1; // niet geselecteerd CS2 = 1; CS3 = 1; DataOUT = 1; // ingangen hoog DataIN = 0; // uitgang laag clock = 0; // uitgang laag DataReg = 0 ; // uitgang laag ClokReg = 0 ; // uitgang laag UitPuls = 0 ; // uitgang laag relaisTempAqua1 = 0 ; // relais uit relaisLichtAqua1 = 0 ; relaisTempAqua2 = 0 ; relaisLichtAqua2 = 0 ; relaisTempAqua3 = 0 ; relaisLichtAqua3 = 0 ; shiftregister(); // relais uitgangen uitshiften: startvoorwaarden relais // test voor DEMO
Page 17 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
tempMax [0] = 30; tempMax [1] = 30; tempMax [2] = 30;
uurAan [0] minutenAan uurUit [0] minutenUit
= 0; [0] = 3; = 0; [0] = 4;
uurAan [2] minutenAan uurUit [2] minutenUit
= 1; [2] = 3; = 1; [2] = 4;
//********//* eigenlijke hoofdlus*//***********************************************
debugg('X');
while(1){
//********//* detectie einde van dataoverdracht + uitvoeren ervan *//************** //*******//* detectie op link *//************** IE_bit.ES1 = 0;
if(ontvagenDataBuffer_index> 13)//enkel als de buffer genoeg gevuld is voor de voorwaarden van inter { if ((ontvagenDataBuffer_Data[ontvagenDataBuffer_index - 1] == 3 ) & (ontvagenDataBuffer_Data[ontvagenDataBuffer_index - 2] == 1 ) & (ontvagenDataBuffer_Data[ontvagenDataBuffer_index - 9] == 0x7c ) & (ontvagenDataBuffer_Data[ontvagenDataBuffer_index - 12] == 0x0c )) //detectie op incomming link established (02,69,0C,07,00,7C,xx,xx,xx,xx,xx,xx,01,03) { debugg('L'); ontvagenDataBuffer_index = 0; //eventueel hier nog op transparant mode zetten //stuurserieel (0x02);stuurserieel (0x52);stuurserieel (0x11);stuurserieel (0x01);stuurserieel } } //*******//* detectie op datafuncties *//**************
//if ((ontvagenDataBuffer_Data[ontvagenDataBuffer_index - 1] == 255 ) & ( ontvagenDataBuffer_Data[on if (ontvagenDataBuffer_Data[ontvagenDataBuffer_index - 1] == 90 ) //alles binnen (afsluiten met 2 bytes van waarde { //TEST --> buffer afdrukken unsigned long a; char first; char second; for (a=0;a
Page 18 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178
first=(ontvagenDataBuffer_Data[a] % 16); second=(ontvagenDataBuffer_Data[a] / 16); if (second>9) debugg(55+second); else debugg(48+second); if (first>9) debugg(55+first); else debugg(48+first); debugg(32); } //EINDE TEST
//IE_bit.ES1 = 0; ontvagenDataBuffer_index = 0;
// init van seriele poort 0 afzetten // terug 0 zetten voor uit te lezen
debugg('y'); functiekeuze ();
// sub aanroepen voor functiekeuze
debugg('x'); debugg(' '); //IE_bit.ES1 = 1; ontvagenDataBuffer_index = 0;
// init van seriele poort 0 toelaten na alle verwerkingen // DEZ // buffer reset // DEZE
} IE_bit.ES1 = 1; //interups terug aan
//*******//* metingen *//*************************************************************************** // //
if(seconden == 5) { // *********** / meetwaarden inlezen en bewaren / ******************************** meten_aquarium (1); // meten aqua 1 (3 kanalen) meten_aquarium (2); // meten aqua 2 (3 kanalen) meten_aquarium (3); // meten aqua 3 (3 kanalen) if ( minuten == { temp [uur] [0] temp [uur] [1] temp [uur] [2]
2) // om het uur de waarden bewaren (op minuten == 2) = temp_gemeten [0]; = temp_gemeten [1]; = temp_gemeten [2];
ph [uur] [0] = ph_gemeten [0]; ph [uur] [1] = ph_gemeten [1]; ph [uur] [2] = ph_gemeten [2]; niv [uur] [0] = niv_gemeten [0]; niv [uur] [1] = niv_gemeten [1]; niv [uur] [2] = niv_gemeten [2]; } // ******* / voorwaarden stellen en uistsuren / ********************************** relais(); // voorwaarden voor sturen van relais shiftregister(); // relais uitgangen uitshiften //
}//end is sec == 5
//*********************// test : niet nodig meer als metingen zijn toegepast //***************
Page 19 of 20
D:\BESTANDEN\microcl MAXIM\met IAR\test voor xdr\test xdr 1.c 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195
//wachttijd waarop wel een interput kan worden uitgevoert //int i; //for (i=0;i<30000;i++); }//einde while }
Page 20 of 20
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
11.2.2 .NET Framework in C#
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
73
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
using using using using using using
System; System.Drawing; System.Collections; System.ComponentModel; System.Windows.Forms; Virtiem;
namespace Compactclient { public class Form2 : System.Windows.Forms.Form { private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabPage tabmain; private System.Windows.Forms.TabPage tabsettings; private System.Windows.Forms.TabPage tabstatus; private System.Windows.Forms.Button btnDisconnect; private System.Windows.Forms.Button btnQuit; private System.Windows.Forms.TabPage tababout; private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuQuit; private System.Windows.Forms.Label lblAbout;
// KB laten staan #region Virtiem_gen publics public SerialConnection conn; // this should be set to Connection public XdrConverter xdr = new XdrConverter(); public Connection.Buffer buf = new Connection.Buffer(); private ListBox statusBox; private Button btnConnect; private Button aqua1; private Button aqua3; private Button aqua2; private Label lblquanr; private Label lblAquanrSa; private Label lblAquanrSe; private Button aqua3Update; private Button aqua2Update; private Button aqua1Update; private Label labelniv; private Label labelPH; private Label labeltemp; private MenuItem menuItem1; private TextBox TbPhMax; private TextBox TbPhMin; private TextBox TbTempMax; private Label labelMax; private Label labelMin; private TextBox TbNivMax; private TextBox TbNivMin; private TextBox TbMinUit; private TextBox TbMinAan; private TextBox TbUurUit; private TextBox TbUurAan; private Label labelMinuten; private Label labelUur; private Button UurUpdate; private Label labelUit; private Label labelAan; //private CompactClientv0._3.UserControl1 userControl11; private TabPage testTab; private Byte[] recbuf=new Byte[4096]; // 4096/4 = 1024 waarden private ListBox ingelezenwaardenBox; private TextBox textBox3; private Button button1; private Label lbBezigSe; private Label lbBezigSa; private Button momenteleaanvraag; private Label lbBezigMo; private ListBox momenteleWaardenBox; //private Int16 recbufTeller = 0;
1
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
private Int32 recbufTeller = 0; private Int32 tijdVoorTimeOut = 0; private TextBox TbTempMin; private Timer timer1; #endregion //KB laten staan public Form2() { InitializeComponent(); //try { conn = new SerialConnection(this); } //catch { } } //KB laten staan protected override void Dispose( bool disposing ) { base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System. ComponentModel.ComponentResourceManager(typeof(Form2)); this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabmain = new System.Windows.Forms.TabPage(); this.statusBox = new System.Windows.Forms.ListBox(); this.btnConnect = new System.Windows.Forms.Button(); this.btnQuit = new System.Windows.Forms.Button(); this.btnDisconnect = new System.Windows.Forms.Button(); this.tabstatus = new System.Windows.Forms.TabPage(); this.lbBezigSa = new System.Windows.Forms.Label(); this.ingelezenwaardenBox = new System.Windows.Forms.ListBox(); this.lblAquanrSa = new System.Windows.Forms.Label(); this.aqua3 = new System.Windows.Forms.Button(); this.aqua2 = new System.Windows.Forms.Button(); this.aqua1 = new System.Windows.Forms.Button(); this.tabsettings = new System.Windows.Forms.TabPage(); this.lbBezigSe = new System.Windows.Forms.Label(); this.UurUpdate = new System.Windows.Forms.Button(); this.labelUit = new System.Windows.Forms.Label(); this.labelAan = new System.Windows.Forms.Label(); this.TbMinUit = new System.Windows.Forms.TextBox(); this.TbMinAan = new System.Windows.Forms.TextBox(); this.TbUurUit = new System.Windows.Forms.TextBox(); this.TbUurAan = new System.Windows.Forms.TextBox(); this.labelMinuten = new System.Windows.Forms.Label(); this.labelUur = new System.Windows.Forms.Label(); this.TbNivMax = new System.Windows.Forms.TextBox(); this.TbNivMin = new System.Windows.Forms.TextBox(); this.TbPhMax = new System.Windows.Forms.TextBox(); this.TbPhMin = new System.Windows.Forms.TextBox(); this.TbTempMax = new System.Windows.Forms.TextBox(); this.labelMax = new System.Windows.Forms.Label(); this.labelMin = new System.Windows.Forms.Label(); this.labelniv = new System.Windows.Forms.Label(); this.labelPH = new System.Windows.Forms.Label(); this.labeltemp = new System.Windows.Forms.Label(); this.aqua3Update = new System.Windows.Forms.Button(); this.aqua2Update = new System.Windows.Forms.Button(); this.aqua1Update = new System.Windows.Forms.Button(); this.lblAquanrSe = new System.Windows.Forms.Label(); this.testTab = new System.Windows.Forms.TabPage(); this.momenteleWaardenBox = new System.Windows.Forms.ListBox(); this.lbBezigMo = new System.Windows.Forms.Label(); this.momenteleaanvraag = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button(); this.textBox3 = new System.Windows.Forms.TextBox();
2
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
3
this.tababout = new System.Windows.Forms.TabPage(); this.lblAbout = new System.Windows.Forms.Label(); this.mainMenu1 = new System.Windows.Forms.MainMenu(); this.menuQuit = new System.Windows.Forms.MenuItem(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.timer1 = new System.Windows.Forms.Timer(); this.TbTempMin = new System.Windows.Forms.TextBox(); this.tabControl1.SuspendLayout(); this.tabmain.SuspendLayout(); this.tabstatus.SuspendLayout(); this.tabsettings.SuspendLayout(); this.testTab.SuspendLayout(); this.tababout.SuspendLayout(); this.SuspendLayout(); // // tabControl1 // this.tabControl1.Controls.Add(this.tabmain); this.tabControl1.Controls.Add(this.tabstatus); this.tabControl1.Controls.Add(this.tabsettings); this.tabControl1.Controls.Add(this.testTab); this.tabControl1.Controls.Add(this.tababout); this.tabControl1.Location = new System.Drawing.Point(0, 0); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; this.tabControl1.Size = new System.Drawing.Size(244, 267); this.tabControl1.TabIndex = 0; // // tabmain // this.tabmain.Controls.Add(this.statusBox); this.tabmain.Controls.Add(this.btnConnect); this.tabmain.Controls.Add(this.btnQuit); this.tabmain.Controls.Add(this.btnDisconnect); this.tabmain.Location = new System.Drawing.Point(0, 0); this.tabmain.Name = "tabmain"; this.tabmain.Size = new System.Drawing.Size(244, 244); this.tabmain.Text = "Main"; this.tabmain.EnabledChanged += new System.EventHandler(this. tabmain_EnabledChanged); // // statusBox // this.statusBox.Location = new System.Drawing.Point(6, 22); this.statusBox.Name = "statusBox"; this.statusBox.Size = new System.Drawing.Size(235, 184); this.statusBox.TabIndex = 7; // // btnConnect // this.btnConnect.Location = new System.Drawing.Point(7, 215); this.btnConnect.Name = "btnConnect"; this.btnConnect.Size = new System.Drawing.Size(70, 20); this.btnConnect.TabIndex = 6; this.btnConnect.Text = "Connect"; this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click_1); // // btnQuit // this.btnQuit.Location = new System.Drawing.Point(167, 215); this.btnQuit.Name = "btnQuit"; this.btnQuit.Size = new System.Drawing.Size(70, 20); this.btnQuit.TabIndex = 0; this.btnQuit.Text = "&Quit"; this.btnQuit.Click += new System.EventHandler(this.btnQuit_Click); // // btnDisconnect // this.btnDisconnect.Enabled = false; this.btnDisconnect.Location = new System.Drawing.Point(83, 215); this.btnDisconnect.Name = "btnDisconnect"; this.btnDisconnect.Size = new System.Drawing.Size(77, 20); this.btnDisconnect.TabIndex = 1; this.btnDisconnect.Text = "Disconnect";
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
this.btnDisconnect.Click += new System.EventHandler(this. btnDisconnect_Click); // // tabstatus // this.tabstatus.Controls.Add(this.lbBezigSa); this.tabstatus.Controls.Add(this.ingelezenwaardenBox); this.tabstatus.Controls.Add(this.lblAquanrSa); this.tabstatus.Controls.Add(this.aqua3); this.tabstatus.Controls.Add(this.aqua2); this.tabstatus.Controls.Add(this.aqua1); this.tabstatus.Location = new System.Drawing.Point(0, 0); this.tabstatus.Name = "tabstatus"; this.tabstatus.Size = new System.Drawing.Size(244, 244); this.tabstatus.Text = "Status"; // // lbBezigSa // this.lbBezigSa.Font = new System.Drawing.Font("Courier New", 9F, System. Drawing.FontStyle.Regular); this.lbBezigSa.ForeColor = System.Drawing.Color.Red; this.lbBezigSa.Location = new System.Drawing.Point(7, 18); this.lbBezigSa.Name = "lbBezigSa"; this.lbBezigSa.Size = new System.Drawing.Size(185, 28); this.lbBezigSa.Text = "Bezig met verwerking..."; this.lbBezigSa.Visible = false; // // ingelezenwaardenBox // this.ingelezenwaardenBox.Location = new System.Drawing.Point(7, 85); this.ingelezenwaardenBox.Name = "ingelezenwaardenBox"; this.ingelezenwaardenBox.Size = new System.Drawing.Size(230, 156); this.ingelezenwaardenBox.TabIndex = 3; // // lblAquanrSa // this.lblAquanrSa.Location = new System.Drawing.Point(7, 4); this.lblAquanrSa.Name = "lblAquanrSa"; this.lblAquanrSa.Size = new System.Drawing.Size(177, 22); this.lblAquanrSa.Text = "waarden van aquarium nr: "; // // aqua3 // this.aqua3.Location = new System.Drawing.Point(153, 49); this.aqua3.Name = "aqua3"; this.aqua3.Size = new System.Drawing.Size(54, 21); this.aqua3.TabIndex = 2; this.aqua3.Text = "aqua 3"; this.aqua3.Click += new System.EventHandler(this.aqua3_Click); // // aqua2 // this.aqua2.Location = new System.Drawing.Point(92, 49); this.aqua2.Name = "aqua2"; this.aqua2.Size = new System.Drawing.Size(55, 21); this.aqua2.TabIndex = 1; this.aqua2.Text = "aqua 2"; this.aqua2.Click += new System.EventHandler(this.aqua2_Click); // // aqua1 // this.aqua1.Location = new System.Drawing.Point(29, 49); this.aqua1.Name = "aqua1"; this.aqua1.Size = new System.Drawing.Size(57, 21); this.aqua1.TabIndex = 0; this.aqua1.Text = "aqua 1"; this.aqua1.Click += new System.EventHandler(this.aqua1_Click); // // tabsettings // this.tabsettings.Controls.Add(this.lbBezigSe); this.tabsettings.Controls.Add(this.UurUpdate); this.tabsettings.Controls.Add(this.labelUit); this.tabsettings.Controls.Add(this.labelAan);
4
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
this.tabsettings.Controls.Add(this.TbMinUit); this.tabsettings.Controls.Add(this.TbMinAan); this.tabsettings.Controls.Add(this.TbUurUit); this.tabsettings.Controls.Add(this.TbUurAan); this.tabsettings.Controls.Add(this.labelMinuten); this.tabsettings.Controls.Add(this.labelUur); this.tabsettings.Controls.Add(this.TbNivMax); this.tabsettings.Controls.Add(this.TbNivMin); this.tabsettings.Controls.Add(this.TbPhMax); this.tabsettings.Controls.Add(this.TbPhMin); this.tabsettings.Controls.Add(this.TbTempMax); this.tabsettings.Controls.Add(this.TbTempMin); this.tabsettings.Controls.Add(this.labelMax); this.tabsettings.Controls.Add(this.labelMin); this.tabsettings.Controls.Add(this.labelniv); this.tabsettings.Controls.Add(this.labelPH); this.tabsettings.Controls.Add(this.labeltemp); this.tabsettings.Controls.Add(this.aqua3Update); this.tabsettings.Controls.Add(this.aqua2Update); this.tabsettings.Controls.Add(this.aqua1Update); this.tabsettings.Controls.Add(this.lblAquanrSe); this.tabsettings.Location = new System.Drawing.Point(0, 0); this.tabsettings.Name = "tabsettings"; this.tabsettings.Size = new System.Drawing.Size(244, 244); this.tabsettings.Text = "Settings"; // // lbBezigSe // this.lbBezigSe.Font = new System.Drawing.Font("Courier New", 9F, System. Drawing.FontStyle.Regular); this.lbBezigSe.ForeColor = System.Drawing.Color.Red; this.lbBezigSe.Location = new System.Drawing.Point(7, 18); this.lbBezigSe.Name = "lbBezigSe"; this.lbBezigSe.Size = new System.Drawing.Size(185, 28); this.lbBezigSe.Text = "Bezig met verwerking..."; this.lbBezigSe.Visible = false; // // UurUpdate // this.UurUpdate.Location = new System.Drawing.Point(120, 216); this.UurUpdate.Name = "UurUpdate"; this.UurUpdate.Size = new System.Drawing.Size(99, 19); this.UurUpdate.TabIndex = 23; this.UurUpdate.Text = "Update uur"; this.UurUpdate.Click += new System.EventHandler(this.UurUpdate_Click); // // labelUit // this.labelUit.Location = new System.Drawing.Point(31, 159); this.labelUit.Name = "labelUit"; this.labelUit.Size = new System.Drawing.Size(29, 19); this.labelUit.Text = "Uit"; // // labelAan // this.labelAan.Location = new System.Drawing.Point(31, 132); this.labelAan.Name = "labelAan"; this.labelAan.Size = new System.Drawing.Size(29, 19); this.labelAan.Text = "Aan"; // // TbMinUit // this.TbMinUit.Location = new System.Drawing.Point(119, 159); this.TbMinUit.Name = "TbMinUit"; this.TbMinUit.Size = new System.Drawing.Size(34, 21); this.TbMinUit.TabIndex = 20; this.TbMinUit.Text = "06"; // // TbMinAan // this.TbMinAan.Location = new System.Drawing.Point(119, 132); this.TbMinAan.Name = "TbMinAan"; this.TbMinAan.Size = new System.Drawing.Size(34, 21); this.TbMinAan.TabIndex = 19;
5
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
this.TbMinAan.Text = "04"; // // TbUurUit // this.TbUurUit.Location = new System.Drawing.Point(66, 159); this.TbUurUit.Name = "TbUurUit"; this.TbUurUit.Size = new System.Drawing.Size(34, 21); this.TbUurUit.TabIndex = 18; this.TbUurUit.Text = "01"; // // TbUurAan // this.TbUurAan.Location = new System.Drawing.Point(66, 132); this.TbUurAan.Name = "TbUurAan"; this.TbUurAan.Size = new System.Drawing.Size(34, 21); this.TbUurAan.TabIndex = 17; this.TbUurAan.Text = "01"; // // labelMinuten // this.labelMinuten.Location = new System.Drawing.Point(113, 114); this.labelMinuten.Name = "labelMinuten"; this.labelMinuten.Size = new System.Drawing.Size(53, 15); this.labelMinuten.Text = "minuten"; // // labelUur // this.labelUur.Location = new System.Drawing.Point(69, 114); this.labelUur.Name = "labelUur"; this.labelUur.Size = new System.Drawing.Size(38, 15); this.labelUur.Text = "uur"; // // TbNivMax // this.TbNivMax.Location = new System.Drawing.Point(172, 64); this.TbNivMax.Name = "TbNivMax"; this.TbNivMax.Size = new System.Drawing.Size(34, 21); this.TbNivMax.TabIndex = 14; this.TbNivMax.Text = "0"; // // TbNivMin // this.TbNivMin.Location = new System.Drawing.Point(172, 91); this.TbNivMin.Name = "TbNivMin"; this.TbNivMin.Size = new System.Drawing.Size(34, 21); this.TbNivMin.TabIndex = 13; this.TbNivMin.Text = "0"; // // TbPhMax // this.TbPhMax.Location = new System.Drawing.Point(119, 64); this.TbPhMax.Name = "TbPhMax"; this.TbPhMax.Size = new System.Drawing.Size(34, 21); this.TbPhMax.TabIndex = 12; this.TbPhMax.Text = "0"; // // TbPhMin // this.TbPhMin.Location = new System.Drawing.Point(119, 91); this.TbPhMin.Name = "TbPhMin"; this.TbPhMin.Size = new System.Drawing.Size(34, 21); this.TbPhMin.TabIndex = 11; this.TbPhMin.Text = "0"; // // TbTempMax // this.TbTempMax.Location = new System.Drawing.Point(66, 64); this.TbTempMax.Name = "TbTempMax"; this.TbTempMax.Size = new System.Drawing.Size(34, 21); this.TbTempMax.TabIndex = 10; this.TbTempMax.Text = "30"; // // labelMax //
6
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
7
this.labelMax.Location = new System.Drawing.Point(31, 64); this.labelMax.Name = "labelMax"; this.labelMax.Size = new System.Drawing.Size(29, 19); this.labelMax.Text = "Max"; // // labelMin // this.labelMin.Location = new System.Drawing.Point(31, 91); this.labelMin.Name = "labelMin"; this.labelMin.Size = new System.Drawing.Size(29, 19); this.labelMin.Text = "Min"; // // labelniv // this.labelniv.Location = new System.Drawing.Point(172, 46); this.labelniv.Name = "labelniv"; this.labelniv.Size = new System.Drawing.Size(47, 15); this.labelniv.Text = "niv"; // // labelPH // this.labelPH.Location = new System.Drawing.Point(119, 46); this.labelPH.Name = "labelPH"; this.labelPH.Size = new System.Drawing.Size(47, 15); this.labelPH.Text = "PH"; // // labeltemp // this.labeltemp.Location = new System.Drawing.Point(66, 46); this.labeltemp.Name = "labeltemp"; this.labeltemp.Size = new System.Drawing.Size(47, 15); this.labeltemp.Text = "temp"; // // aqua3Update // this.aqua3Update.Location = new System.Drawing.Point(120, 189); this.aqua3Update.Name = "aqua3Update"; this.aqua3Update.Size = new System.Drawing.Size(99, 21); this.aqua3Update.TabIndex = 3; this.aqua3Update.Text = "Update aqua 3"; this.aqua3Update.Click += new System.EventHandler(this.aqua3Update_Click); // // aqua2Update // this.aqua2Update.Location = new System.Drawing.Point(15, 214); this.aqua2Update.Name = "aqua2Update"; this.aqua2Update.Size = new System.Drawing.Size(99, 21); this.aqua2Update.TabIndex = 2; this.aqua2Update.Text = "Update aqua 2"; this.aqua2Update.Click += new System.EventHandler(this.aqua2Update_Click); // // aqua1Update // this.aqua1Update.Location = new System.Drawing.Point(15, 189); this.aqua1Update.Name = "aqua1Update"; this.aqua1Update.Size = new System.Drawing.Size(99, 21); this.aqua1Update.TabIndex = 1; this.aqua1Update.Text = "Update aqua 1"; this.aqua1Update.Click += new System.EventHandler(this.aqua1Update_Click); // // lblAquanrSe // this.lblAquanrSe.Location = new System.Drawing.Point(7, 4); this.lblAquanrSe.Name = "lblAquanrSe"; this.lblAquanrSe.Size = new System.Drawing.Size(185, 14); this.lblAquanrSe.Text = "waarden van aquarium nr: "; // // testTab // this.testTab.Controls.Add(this.momenteleWaardenBox); this.testTab.Controls.Add(this.lbBezigMo); this.testTab.Controls.Add(this.momenteleaanvraag); this.testTab.Controls.Add(this.button1); this.testTab.Controls.Add(this.textBox3);
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
this.testTab.Location = new System.Drawing.Point(0, 0); this.testTab.Name = "testTab"; this.testTab.Size = new System.Drawing.Size(244, 244); this.testTab.Text = "Moment"; // // momenteleWaardenBox // this.momenteleWaardenBox.Location = new System.Drawing.Point(7, 67); this.momenteleWaardenBox.Name = "momenteleWaardenBox"; this.momenteleWaardenBox.Size = new System.Drawing.Size(230, 128); this.momenteleWaardenBox.TabIndex = 18; // // lbBezigMo // this.lbBezigMo.Font = new System.Drawing.Font("Courier New", 9F, System. Drawing.FontStyle.Regular); this.lbBezigMo.ForeColor = System.Drawing.Color.Red; this.lbBezigMo.Location = new System.Drawing.Point(7, 18); this.lbBezigMo.Name = "lbBezigMo"; this.lbBezigMo.Size = new System.Drawing.Size(185, 18); this.lbBezigMo.Text = "Bezig met verwerking..."; this.lbBezigMo.Visible = false; // // momenteleaanvraag // this.momenteleaanvraag.Location = new System.Drawing.Point(7, 39); this.momenteleaanvraag.Name = "momenteleaanvraag"; this.momenteleaanvraag.Size = new System.Drawing.Size(230, 23); this.momenteleaanvraag.TabIndex = 15; this.momenteleaanvraag.Text = "momentele meetwaarden"; this.momenteleaanvraag.Click += new System.EventHandler(this. momenteleaanvraag_Click); // // button1 // this.button1.Location = new System.Drawing.Point(36, 207); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(74, 21); this.button1.TabIndex = 14; this.button1.Text = "timetest"; this.button1.Click += new System.EventHandler(this.button1_Click); // // textBox3 // this.textBox3.Location = new System.Drawing.Point(116, 207); this.textBox3.Name = "textBox3"; this.textBox3.Size = new System.Drawing.Size(75, 21); this.textBox3.TabIndex = 13; this.textBox3.Text = "hh mm ss"; // // tababout // this.tababout.Controls.Add(this.lblAbout); this.tababout.Location = new System.Drawing.Point(0, 0); this.tababout.Name = "tababout"; this.tababout.Size = new System.Drawing.Size(244, 244); this.tababout.Text = "About"; // // lblAbout // this.lblAbout.Location = new System.Drawing.Point(5, 14); this.lblAbout.Name = "lblAbout"; this.lblAbout.Size = new System.Drawing.Size(225, 212); this.lblAbout.Text = resources.GetString("lblAbout.Text"); this.lblAbout.TextAlign = System.Drawing.ContentAlignment.TopCenter; this.lblAbout.ParentChanged += new System.EventHandler(this. lblAbout_ParentChanged); // // mainMenu1 // this.mainMenu1.MenuItems.Add(this.menuQuit); this.mainMenu1.MenuItems.Add(this.menuItem1); // // menuQuit
8
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658
// this.menuQuit.Text = "Quit"; this.menuQuit.Click += new System.EventHandler(this.btnQuit_Click); // // menuItem1 // this.menuItem1.Text = "Bluetooth V2.1 KB"; // // timer1 // this.timer1.Interval = 5000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // // TbTempMin // this.TbTempMin.Location = new System.Drawing.Point(66, 91); this.TbTempMin.Name = "TbTempMin"; this.TbTempMin.Size = new System.Drawing.Size(34, 21); this.TbTempMin.TabIndex = 9; this.TbTempMin.Text = "0"; // // Form2 // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; this.ClientSize = new System.Drawing.Size(244, 270); this.ControlBox = false; this.Controls.Add(this.tabControl1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.KeyPreview = true; this.Menu = this.mainMenu1; this.Name = "Form2"; this.Text = "Bluetooth embedded meetsysteem"; this.Load += new System.EventHandler(this.Form2_Load); this.tabControl1.ResumeLayout(false); this.tabmain.ResumeLayout(false); this.tabstatus.ResumeLayout(false); this.tabsettings.ResumeLayout(false); this.testTab.ResumeLayout(false); this.tababout.ResumeLayout(false); this.ResumeLayout(false); } #endregion //KB gewoon laten staan :) private void Form2_Load(object sender, System.EventArgs e) { } static void Main() { Application.Run(new Form2()); }
//KB voor te connecteren --> nieuwe connectie met seriele poort maken private void btnConnect_Click_1(object sender, EventArgs e) { conn = new SerialConnection(this); //KB laten staan #region Virtiem_gen init conn.OnStatusMessage += new NetConnection.SockMessage(sockstatus); conn.OnConnected += new NetConnection.SockEvent(sockconnnected); conn.OnDisconnected += new NetConnection.SockEvent(sockdisconnnected); conn.OnReceive += new NetConnection.SockReceive(receive); //conn.remoteIP = txtIP.Text; //conn.remotePort = Convert.ToInt32(txtPort.Text); conn.Connect();
9
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
10
#endregion } //KB voor te disconnecteren --> connectie met de poort sluiten private void btnDisconnect_Click(object sender, System.EventArgs e) { conn.Close(); } //KB poort sluiten en programma beeindigen private void btnQuit_Click(object sender, System.EventArgs e) { try { conn.Close(); } catch {} // indien niet geopend, niets doen
}
Application.Exit();
//KB gewoon laten staan :) private void tabmain_EnabledChanged(object sender, System.EventArgs e) { }
//KB om data weer te sturen van de µC naar de PDA #region returnfuncties, aanpasbaar private void return_een() //gemeten waarden temp + min,max temperatuur weergeven { //temperaturen for (int t = 0; t < 24; t++) { ingelezenwaardenBox.Items.Add("Temp " + t + " uur: " + xdr. DecodeFloat(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; } TbTempMax.Text = Convert.ToString(xdr.DecodeFloat(recbuf, recbufTeller)) ; recbufTeller = recbufTeller + 4; TbTempMin.Text = Convert.ToString(xdr.DecodeFloat(recbuf, recbufTeller)) ; recbufTeller = recbufTeller + 4; //PH waarden for (int t = 0; t<24; t++) { ingelezenwaardenBox.Items.Add("PH " + t + " uur: " + xdr.DecodeFloat (recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; } TbPhMax.Text = Convert.ToString(xdr.DecodeFloat(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; TbPhMin.Text = Convert.ToString(xdr.DecodeFloat(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; //niveau waarden for (int t = 0; t<24; t++) { if (xdr.DecodeFloat(recbuf, recbufTeller) > 3108)
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782
{ );
11
ingelezenwaardenBox.Items.Add("niveau " + t + " uur: " + "VOL"
}
if ((xdr.DecodeFloat(recbuf, recbufTeller) < 3108) && (xdr. DecodeFloat(recbuf, recbufTeller) > 2225)) { ingelezenwaardenBox.Items.Add("niveau " + t + " uur: " + "- 2 cm"); } if ((xdr.DecodeFloat(recbuf, recbufTeller) < 2225) && (xdr. DecodeFloat(recbuf, recbufTeller) > 1370)) { ingelezenwaardenBox.Items.Add("niveau " + t + " uur: " + "- 4 cm"); } if (xdr.DecodeFloat(recbuf, recbufTeller) < 1370) { ingelezenwaardenBox.Items.Add("niveau " + t + " uur: " + " > 6
cm");
}
}
recbufTeller = recbufTeller + 4;
TbNivMax.Text = Convert.ToString(xdr.DecodeFloat(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; TbNivMin.Text = Convert.ToString(xdr.DecodeFloat(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; // aan/uit uren TbUurAan.Text = Convert.ToString(xdr.DecodeInt32(recbuf, recbufTeller = recbufTeller + 4; TbUurUit.Text = Convert.ToString(xdr.DecodeInt32(recbuf, recbufTeller = recbufTeller + 4; TbMinAan.Text = Convert.ToString(xdr.DecodeInt32(recbuf, recbufTeller = recbufTeller + 4; TbMinUit.Text = Convert.ToString(xdr.DecodeInt32(recbuf, recbufTeller = recbufTeller + 4;
recbufTeller)); recbufTeller)); recbufTeller)); recbufTeller));
} private void return_twee() // real time test { textBox3.Text = Convert.ToString(xdr.DecodeInt32(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; textBox3.Text += " : " + Convert.ToString(xdr.DecodeInt32(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; textBox3.Text += " : " + Convert.ToString(xdr.DecodeInt32(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; } private void return_drie() // momentele meetwaarden { for (int t = 0; t < 3; t++) { momenteleWaardenBox.Items.Add("Temperatuur aqua " + (t + 1) + " : " + xdr.DecodeFloat(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; } for (int t = 0; t < 3; t++) { momenteleWaardenBox.Items.Add("PH aqua " + (t + 1) + " : " + xdr. DecodeFloat(recbuf, recbufTeller)); recbufTeller = recbufTeller + 4; } for (int t = 0; t < 3; t++) {
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849
12
if (xdr.DecodeFloat(recbuf, recbufTeller) > 3108) { momenteleWaardenBox.Items.Add("niveau aqua " + (t + 1) + " : " +
"VOL");
}
if ((xdr.DecodeFloat(recbuf, recbufTeller) < 3108) && (xdr.DecodeFloat (recbuf, recbufTeller) > 2225)) { momenteleWaardenBox.Items.Add("niveau aqua " + (t + 1) + " : " + "- 2 cm"); } if ((xdr.DecodeFloat(recbuf, recbufTeller) < 2225) && (xdr.DecodeFloat (recbuf, recbufTeller) > 1370)) { momenteleWaardenBox.Items.Add("niveau aqua " + (t + 1) + " : " + "- 4 cm"); }
> 6 cm");
}
}
if (xdr.DecodeFloat(recbuf, recbufTeller) < 1370) { momenteleWaardenBox.Items.Add("niveau aqua " + (t + 1) + " : " + " } recbufTeller = recbufTeller + 4;
#endregion
#region Virtiem_gen nodige functies private void receive(byte[] databuffer) { //--> eerst alle data bufferen tot de laatste byte recbuf[recbufTeller] = databuffer[0] ; recbufTeller++; statusBox.Items.Add( (Convert.ToString(recbufTeller- 1)) + " : " + (Convert.ToString(recbuf[recbufTeller - 1]) )); // test //--> als alle data ontvangen is de juiste routine uitvoeren if (recbuf[recbufTeller - 1] == 90) { Int32 myfunc = xdr.DecodeInt32(recbuf); switch (myfunc) { case 1: //ontvangst van temperatuur statusBox.Items.Add("data aqua ontvangen"); recbufTeller = 4; return_een(); //statusBox.Items.Add("E");//test recbufTeller = 0; //reset de ontvangstbuffer break; case 2: //test van uur statusBox.Items.Add("uur controle"); recbufTeller = 4;
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
13
return_twee(); //statusBox.Items.Add("E");//test recbufTeller = 0; break; case 3: //momentele meetwaarden opvragen statusBox.Items.Add("momentele meetwaarden"); recbufTeller = 4; return_drie(); //statusBox.Items.Add("E");//test recbufTeller = 0; break; default: statusBox.Items.Add("default ontvangst"); recbufTeller = 0; break; } lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false; aqua1.Enabled = true; aqua2.Enabled = true; aqua3.Enabled = true; aqua1Update.Enabled = true; aqua2Update.Enabled = true; aqua3Update.Enabled = true; UurUpdate.Enabled = true; button1.Enabled = true; momenteleaanvraag.Enabled = true; timer1.Enabled = false;
}
}
//recbufTeller = 0; (als hier die andere in de cases verwijderen?)
//KB aanpassen van de knoppen + virtiem stuurt dit weer voor statusbox, (niet echt nodig) private void sockconnnected() { btnConnect.Enabled = false; btnDisconnect.Enabled = true; }
sockstatus("Connected");
//KB aanpassen van de knoppen + virtiem stuurt dit weer voor statusbox, (niet echt nodig) private void sockdisconnnected() { btnConnect.Enabled = true; btnDisconnect.Enabled = false; }
sockstatus("Disconnected");
//KB virtiem stuurt dit weer in statusbox, (niet echt nodig) private void sockstatus(string str) { if(statusBox!=null)statusBox.Items.Add("status> " + str); } #endregion
//KB wat zelf wordt verstuurt van de PDA naar de µC #region callfuncties, niet aanpasbaar, maar nu nog wel, later met codegenerator
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994
private void WaardenUpdate() // waarden van textvakken doorsturen { buf.AddFloat(Convert.ToSingle(TbTempMax.Text)); // // buf.AddFloat(Convert.ToSingle(TbTempMin.Text)); buf.AddFloat(Convert.ToSingle(TbPhMax.Text)); buf.AddFloat(Convert.ToSingle(TbPhMin.Text)); buf.AddFloat(Convert.ToSingle(TbNivMax.Text)); buf.AddFloat(Convert.ToSingle(TbNivMin.Text));
}
buf.AddInt32(Convert.ToInt32(TbUurAan.Text)); buf.AddInt32(Convert.ToInt32(TbUurUit.Text)); buf.AddInt32(Convert.ToInt32(TbMinAan.Text)); buf.AddInt32(Convert.ToInt32(TbMinUit.Text));
private void call_opvragenEen() // opvragen data aqua 1 { buf.Clear(); buf.AddInt32(1); // functienummer buf.AddInt32(90); // afsluit
}
try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false; }
private void call_opvragenTwee() // opvragen data aqua 2 { buf.Clear(); buf.AddInt32(2); buf.AddInt32(90); // afsluit
}
try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false; }
private void call_opvragenDrie() // opvragen data aqua 3 { buf.Clear(); buf.AddInt32(3); buf.AddInt32(90); // afsluit try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false; } } private void call_opvragenVier() // opvragen real time uur µC { buf.Clear(); buf.AddInt32(8); // functienummer
14
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068
buf.AddInt32(90); // afsluit
}
try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false; }
private void call_opvragenVijf() // opvragen van moentele meetwaarden { buf.Clear(); buf.AddInt32(9); // functienummer buf.AddInt32(90); // afsluit
}
try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false; }
private void call_updateEen() // data sturen voor aqua 1 { buf.Clear(); buf.AddInt32(4); //functienummer WaardenUpdate(); buf.AddInt32(90); // afsluit try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); } } private void call_updateTwee() // data sturen voor aqua 2 { buf.Clear(); buf.AddInt32(5); //functienummer WaardenUpdate(); buf.AddInt32(90); // afsluit try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); } } private void call_updateDrie() // data sturen voor aqua 3 { buf.Clear(); buf.AddInt32(6); //functienummer WaardenUpdate(); buf.AddInt32(90); // afsluit try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); } } private void call_updateUur() // data sturen voor klok { buf.Clear(); buf.AddInt32(7); //functienummer buf.AddInt32(DateTime.Now.Hour); buf.AddInt32(DateTime.Now.Minute);
15
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142
}
buf.AddInt32(DateTime.Now.Second); buf.AddInt32(90); // afsluit try { conn.Send(buf.Content); } catch { MessageBox.Show("Opgelet: eerst connecteren!"); }
#endregion //KB gewoon laten staan :) private void lblAbout_ParentChanged(object sender, System.EventArgs e) { } //KB gewoon laten staan :) private void virtiemTextbox1_TextChanged(object sender, System.EventArgs e) { }
//KB knoppen private void aqua1_Click(object sender, EventArgs e) // opvragen data aqua 1 { lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; statusBox.Items.Add("aqua 1 opvragen"); statusBox.Items.Add("Bezig met verwerking..."); ingelezenwaardenBox.Items.Clear(); aqua1.Enabled = false; aqua2.Enabled = false; aqua3.Enabled = false; aqua1Update.Enabled = false; aqua2Update.Enabled = false; aqua3Update.Enabled = false; UurUpdate.Enabled = false; button1.Enabled = false; momenteleaanvraag.Enabled = false; tijdVoorTimeOut = (Convert.ToInt32(DateTime.Now.Minute)); //test timer1.Enabled = true; call_opvragenEen();
}
this.lblAquanrSa.Text = "waarden van aquarium nr: 1"; this.lblAquanrSe.Text = "waarden van aquarium nr: 1";
private void aqua2_Click(object sender, EventArgs e) // opvragen data aqua 2 { lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; statusBox.Items.Add("aqua 2 opvragen"); statusBox.Items.Add("Bezig met verwerking..."); ingelezenwaardenBox.Items.Clear(); aqua1.Enabled = false; aqua2.Enabled = false; aqua3.Enabled = false; aqua1Update.Enabled = false; aqua2Update.Enabled = false; aqua3Update.Enabled = false; UurUpdate.Enabled = false; button1.Enabled = false; momenteleaanvraag.Enabled = false; tijdVoorTimeOut = (Convert.ToInt32(DateTime.Now.Minute)); //test timer1.Enabled = true;
16
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214
17
call_opvragenTwee();
}
this.lblAquanrSa.Text = "waarden van aquarium nr: 2"; this.lblAquanrSe.Text = "waarden van aquarium nr: 2";
private void aqua3_Click(object sender, EventArgs e) // opvragen data aqua 3 { lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; statusBox.Items.Add("aqua 3 opvragen"); statusBox.Items.Add("Bezig met verwerking..."); ingelezenwaardenBox.Items.Clear(); aqua1.Enabled = false; aqua2.Enabled = false; aqua3.Enabled = false; aqua1Update.Enabled = false; aqua2Update.Enabled = false; aqua3Update.Enabled = false; UurUpdate.Enabled = false; button1.Enabled = false; momenteleaanvraag.Enabled = false; tijdVoorTimeOut = (Convert.ToInt32(DateTime.Now.Minute)); //test timer1.Enabled = true; call_opvragenDrie();
}
this.lblAquanrSa.Text = "waarden van aquarium nr: 3"; this.lblAquanrSe.Text = "waarden van aquarium nr: 3";
private void button1_Click(object sender, EventArgs e) // uur opvragen voor controle { lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; statusBox.Items.Add("µC uur opvragen"); statusBox.Items.Add("Bezig met verwerking..."); textBox3.Text = ""; aqua1.Enabled = false; aqua2.Enabled = false; aqua3.Enabled = false; aqua1Update.Enabled = false; aqua2Update.Enabled = false; aqua3Update.Enabled = false; UurUpdate.Enabled = false; button1.Enabled = false; momenteleaanvraag.Enabled = false; tijdVoorTimeOut = (Convert.ToInt32(DateTime.Now.Minute)); //test timer1.Enabled = true; call_opvragenVier(); } private void momenteleaanvraag_Click(object sender, EventArgs e) // momentele waarden opvragen { lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; statusBox.Items.Add("momentele meetwaarden opvragen"); statusBox.Items.Add("Bezig met verwerking..."); momenteleWaardenBox.Items.Clear(); aqua1.Enabled = false; aqua2.Enabled = false; aqua3.Enabled = false; aqua1Update.Enabled = false; aqua2Update.Enabled = false;
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284
18
aqua3Update.Enabled = false; UurUpdate.Enabled = false; button1.Enabled = false; momenteleaanvraag.Enabled = false; tijdVoorTimeOut = (Convert.ToInt32(DateTime.Now.Minute)); //test timer1.Enabled = true; call_opvragenVijf(); } 1
private void aqua1Update_Click(object sender, EventArgs e) // update data aqua {
} 2
private void aqua2Update_Click(object sender, EventArgs e) // update data aqua {
} 3
lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; call_updateTwee(); statusBox.Items.Add("aqua 2 update"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false;
private void aqua3Update_Click(object sender, EventArgs e) // update data aqua {
} uur
lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; call_updateEen(); statusBox.Items.Add("aqua 1 update"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false;
lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; call_updateDrie(); statusBox.Items.Add("aqua 3 update"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false;
private void UurUpdate_Click(object sender, EventArgs e) // update real time {
}
lbBezigSa.Visible = true; lbBezigSe.Visible = true; lbBezigMo.Visible = true; call_updateUur(); statusBox.Items.Add("uur update"); lbBezigSa.Visible = false; lbBezigSe.Visible = false; lbBezigMo.Visible = false;
private void timer1_Tick(object sender, EventArgs e) { //als ontvangen langer duurt dan (3) minuten --> timeout if (tijdVoorTimeOut < 58)
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\frmMain.cs 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 } 1330
{
19
if ((DateTime.Now.Minute > tijdVoorTimeOut + 1)) { timer1.Enabled = false;
MessageBox.Show("Time Out: Programma wordt afgesloten."); // kaderke weergeven
}
}
conn.Close(); Application.Exit();
if (tijdVoorTimeOut == 58) { if (DateTime.Now.Minute == 0) { timer1.Enabled = false; MessageBox.Show("Time Out: Programma wordt afgesloten"); //kaderke
weergeven
}
}
conn.Close(); Application.Exit();
if (tijdVoorTimeOut == 59) { if (DateTime.Now.Minute == 1) { timer1.Enabled = false; MessageBox.Show("Time Out: Programma wordt afgesloten.."); // kaderke weergeven
} }
}
}
conn.Close(); Application.Exit();
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
using using using using using using using using
System; System.Data; System.Text; System.Collections; System.Net; System.Net.Sockets; System.Threading; System.IO.Ports;
namespace Virtiem { public class XdrConverter { /*Encoding/Decoding van een float: * * byte[] arr2= x1.EncodeFloat(-12.345F); * Console.Write(x1.DecodeFloat(arr2,0)); */ public float DecodeFloat(byte[] arrBuffer) //overload { return DecodeFloat(arrBuffer,0); } public float DecodeFloat(byte[] arrBuffer,int offset) { byte[] arrFloat= new byte[4]; //nog omkeren, want functie geeft niet de originele IEEE-notatie for(byte invertloop=0;invertloop<4;invertloop++) { arrFloat[3-invertloop] = arrBuffer[invertloop+offset]; } return System.BitConverter.ToSingle(arrFloat,0); } public byte[] EncodeFloat(float flValue) { byte[] arrBuffer = System.BitConverter.GetBytes(flValue); byte[] arrReturn= new byte[4]; //nog omkeren, want functie geeft niet de originele IEEE-notatie for(byte invertloop=0;invertloop<arrBuffer.Length;invertloop++) { arrReturn[3-invertloop] = arrBuffer[invertloop]; } }
return arrReturn;
/*Encoding/Decoding van een Int32:*/ public Int32 DecodeInt32(byte[] arrBuffer) //overload { return DecodeInt32(arrBuffer,0); } public Int32 DecodeInt32(byte[] arrBuffer,int offset) { if(offset<=arrBuffer.Length) { Int32 r=0; r+=( (Int32)arrBuffer[offset]) <<24; r+=( (Int32)arrBuffer[offset+1]) <<16; r+=( (Int32)arrBuffer[offset+2]) <<8 ; r+=( (Int32)arrBuffer[offset+3]) ; return r; } else return -1; }
1
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 75 76 public byte[] EncodeInt32(Int32 intValue) 77 { 78 byte[] arrBuffer = new byte[4]; 79 80 arrBuffer[0] = (byte)(intValue >> 24); 81 arrBuffer[1] = (byte)(intValue >> 16); 82 arrBuffer[2] = (byte)(intValue >> 8); 83 arrBuffer[3] = (byte) intValue; 84 85 return arrBuffer; 86 } 87 88 89 /* 90 * Encoding/Decoding van een String: 91 * 92 * byte[] arr2=x1.EncodeString("systemworks"); 93 * Console.Write("Lengte:" + arr2.Length + "\n"); 94 * foreach(byte item in arr2) 95 * { 96 * Console.Write(item); 97 * Console.Write("\n"); 98 * } 99 */ 100 public string DecodeString(byte[] arrBuffer)//overload 101 { 102 return DecodeString(arrBuffer,0); 103 } 104 105 public string DecodeString(byte[] arrBuffer,int offset) 106 { 107 byte[] charbytes = DecodeOpaque(arrBuffer,offset); 108 return System.Text.Encoding.ASCII.GetString(charbytes,0,charbytes.Length); 109 } 110 111 public byte[] EncodeString(string strValue) 112 { 113 114 byte[] charbytes = new byte[strValue.Length]; 115 charbytes = System.Text.Encoding.ASCII.GetBytes(strValue); 116 117 return EncodeOpaque(charbytes); 118 119 } 120 121 122 /*Encoding/Decoding van een opaque met variabele lengte: 123 * byte[] arr0= new byte[] {0x075,0x032,0x012,0x023}; 124 * byte[] arr1=x1.EncodeOpaque(arr0); 125 * byte[] arr2 = x1.DecodeOpaque(arr1,0); 126 * Console.Write("Lengte:" + arr2.Length + "\n"); 127 * foreach(byte item in arr2){ 128 * Console.Write(item + "\n"); 129 * } 130 */ 131 132 public byte[] DecodeOpaque(byte[] arrBuffer)//overload 133 { 134 return DecodeOpaque(arrBuffer,0); 135 } 136 137 public byte[] DecodeOpaque(byte[] arrBuffer,int offset) 138 { 139 140 Int32 datalength = this.DecodeInt32(arrBuffer,offset); 141 byte[] arrReturn = new byte[datalength]; 142 offset+=4; 143 144 Array.Copy(arrBuffer,offset, arrReturn,0, datalength); 145 146 return arrReturn; 147 148 }
2
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
public byte[] EncodeOpaque(byte[] arrBuffer) { byte[] lengthbyte = this.EncodeInt32(arrBuffer.Length); int endbytecount =0; if((arrBuffer.Length % 4)!=0)endbytecount = 4-(arrBuffer.Length % 4); int arraylength = lengthbyte.Length + arrBuffer.Length + endbytecount; byte[] arrReturn = new byte[arraylength]; Array.Copy(lengthbyte,0, arrReturn,0,lengthbyte.Length); Array.Copy(arrBuffer,0,arrReturn,lengthbyte.Length,arrBuffer.Length); return arrReturn; }
} public class Connection { protected System.Windows.Forms.Form Forumlier; public delegate void SockEvent(); public delegate void SockMessage(string message); public delegate void SockReceive(byte[] buffer); protected void Raise(SockEvent sck) { if(sck != null) sck(); } protected void Raise(SockMessage sck, string stream) { if(sck != null) sck(stream); } protected void Raise(SockReceive sck, byte[] buffer) { if(sck != null) sck(buffer); } public Socket mySocket; protected XdrConverter xdr = new XdrConverter(); protected byte[] functionByte = new byte[4]; public bool EscapeMode=true;
public class Buffer { protected static int MAXBUFFERLEN = 256; private XdrConverter xdr = new XdrConverter(); private byte[] myBuffer = new byte[MAXBUFFERLEN]; private Int32 myPointer=0; public byte[] Content { get { byte[] returnBuffer =new byte[myPointer];
3
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
}
}
Array.Copy(myBuffer,0,returnBuffer,0,myPointer); return returnBuffer;
public Buffer() { //constructor } public void Clear() { for(int l=0;l<MAXBUFFERLEN;l++)myBuffer[l]=0x00; myPointer=0; } public Int32 Size() { return myPointer; } public void AddInt32(Int32 integer) { byte[] myBuff = xdr.EncodeInt32(integer); myBuff.CopyTo(myBuffer,myPointer); myPointer+=myBuff.Length; } public void AddString(string str) { byte[] myBuff = xdr.EncodeString(str); myBuff.CopyTo(myBuffer,myPointer); myPointer+=myBuff.Length; } public void AddFloat(float fl) { byte[] myBuff = xdr.EncodeFloat(fl); myBuff.CopyTo(myBuffer,myPointer); myPointer+=myBuff.Length; } public void AddOpaque(byte[] arrBuffer) { byte[] myBuff = xdr.EncodeOpaque(arrBuffer); myBuff.CopyTo(myBuffer,myPointer); myPointer+=myBuff.Length; } }//einde buffer-klasse public virtual extern void Init(); public virtual extern void Connect(); public byte[] EscapeBuffer(byte[] arrBuffer) { int NumEscapeChars=0; int CurrentEscapeChars=0; for(int pointer=0;pointer<arrBuffer.Length;pointer++){ if(Convert.ToInt32(arrBuffer[pointer])==27)NumEscapeChars++; } byte[] returnBuffer = new byte[arrBuffer.Length + NumEscapeChars]; for(int pointer=0;pointer<arrBuffer.Length;pointer++) { if(Convert.ToInt32(arrBuffer[pointer])==27) {
4
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
} else { }
}
}
returnBuffer[pointer+ CurrentEscapeChars] = CurrentEscapeChars++; returnBuffer[pointer+ CurrentEscapeChars] =
arrBuffer[pointer];
returnBuffer[pointer+ CurrentEscapeChars] =
arrBuffer[pointer];
Convert.ToByte(27);
return returnBuffer;
} public class NetConnection: Connection { //private Thread thReceive; public event SockEvent OnDisconnected; public event SockEvent OnConnected; public event SockMessage OnStatusMessage; public event SockReceive OnReceive; protected protected protected protected
IPAddress myIPAddress; int myPort; IPEndPoint myEndPoint; bool IsDisposed;
virtual public string remoteIP { get{ return myIPAddress.ToString(); } set { myIPAddress = IPAddress.Parse(value); myEndPoint = new IPEndPoint( myIPAddress, myPort); } } virtual public int remotePort { get{ return myPort; } set { if(value>0)myPort = value; myEndPoint = new IPEndPoint( myIPAddress, myPort); } } protected byte[] ConnBuffer = new byte[256];
// Recieved data buffer
public NetConnection() //constructor { IsDisposed = true; } ~NetConnection() { if(!IsDisposed) { if (mySocket.Connected) mySocket.Shutdown( SocketShutdown.Both ); mySocket.Close(); } } public override void Connect() {
5
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
try {
if( mySocket != null && mySocket.Connected ) { this.Close(); }
//mySocket.Connect(myEndPoint); if(!IsDisposed) { mySocket.BeginConnect(myEndPoint, new AsyncCallback( OnConnect ), mySocket); //geef socket mee als async object } else { mySocket=null; //destroy socket Init(); mySocket.BeginConnect(myEndPoint, new AsyncCallback( OnConnect ), mySocket); //geef socket mee als async object } } catch( Exception e ) { base.Raise(OnStatusMessage,"Err_c:" + e.InnerException + e.Message); } } private void OnConnect( IAsyncResult ar ) { try { //mySocket.EndConnect( ar ); if( mySocket.Connected ) { SetupReceiveCallback(mySocket); base.Raise(OnConnected); } else { base.Raise(OnStatusMessage,"Connect failed"); }
}
} catch( Exception e ) { base.Raise(OnStatusMessage,"Abnormal error: " + e.Message); }
private void SetupReceiveCallback( Socket sock ) { try{ sock.BeginReceive(ConnBuffer, 0, ConnBuffer.Length, SocketFlags.None, new AsyncCallback( OnReceivedData ), sock ); } catch{ base.Raise(OnStatusMessage,"Setup Receive Callback failed!" ); } } private void SendCallback(IAsyncResult ar) { try { int bytesSent = mySocket.EndSend(ar); base.Raise(OnStatusMessage,bytesSent.ToString() + " bytes send"); }
6
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
}
7
catch { base.Raise(OnStatusMessage,"Send Callback failed!" ); }
private void OnReceivedData( IAsyncResult ar ) { try { if(mySocket.Connected && !IsDisposed) { int temp = mySocket.EndReceive(ar); if( temp > 0 ) { base.Raise(OnReceive, ConnBuffer); SetupReceiveCallback( mySocket );// If the connection is still usable restablish the callback } /*else{// If no data was recieved then the connection is probably dead mySocket.Close(); }*/ } } catch( Exception e ) { base.Raise(OnStatusMessage,"Rec_Err:" + e.Message); } } public void Close() { if (mySocket.Connected) mySocket.Shutdown( SocketShutdown.Both ); mySocket.Close(); IsDisposed=true; }
base.Raise(OnDisconnected);
public void Send(byte[] bufferout) { if(mySocket.Connected) { if(base.EscapeMode) { byte[] bufferEscaped = base.EscapeBuffer(bufferout); mySocket.BeginSend(bufferEscaped,0,bufferEscaped.Length,SocketFlags .None,null,null);//new AsyncCallback(SendCallback),mySocket);// new AsyncCallback( OnReceivedData ), mySocket ); } else { mySocket.BeginSend(bufferout,0,bufferout.Length,SocketFlags.None, null,null);//new AsyncCallback(SendCallback),mySocket);// new AsyncCallback( OnReceivedData ), mySocket ); } } else { Close(); } }
} public class SerialConnection : Connection {
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
8
//private Thread thReceive; public event SockEvent OnDisconnected; public event SockEvent OnConnected; public event SockMessage OnStatusMessage; public event SockReceive OnReceive; protected protected protected protected protected
IPAddress myIPAddress; int myPort; IPEndPoint myEndPoint; bool IsDisposed; SerialPort sport;
protected byte[] ConnBuffer = new byte[256];
// Recieved data buffer
public SerialConnection(System.Windows.Forms.Form F) //constructor { Forumlier = F; IsDisposed = true; } ~SerialConnection() { if (!IsDisposed) { if (mySocket.Connected) mySocket.Shutdown(SocketShutdown.Both); mySocket.Close(); } } public override void Connect() { sport = new SerialPort("COM8", 57600, Parity.None, 8, StopBits.One); sport.ReceivedBytesThreshold = 1; // change to 4 later sport.DataReceived += new SerialDataReceivedEventHandler(ReadData); this was first in Init() but it didn't work sport.Open(); //try { sport.Open(); } //catch {} base.Raise(OnConnected); } private void ReadData(Object sender,SerialDataReceivedEventArgs args) { // read data into buffer ConnBuffer[0] = (Byte)sport.ReadByte(); System.Console.WriteLine(ConnBuffer.Length); //base.Raise(OnReceive, ConnBuffer); Forumlier.Invoke(OnReceive, ConnBuffer); }
public void Close() { sport.Close(); base.Raise(OnDisconnected); } public void Send(byte[] bufferout) { sport.Write(bufferout,0,bufferout.Length); } public override void Init()
//
D:\BESTANDEN\EINDWERK\CODE\beginsel VB....\CompactClientv0.4\virtiem.cs 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 /* 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 */ 652 653 }
{
}
} public class TcpConnection: NetConnection { public TcpConnection() { Init(); } public override void Init() { mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); base.IsDisposed=false; } } public class UdpConnection: NetConnection //todo: testen & µC schrijven { public UdpConnection() { Init(); } public override void Init() { mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); base.IsDisposed=false; } } public class IrDaConnection: Connection { protected IrDAEndPoint myIREndPoint; protected byte[] myDeviceID; protected string myServiceName; protected Socket mySocket = new Socket(AddressFamily.Irda,SocketType.Stream, ProtocolType.Unspecified); public IrDaConnection() { this.Init(); } public override void Init() { myIREndPoint = new IrDAEndPoint(myDeviceID,myServiceName); } public override void Connect() { mySocket.Connect(myIREndPoint); } }
9
Kristof Booghmans
11.3
Draadloos embedded meetsysteem via Bluetooth
Schema, PCB en componentenlijst 11.3.1 Bluetooth IC
Fig 11.3.1a: copper top Bluetooth PCB
Fig 11.3.1b: copper bottom Bluetooth PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
102
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
11.3.2 Microcontrollerunit
Fig 11.3.2a: silkscreen top microcontrollerunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
103
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 11.3.2b: copper top microcontrollerunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
104
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 11.3.2c: copper bottom microcontrollerunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
105
0
1
2
3
A
4
5
B
10
11
12
13
14
10nF
C13
MAX88x
C14
U7_3V
U6_5V R2out R2in INVAL T2out T2in GND T1in VFORn C2R1outC2+ T1outC1R1in C1+ Vcc V+ FORf V+
E0 Vcc D0 E3 O0 D3 E1 O3 D1 E2 O1 D2 GND O2
SN74LS125AN C7
microcontroller en bluetooth print
BT2
B
10pF
R2out R2in INVAL T2out T2in GND T1in VFORn C2R1outC2+ T1outC1R1in C1+ Vcc V+ FORf V+
100nF
BT1
C11
100nF
U7
Kristof Booghmans
C12
DSUB9F
D
9
3_3v
U6 MAX323x
C
8
A
LBO LBI SETSTBY GND1 GND2 OUT IN
R2out R2in INVAL T2out T2in GND T1in VFORn C2R1outC2+ T1outC1R1in C1+ Vcc V+ FORf V+
PC
7
C10 100nF
C9 2.2uF
C8 100nF
6
J3
C
J5
C6 6.8pF
MAX323x HDR1X2
HDR1X10 HDR1X10 R15 56k Ω
MAX323x
R12 56k Ω
R11 56k Ω
R10 56k Ω
R14 56k Ω
R13 56k Ω
HDR2X5
U4 D
ANTENNA
100nF RJ45_1 E
E
HDR1X5
C2
VOEDING
J1
F
100nF
C1 R6 56k Ω
R5 56k Ω
R4 56k Ω
R9 56k Ω
R8 56k Ω
R7 56k Ω
HDR1X2
100nF
HDR1X8
U3
U1
RJ45_2
H
R3 56k Ω
HDR1X8
R2 56k Ω
OE O0 D0 D1 O1 O2 D2 D3 O3 GND
P1.0 Vcc P1.1 P0.0 P1.2 P0.1 P1.3 P0.2 P1.4 P0.3 P1.5 P0.4 P1.6 P0.5 P1.7 P0.6 RST P0.7 P3.0 Vpp P3.1 PRO P3.2 PSEN P3.3 P2.7 P3.4 P2.6 P3.5 P2.5 P3.6 P2.4 P3.7 P2.3 X2 P2.2 X1 P2.1 Vss P2.0
G
R1 56k Ω
RJ45_3
F
Vcc O7 D7 D6 O6 O5 D5 D4 O4 LE
G
C3
74F373E
100nF U2 IO3 IO4 IO5 IO6 IO7 CE A0 OE A1 A2 A3 A4 WE VCC
DS89C4x0 I
C5
1
CY62256
J
RELAIS
HDR1X8
0
I
X1 33pF HC-49/US_11MHz C4
HDR1X5
J
H
GND IO2 IO1 IO0 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5
33pF
2
3
4
5
6
7
8
9
10
11
12
13
14
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
11.3.3 Meetunit
Fig 11.3.3a: silkscreen top meetunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
107
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 11.3.3b: copper top meetunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
108
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 11.3.3b: copper bottom meetunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
109
0
1
2
3
4
5
6
7
Meetunit
8
Kristof Booghmans R7
A
C5 1uF-POL
TEMP
PH
U7 100M
CA3140EM
HDR1X3
B
U3
RJ45
V+ NC Dgnd1 REF2 NC NC Dgnd2 REF1 clockCH7 CS CH6 Din CH5 STRB CH4 NC CH3 Dout CH2 SHDN CH1 Agnd1CH0
C
C6 2.2nF
off1 NC I Vcc+ NI out Vccoff2
47k Ω
TL081P-SC6
R3 2.2k Ω
R4 4.7k Ω
C8 4.7uF-POL C9 10nF
R8
offset1 NC I IVcc+ NI Iout offset2 Vcc-
22M Ω
HDR1X2
A
47k Ω U2
R9 56k Ω
U8 POT_5K
C10 U6 POT_5K 50%
U9
R2 1.0k Ω
POT_100K
MAX1271_
D
C4
HDR1X8 R1 5.1 Ω
50% 2.2uF-POL
C3
C11
D
0.1uF-POL 4.7uF-POL 2.2uF-POL
U11 C2
C16
C15
C1 100nF
MAX88x
U10
U5
C12 1000uF-POL
1A Vcc 1B 4B 1Y 4A 2A 4Y 2B 3B 2Y 3A GND 3Y
100nF
100nF U1
R29 1.0k Ω
GND Vcc TRI DI OUT TH RES CV
555
G
D1 1N4007
C17 10nF C18 10nF
C21 1uF-POL
R26 2.2M Ω
R22 1.0M Ω
R20 2.2M Ω
R25 1.0M Ω
C19
C20
R27 2.2M Ω10nF
R21 2.2M Ω10nF
Q2
C13 1000uF-POL
POT_1K R28 1.0M Ω
BC550BP
100 Ω R18
74HC86
50%
F
Q1
100 Ω R17
LBO LBI SETSTBY GND1 GND2 OUT IN
2.2uF-POL
E
R23 2.2M Ω
BC550BP
R12 2.7k Ω
R13 820 Ω
R14 390 Ω
1
100 Ω R19
3
4
BC550BP
R24 2.2M Ω
5
R16 1.0k Ω
6
F
R15 220 Ω
C14 1000uF-POL
J1
2
E
Q3
HDR1X4 0
R11 100k Ω C
50% 2.2uF-POL C7
B
7
8
G
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
11.3.4 Relaisunit
Fig 11.3.4a: silkscreen top relaisunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
111
Kristof Booghmans
Draadloos embedded meetsysteem via Bluetooth
Fig 11.3.4b: copper top relaisunit PCB
Fig 11.3.4b: copper bottom relaisunit PCB
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
112
0
1
2
3
4
5
6
7
8
relais print
9
Kristof Booghmans A
A
R2
4.7k Ω
R3 1.0k Ω
D1 1N4007
X1
J2 R5
K
B
Q1
4.7k Ω
D3 1N4007
R6 1.0k Ω
J3 R8
K Q2
D2 RELAY_NONC HDR1X3
R1 220 Ω
X2
R9 1.0k Ω
X3
J4
K Q3
D4 RELAY_NONC HDR1X3
R4 220 Ω BC337
4.7k Ω
D5 1N4007
D6 RELAY_NONC HDR1X3
B
R7 220 Ω BC337
BC337
C
C
R11
4.7k Ω
R12 1.0k Ω
D7 1N4007
X4
J5 R14
K Q4
D
4.7k Ω
D9 1N4007
R15 1.0k Ω
J6 R17
K Q5
D8 RELAY_NONC HDR1X3
R10 220 Ω
X5
R18 1.0k Ω
X6
J7
K Q6
D10 RELAY_NONC HDR1X3
R13 220 Ω BC337
4.7k Ω
D11 1N4007
D12 RELAY_NONC HDR1X3
D
R16 220 Ω BC337
BC337
E
E
U1 Qb Vcc Qc Qa Qd SER Qe OE Qf rCLK QgsrCLK Qh CLR GND QH
F
F
SN74HC595N C1
J1 HDR1X5
100nF 0
1
2
3
4
5
6
7
8
9
Kristof Booghmans
11.4
Draadloos embedded meetsysteem via Bluetooth
Datasheets ( enkel op CD-ROM ) 11.4.1 11.4.2 11.4.3 11.4.4 11.4.5 11.4.6 11.4.7 11.4.8 11.4.9 11.4.10 11.4.11 11.4.12
SN74LS125 NE555 CA3140 TL081P 74HC86 SN74HC595 MAX1271 DS89C450 MAX882 – MAX883 MAX3235 – MAX3233 BC550 BC337
Eindwerk 2006-2007, opleiding Prof. Bach. Elektronica-ICT
114