CO2 Laser Water Flow Monitor - Arduino aangedreven / Windows Controlled (6 / 7 stap)

Stap 6: De Windows-Software...


De Windows-Software werd geschreven met behulp van Microsoft Visual Studio 2015 Update 1. Het is een native C++ MFC dialoogvenster gebaseerde toepassing gemaakt met de MFC-dialoogvenster wizard. De UI - het dialoogvenster is gemaakt met de resource editor. Het lichaam van de code wordt door de Wizard gegenereerd. Ik zal benadrukken dat alleen de onderdelen waaruit communicatie met de Arduino. De rest van de code is beschikbaar in de github hier:

https://github.com/alsliahona/CO2LaserWaterFlowMonitor/

Het vinden van de Arduino seriële "COM" haven

Nu dat we hebben grotendeels voorbij aan de dagen van MODEMs, is het niet gemeen hebben veel COM-poorten in gebruik op Windows-PC. Het is echter mogelijk dat u wellicht USB-apparaten zoals je Arduino waarmee een COM-poort als een seriële interface. We kunt opsommen en zo alle van de beschikbare COM-poorten op de PC eenvoudig met behulp van een for-lus die QueryDosDevice roept. Zodra we een lijst van de COM-poorten hebben kunnen we de lijst presenteren aan de gebruiker, waardoor ze te selecteren die hun water stroom monitor is. Als er slechts één item in de lijst kunnen wij het automatisch openen. Om te beginnen dan, voegen we een container aan de klasse CCO2WaterFlowDlg. Dit is op lijn 50 van CO2WaterFlowDlg.h, als een std::map van twee tekenreeksen. De eerste tekenreeks (de sleutel) is de COM-poort die we weergeven en openen. De andere tekenreeks is de apparaatnaam van DOS, die wij meestal voor diagnostiek houden.

De methode verklaard op lijn 54 wordt gebruikt voor het vullen van de container. Het is geïmplementeerd in CO2WaterFlowDlg.cpp, lijnen 70-78:

BuildCOMPortMap() wordt aangeroepen wanneer de toepassing wordt gestart en een exemplaar van de CCO2WaterFlowDlg is opgebouwd, zoals u op de bovenstaande regel 94 zien kunt. Op dit punt, zullen alle COM-apparaten op het systeem aanwezig in onze container.

Wanneer het dialoogvenster eerst initialiseert zal het controleren in OnInitDialog() om te zien of er COM-poorten beschikbaar zijn. Als dat niet het geval is, wordt een prompt getoond aan de gebruiker gevraagd hen aan plug-in de flow rate monitor. Dit bericht zal herhalen totdat de gebruiker op Annuleren klikt, of een COM-apparaat aanwezig is. Zie de lus op lijnen 146-155 hieronder:

De lijst met beschikbare apparaten wordt getoond in de drop-down lijst (ComboBox). Dit gebeurt wanneer RefreshCOMList() wordt aangeroepen op lijn 161 boven. De code voor dit is vrij standaard MFC-code voor het vullen van een ComboBox. Het is hieronder weergegeven:

Lijnen 296 via 301 duidelijke vermeldingen in de keuzelijst met invoervak, terwijl lijnen 304 via 309 elk item uit de container aan de keuzelijst met invoervak toevoegen. Een andere container, m_COMSelectionMap wordt gehandhaafd die de keuzelijst met invoervak ingang-id koppelt aan de COM-poort. Wanneer de gebruiker op Open klikt, zal dit dienen te trekken uit de naam van de COM-poort te openen.

Op lijn 310, is het laatste item toegevoegd aan de keuzelijst met invoervak geselecteerd.

Als er slechts één item is opgenomen in de lijst (lijn 312), wordt dat item wordt automatisch geopend door het simuleren van een gebruiker-Klik op de knop openen (lijn 316).

Openen van de COM-poort

Wanneer de gebruiker op de knop openen of wanneer OnBnClickedButtonOpen() wordt aangeroepen door de RefreshCOMList() wordt het momenteel geselecteerde item van de keuzelijst met invoervak gebruikt om de naam van de COM-poort (lijnen 221 en 222 hieronder) te verkrijgen:

Voor lijn wordt 223 bij poging gedaan om de seriële poort te openen. Als het niet de gebruiker lukt zal worden gevraagd en zal worden toegestaan om een nieuw item te selecteren. Als echter we met succes de COM-poort openen, regels 230-232 de knoppen Open en Scan poorten wordt uitgeschakeld en kunnen de drempel Set-knop. Zodra de COM-poort is geopend, een timer is in brand gestoken elke 1/8 van een seconde. De timer-handler gebruikt m_SerialPort om te lezen de laatste update (indien beschikbaar) van de Water Flow Monitor en de status weergegeven in het dialoogvenster worden bijgewerkt.

De ScanPorts knop doet niets meer dan opnieuw aanroepen BuildCOMPortMap() en RefreshCOMList().

De ArduinoSerial-klasse

De klasse ArduinoSerial behandelt alles in verband met het openen, sluiten, lezen, en schrijven naar de Arduino via de seriële poort. Het is speciaal ontworpen voor de Monitor Water stromen, maar kan gemakkelijk worden aangepast voor alternatieve behoeften. Dit is gedefinieerd in de ArdSerial.h als volgt:

Merk op dat de klasse zelf initialiseren omdat we niet willen om te proberen te openen van de COM-poort, totdat we wat u weten moet selecteren. Wanneer Close() heet wordt de COM-poort gesloten als m_hSerial wordt doorgegeven aan de CloseHandle(), en m_bConnected terug wordt ingesteld op false. Want dit een klasse van de RAII is, het zal automatisch opschonen (b.v. Sluit het handvat) wanneer de sloper wordt aangeroepen--dit wordt gedaan door te bellen naar Close().

We hebben eerder gezien waar de Open()-methode wordt aangeroepen in CCO2WaterFlowDlg.cpp de OnBnClickedButtonOpen() [223 lijn van CO2WaterFlowDlg.cpp]. U zult merken dat m_SerialPort is een exemplaar van ArduinoSerial zoals verklaard op lijn 52 van CO2WaterFlowDlg.h:

CreateFile en instelling COM-Parameters

Opening van het apparaat, zodra we de COM-poort weten is gewoon een kwestie van roepen CreateFile gevolgd door uitnodigingen aan GetCOMState en SetCOMState die de baud-rate en andere seriële parameters instellen. 26 tot 50 lijnen hieronder Toon de aanroep CreateFile en wordt de gebruiker-prompt op falen:

Met de open poort we verkrijgen de COM staat en aanpassen voor het gebruik van een 9600 baud-rate (voel je vrij om dit te veranderen als u zou willen, maar overeenkomen met de wijziging in uw Arduino schets!) Alle van de overige instellingen van de COM-poort wordt hieronder weergegeven. Hoewel het ziet als een heleboel code eruit, is er niet veel uit te leggen:

Let op de oproep om PurgeComm op lijn 87 en de slaap op regel 89. Everytime die u verbinding met de seriële poort van de Arduino maakt het apparaat wordt hersteld.

Lezen en schrijven naar/van de Arduino

Omdat wij doelbewust de communicatie van en naar de Arduino heel simpel gehouden hebben, de ArduinoSerial lezen en schrijven methoden zijn beperkt tot het lezen van een volledige, nul eindigende lijn van tekst en het schrijven van één byte. Je misschien hebt gemerkt de verklaring van onze leesbuffer op lijn 45 van ArdSerial.h, alsmede de prive-lid functie die readavailable() op lijn 47 verklaard. ReadAvailable wordt gebruikt voor het toevoegen van nieuwe gegevens uit de seriële poort aan onze buffer. Het kijkt als dit:

(Let op de opmerking over de lijn 124 is een overdracht van de Arduino Serial voorbeeld hier:

http://playground.arduino.cc/Interfacing/CPPWindows). Op regel 122 is een tijdelijke buffer de grootte van die wedstrijden de leesbare bytes gemeld door de aanroep ClearCommError op lijn 114 toegewezen. Op regel 126 worden die bytes gelezen in onze tijdelijke buffer (vArray). En op regels 131 tot 134 die bytes zijn toegevoegd aan de m_vBuffer.

ReadAvailable() wordt aangeroepen telkens die readnullzstring() heet en ReadNullZString gewoon de eerste op null eindigende tekenreeks in de buffer overdraagt aan de strRead van de uitvoer:

Wegschrijven naar de Arduino is zeer eenvoudig-- en dit is voor een groot deel omdat we alleen ooit nodig voor het verzenden van een enkele byte, gebruikt om de drempelwaarde te werken:

Koppelverkoop het terug naar de User Interface

De timer dat eerder werd genoemd, die elke 1/8 van een seconde vuurt noem m_Serial.ReadNullZString(). Wanneer een tekenreeks beschikbaar is zal vervolgens de tekenreeks parseren en bijwerken van de gebruikersinterface. Dit is gedeeltelijk hieronder weergegeven. (Blader de github code om te zien de rest van de code)

Een belangrijk ding om op te merken... De "stroomsnelheid" weergegeven is gebaseerd op de specificaties voor de flowsensor tarief. Als u een ander tarief flowsensor, passen de wiskunde op lijn 275 volgens specificaties van de sensor begint.

Instellen van de drempel

Het laatste ding om te dekken is hoe we de nieuwe drempel sturen naar de Arduino. Je hebt waarschijnlijk al geraden op basis van de bovenstaande code, dat we gewoon m_SerialPort.WriteByte() met de nieuwe drempel noemen. Je zou juist zijn. De code is erg eenvoudig zoals u hieronder kunt zien:

Op regel 329, is de drempelwaarde lezen van de UI, geconverteerd naar een BYTE op regel 330 en verzonden naar de Arduino op regel 331. U zult zich herinneren van de Arduino schets dat dit zal de hoofdlus onderbreken, de alarmdrempel aanpassen en de hoofdlus start.

Gerelateerde Artikelen

CO2 Laser Water Chiller

CO2 Laser Water Chiller

CO2 Laser Water ChillerCO2 Laser buizen worden gekoeld door lopen of pompen van water door de buis. Dit is nodig om het verlengt de levensduur van de buis die anders zou oververhit raken en snel de stroom uitvalt en uiteindelijk niet te bedienen. Dur
Arduino aangedreven servo control - Ik maakte het op TechShop

Arduino aangedreven servo control - Ik maakte het op TechShop

servo's zijn ongelooflijk handig in het maken van "dingen" verplaatsen. Maar om dat ding Beweeg je moet besturing van het een of andere manier. Gelukkig, arduino maakt dit ongelooflijk gemakkelijk te doen en kan gedaan worden met iets als een po
Hoe meet je CO2 laser zet een Laser Gravure Machine en Laser snijmachine met behulp van een vereenvoudigde (low-cost) CO2-laser power meter

Hoe meet je CO2 laser zet een Laser Gravure Machine en Laser snijmachine met behulp van een vereenvoudigde (low-cost) CO2-laser power meter

meest CO2 laser power meter zijn erg duur en zijn uitgerust met mogelijkheden tot ver buiten wat de gemeenschappelijke laser machine exploitant/eigenaar moet.  Deze instructies weergeven een sub-$100 laser power meter sonde op het werk, snelle laser
Acryl Fish Tank met Arduino aangedreven Feeder

Acryl Fish Tank met Arduino aangedreven Feeder

Heb je ooit wilde een meer handen op gevoel bij het ophalen van een vis? Of wilde iets anders dan de gemiddelde aquaria gevonden in de winkels? Dit aquarium is volledig aangepast en afgestemd op uw grootte kan worden gewijzigd en heeft een Arduino aa
Arduino-aangedreven A-10 stok grip externe w/Emergency Party Button!

Arduino-aangedreven A-10 stok grip externe w/Emergency Party Button!

ik Plama2002 de "Emergency Party Button" bouwen een tijdje terug kwam en wilde iets gelijkaardig voor mijn bar. Ik had ook een oude USAF B-8 stok greep uit een A-10A die ik in mijn vorige leven opgepikt. Ik dacht dat in plaats van gewoon een ges
Arduino aangedreven RC tank

Arduino aangedreven RC tank

dit is mijn eerste instructable dus neem aub met mij. Mijn naam is Stanley Deakins en ik heb gespeeld met elektronica al geruime tijd, al was het jaren geleden. Ik heb die passie weer op te rakelen vanwege mijn recente werk. Ik heb mijn handen op enk
Douche Monitor Arduino met LCD display

Douche Monitor Arduino met LCD display

Welkom! Voor onze milieu Capstone klasse (senior proefschrift) voor St. Olaf College bouwden we een monitor die doeltreffend op hoeveel water toezien zou maakt gebruik van een douche. Het idee achter deze water-monitor is dat als u een piezo transduc
2 Arduino aangedreven RC vliegtuig

2 Arduino aangedreven RC vliegtuig

Hallo, Welkom op mijn instructable op het opbouwen van een RC vliegtuig, volledig vanaf nul, met Arduino.Ik heb wilde een RC-vliegtuig te bouwen voor een tijdje, en de onderdelen voor gebouw voor ontvangen. De zender en ontvangers, echter, kunnen ext
CO2 laser dat plaatwerk snijdt

CO2 laser dat plaatwerk snijdt

Let op: Ik ben echt niet concurreren om te winnen van de laser, een t-shirt zou prima, bedankt.Ik zag de competitie en dacht dat het zou leuk om te pronken met mijn systeem.Inleiding. Het algemene idee van deze CO2-lasersysteem is dat een lichtbundel
Het gebruik van een 200 watt CO2 laser macht sonde voor het meten van CO2 laser macht

Het gebruik van een 200 watt CO2 laser macht sonde voor het meten van CO2 laser macht

deze video laat zien hoe u de Mahoney CO2 sonde voor de macht van de laser.  De CO2 sonde voor de macht van de laser is een algemeen gebruikte en noodzakelijk apparaat te:1. maatregel laser vermogen voor laser instellingen na verloop van tijd. Of u e
Het gebruik van een CO2-laser macht sonde voor het meten van laser uitgangsvermogen te vinden van een slechte spiegel

Het gebruik van een CO2-laser macht sonde voor het meten van laser uitgangsvermogen te vinden van een slechte spiegel

deze video laat zien hoe u de Mahoney CO2 sonde voor de macht van de laser.  De CO2 sonde voor de macht van de laser is een algemeen gebruikte en noodzakelijk apparaat te:1. maatregel laser vermogen voor laser instellingen na verloop van tijd. Of u e
Het gebruik van een 500 watt CO2 laser power meter sonde

Het gebruik van een 500 watt CO2 laser power meter sonde

deze video laat zien hoe u de Mahoney CO2 sonde voor de macht van de laser.  De CO2 sonde voor de macht van de laser is een algemeen gebruikte en noodzakelijk apparaat te:1. maatregel laser vermogen voor laser instellingen na verloop van tijd. Of u e
Ter vervanging van een CO2-laser-buis

Ter vervanging van een CO2-laser-buis

SAFETY FIRST - Lasers zijn gevaarlijk, ik ben ervan uitgaande dat u dit weet en je weet wat je doet met lasers en soldering strijkijzers. Nooit uitgeput een laser buis buiten de laser-chassis, nooit verslaan elke veiligheidssystemen voor uw laser cut
LinkIt One Tutorials - #8 DS18B20 één draad Water Temperatuur Monitor

LinkIt One Tutorials - #8 DS18B20 één draad Water Temperatuur Monitor

Voor deze tutorial ga ik om een water temperatuur monitor met behulp van een DS18B20.De DS18B20 is een apparaat van een draad. Één draad betekent dat het krijgt opdrachten van het controle-apparaat (in dit geval onze LinkIt een boord) en stuurt ze te