├── .gitattributes ├── .gitignore ├── Addendumv1.1.pdf ├── Arduino_ObservingConditions.sln ├── Arduino_ObservingConditions ├── ASCOM.ico ├── ASCOM.png ├── ASCOMDriverTemplate.snk ├── Arduino ObservingConditions Setup.iss ├── Arduino_ObservingConditions.csproj ├── Driver.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── ReadMe.pdf ├── Resources │ └── ASCOM.bmp ├── SetupDialogForm.cs ├── SetupDialogForm.designer.cs ├── SetupDialogForm.resx └── app.config ├── Arduino_Sketch └── WeatherStation │ └── WeatherStation.ino ├── Arduino_WeatherStation ├── Arduino_WeatherStation.csproj ├── Arduino_WeatherStation.ico ├── F6RIPAPHQF9H5IO.MEDIUM.ico ├── Form1.Designer.cs ├── Form1.cs ├── Form1.resx ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── app.config └── packages.config ├── Arduino_Weather_Station.pdf └── Installers ├── Arduino ObservingConditions Setup.exe └── Arduino_WeatherStation.msi /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | [Xx]64/ 19 | [Xx]86/ 20 | [Bb]uild/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | *.VC.db 84 | 85 | # Visual Studio profiler 86 | *.psess 87 | *.vsp 88 | *.vspx 89 | *.sap 90 | 91 | # TFS 2012 Local Workspace 92 | $tf/ 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | *.DotSettings.user 101 | 102 | # JustCode is a .NET coding add-in 103 | .JustCode 104 | 105 | # TeamCity is a build add-in 106 | _TeamCity* 107 | 108 | # DotCover is a Code Coverage Tool 109 | *.dotCover 110 | 111 | # NCrunch 112 | _NCrunch_* 113 | .*crunch*.local.xml 114 | nCrunchTemp_* 115 | 116 | # MightyMoose 117 | *.mm.* 118 | AutoTest.Net/ 119 | 120 | # Web workbench (sass) 121 | .sass-cache/ 122 | 123 | # Installshield output folder 124 | [Ee]xpress/ 125 | 126 | # DocProject is a documentation generator add-in 127 | DocProject/buildhelp/ 128 | DocProject/Help/*.HxT 129 | DocProject/Help/*.HxC 130 | DocProject/Help/*.hhc 131 | DocProject/Help/*.hhk 132 | DocProject/Help/*.hhp 133 | DocProject/Help/Html2 134 | DocProject/Help/html 135 | 136 | # Click-Once directory 137 | publish/ 138 | 139 | # Publish Web Output 140 | *.[Pp]ublish.xml 141 | *.azurePubxml 142 | 143 | # TODO: Un-comment the next line if you do not want to checkin 144 | # your web deploy settings because they may include unencrypted 145 | # passwords 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # NuGet Packages 150 | *.nupkg 151 | # The packages folder can be ignored because of Package Restore 152 | **/packages/* 153 | # except build/, which is used as an MSBuild target. 154 | !**/packages/build/ 155 | # Uncomment if necessary however generally it will be regenerated when needed 156 | #!**/packages/repositories.config 157 | # NuGet v3's project.json files produces more ignoreable files 158 | *.nuget.props 159 | *.nuget.targets 160 | 161 | # Microsoft Azure Build Output 162 | csx/ 163 | *.build.csdef 164 | 165 | # Microsoft Azure Emulator 166 | ecf/ 167 | rcf/ 168 | 169 | # Microsoft Azure ApplicationInsights config file 170 | ApplicationInsights.config 171 | 172 | # Windows Store app package directory 173 | AppPackages/ 174 | BundleArtifacts/ 175 | 176 | # Visual Studio cache files 177 | # files ending in .cache can be ignored 178 | *.[Cc]ache 179 | # but keep track of directories ending in .cache 180 | !*.[Cc]ache/ 181 | 182 | # Others 183 | ClientBin/ 184 | [Ss]tyle[Cc]op.* 185 | ~$* 186 | *~ 187 | *.dbmdl 188 | *.dbproj.schemaview 189 | *.pfx 190 | *.publishsettings 191 | node_modules/ 192 | orleans.codegen.cs 193 | 194 | # RIA/Silverlight projects 195 | Generated_Code/ 196 | 197 | # Backup & report files from converting an old project file 198 | # to a newer Visual Studio version. Backup files are not needed, 199 | # because we have git ;-) 200 | _UpgradeReport_Files/ 201 | Backup*/ 202 | UpgradeLog*.XML 203 | UpgradeLog*.htm 204 | 205 | # SQL Server files 206 | *.mdf 207 | *.ldf 208 | 209 | # Business Intelligence projects 210 | *.rdl.data 211 | *.bim.layout 212 | *.bim_*.settings 213 | 214 | # Microsoft Fakes 215 | FakesAssemblies/ 216 | 217 | # GhostDoc plugin setting file 218 | *.GhostDoc.xml 219 | 220 | # Node.js Tools for Visual Studio 221 | .ntvs_analysis.dat 222 | 223 | # Visual Studio 6 build log 224 | *.plg 225 | 226 | # Visual Studio 6 workspace options file 227 | *.opt 228 | 229 | # Visual Studio LightSwitch build output 230 | **/*.HTMLClient/GeneratedArtifacts 231 | **/*.DesktopClient/GeneratedArtifacts 232 | **/*.DesktopClient/ModelManifest.xml 233 | **/*.Server/GeneratedArtifacts 234 | **/*.Server/ModelManifest.xml 235 | _Pvt_Extensions 236 | 237 | # LightSwitch generated files 238 | GeneratedArtifacts/ 239 | ModelManifest.xml 240 | 241 | # Paket dependency manager 242 | .paket/paket.exe 243 | 244 | # FAKE - F# Make 245 | .fake/ 246 | /Arduino_ObservingConditions/Readme.txt 247 | -------------------------------------------------------------------------------- /Addendumv1.1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Addendumv1.1.pdf -------------------------------------------------------------------------------- /Arduino_ObservingConditions.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25420.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Arduino_ObservingConditions", "Arduino_ObservingConditions\Arduino_ObservingConditions.csproj", "{64308775-BD4A-469C-BCAB-3ED830B811AF}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Arduino_WeatherStation", "Arduino_WeatherStation\Arduino_WeatherStation.csproj", "{8E8D406C-1838-4914-867D-AB602D0EAF3E}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Debug|x86 = Debug|x86 14 | Release|Any CPU = Release|Any CPU 15 | Release|x86 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.ActiveCfg = Debug|Any CPU 21 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Debug|x86.Build.0 = Debug|Any CPU 22 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|Any CPU.Build.0 = Release|Any CPU 24 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.ActiveCfg = Release|Any CPU 25 | {64308775-BD4A-469C-BCAB-3ED830B811AF}.Release|x86.Build.0 = Release|Any CPU 26 | {8E8D406C-1838-4914-867D-AB602D0EAF3E}.Debug|Any CPU.ActiveCfg = Debug|x86 27 | {8E8D406C-1838-4914-867D-AB602D0EAF3E}.Debug|x86.ActiveCfg = Debug|x86 28 | {8E8D406C-1838-4914-867D-AB602D0EAF3E}.Debug|x86.Build.0 = Debug|x86 29 | {8E8D406C-1838-4914-867D-AB602D0EAF3E}.Release|Any CPU.ActiveCfg = Release|x86 30 | {8E8D406C-1838-4914-867D-AB602D0EAF3E}.Release|x86.ActiveCfg = Release|x86 31 | {8E8D406C-1838-4914-867D-AB602D0EAF3E}.Release|x86.Build.0 = Release|x86 32 | EndGlobalSection 33 | GlobalSection(SolutionProperties) = preSolution 34 | HideSolutionNode = FALSE 35 | EndGlobalSection 36 | EndGlobal 37 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/ASCOM.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_ObservingConditions/ASCOM.ico -------------------------------------------------------------------------------- /Arduino_ObservingConditions/ASCOM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_ObservingConditions/ASCOM.png -------------------------------------------------------------------------------- /Arduino_ObservingConditions/ASCOMDriverTemplate.snk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_ObservingConditions/ASCOMDriverTemplate.snk -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Arduino ObservingConditions Setup.iss: -------------------------------------------------------------------------------- 1 | ; 2 | ; Script generated by the ASCOM Driver Installer Script Generator 6.2.0.0 3 | ; Generated by Manoj Koushik on 2/23/2017 (UTC) 4 | ; 5 | [Setup] 6 | AppID={{1d285848-90b6-41e4-b647-47621cdd7925} 7 | AppName=Arduino ObservingConditions Driver 8 | AppVerName=Arduino ObservingConditions Driver 1.1 9 | AppVersion=1.1 10 | AppPublisher=Manoj Koushik 11 | AppPublisherURL=mailto:manoj.koushik@gmail.com 12 | AppSupportURL=http://tech.groups.yahoo.com/group/ASCOM-Talk/ 13 | AppUpdatesURL=http://ascom-standards.org/ 14 | VersionInfoVersion=1.0.0 15 | MinVersion=0,5.0.2195sp4 16 | DefaultDirName="{cf}\ASCOM\ObservingConditions" 17 | DisableDirPage=yes 18 | DisableProgramGroupPage=yes 19 | OutputDir="." 20 | OutputBaseFilename="Arduino ObservingConditions Setup" 21 | Compression=lzma 22 | SolidCompression=yes 23 | ; Put there by Platform if Driver Installer Support selected 24 | WizardImageFile="C:\Program Files (x86)\ASCOM\Platform 6 Developer Components\Installer Generator\Resources\WizardImage.bmp" 25 | LicenseFile="C:\Program Files (x86)\ASCOM\Platform 6 Developer Components\Installer Generator\Resources\CreativeCommons.txt" 26 | ; {cf}\ASCOM\Uninstall\ObservingConditions folder created by Platform, always 27 | UninstallFilesDir="{cf}\ASCOM\Uninstall\ObservingConditions\Arduino ObservingConditions" 28 | 29 | [Languages] 30 | Name: "english"; MessagesFile: "compiler:Default.isl" 31 | 32 | [Dirs] 33 | Name: "{cf}\ASCOM\Uninstall\ObservingConditions\Arduino ObservingConditions" 34 | ; TODO: Add subfolders below {app} as needed (e.g. Name: "{app}\MyFolder") 35 | 36 | [Files] 37 | Source: "C:\Users\manoj\Source\Repos\Arduino_ObservingConditions\Arduino_ObservingConditions\bin\Release\ASCOM.Arduino.ObservingConditions.dll"; DestDir: "{app}" 38 | ; Require a read-me HTML to appear after installation, maybe driver's Help doc 39 | Source: "C:\Users\manoj\Source\Repos\Arduino_ObservingConditions\Arduino_ObservingConditions\Readme.txt"; DestDir: "{app}"; Flags: isreadme 40 | ; TODO: Add other files needed by your driver here (add subfolders above) 41 | 42 | 43 | ; Only if driver is .NET 44 | [Run] 45 | ; Only for .NET assembly/in-proc drivers 46 | Filename: "{dotnet4032}\regasm.exe"; Parameters: "/codebase ""{app}\ASCOM.Arduino.ObservingConditions.dll"""; Flags: runhidden 32bit 47 | Filename: "{dotnet4064}\regasm.exe"; Parameters: "/codebase ""{app}\ASCOM.Arduino.ObservingConditions.dll"""; Flags: runhidden 64bit; Check: IsWin64 48 | 49 | 50 | 51 | 52 | ; Only if driver is .NET 53 | [UninstallRun] 54 | ; Only for .NET assembly/in-proc drivers 55 | Filename: "{dotnet4032}\regasm.exe"; Parameters: "-u ""{app}\ASCOM.Arduino.ObservingConditions.dll"""; Flags: runhidden 32bit 56 | ; This helps to give a clean uninstall 57 | Filename: "{dotnet4064}\regasm.exe"; Parameters: "/codebase ""{app}\ASCOM.Arduino.ObservingConditions.dll"""; Flags: runhidden 64bit; Check: IsWin64 58 | Filename: "{dotnet4064}\regasm.exe"; Parameters: "-u ""{app}\ASCOM.Arduino.ObservingConditions.dll"""; Flags: runhidden 64bit; Check: IsWin64 59 | 60 | 61 | 62 | 63 | [CODE] 64 | // 65 | // Before the installer UI appears, verify that the (prerequisite) 66 | // ASCOM Platform 6.2 or greater is installed, including both Helper 67 | // components. Utility is required for all types (COM and .NET)! 68 | // 69 | function InitializeSetup(): Boolean; 70 | var 71 | U : Variant; 72 | H : Variant; 73 | begin 74 | Result := FALSE; // Assume failure 75 | // check that the DriverHelper and Utilities objects exist, report errors if they don't 76 | try 77 | H := CreateOLEObject('DriverHelper.Util'); 78 | except 79 | MsgBox('The ASCOM DriverHelper object has failed to load, this indicates a serious problem with the ASCOM installation', mbInformation, MB_OK); 80 | end; 81 | try 82 | U := CreateOLEObject('ASCOM.Utilities.Util'); 83 | except 84 | MsgBox('The ASCOM Utilities object has failed to load, this indicates that the ASCOM Platform has not been installed correctly', mbInformation, MB_OK); 85 | end; 86 | try 87 | if (U.IsMinimumRequiredVersion(6,2)) then // this will work in all locales 88 | Result := TRUE; 89 | except 90 | end; 91 | if(not Result) then 92 | MsgBox('The ASCOM Platform 6.2 or greater is required for this driver.', mbInformation, MB_OK); 93 | end; 94 | 95 | // Code to enable the installer to uninstall previous versions of itself when a new version is installed 96 | procedure CurStepChanged(CurStep: TSetupStep); 97 | var 98 | ResultCode: Integer; 99 | UninstallExe: String; 100 | UninstallRegistry: String; 101 | begin 102 | if (CurStep = ssInstall) then // Install step has started 103 | begin 104 | // Create the correct registry location name, which is based on the AppId 105 | UninstallRegistry := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppId")}' + '_is1'); 106 | // Check whether an extry exists 107 | if RegQueryStringValue(HKLM, UninstallRegistry, 'UninstallString', UninstallExe) then 108 | begin // Entry exists and previous version is installed so run its uninstaller quietly after informing the user 109 | MsgBox('Setup will now remove the previous version.', mbInformation, MB_OK); 110 | Exec(RemoveQuotes(UninstallExe), ' /SILENT', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); 111 | sleep(1000); //Give enough time for the install screen to be repainted before continuing 112 | end 113 | end; 114 | end; 115 | 116 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Arduino_ObservingConditions.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | 9.0.30729 7 | 2.0 8 | {64308775-BD4A-469C-BCAB-3ED830B811AF} 9 | Library 10 | Properties 11 | ASCOM.Arduino 12 | ASCOM.Arduino.ObservingConditions 13 | 14 | 15 | 16 | 17 | 3.5 18 | v4.0 19 | ASCOM.ico 20 | true 21 | ASCOMDriverTemplate.snk 22 | publish\ 23 | true 24 | Disk 25 | false 26 | Foreground 27 | 7 28 | Days 29 | false 30 | false 31 | true 32 | 0 33 | 1.0.0.%2a 34 | false 35 | false 36 | true 37 | Client 38 | 39 | 40 | true 41 | full 42 | false 43 | bin\Debug\ 44 | DEBUG;TRACE 45 | prompt 46 | 4 47 | true 48 | AnyCPU 49 | 50 | 51 | pdbonly 52 | true 53 | bin\Release\ 54 | TRACE 55 | prompt 56 | 4 57 | AnyCPU 58 | false 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 3.5 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | True 85 | True 86 | Resources.resx 87 | 88 | 89 | True 90 | True 91 | Settings.settings 92 | 93 | 94 | Form 95 | 96 | 97 | SetupDialogForm.cs 98 | 99 | 100 | 101 | 102 | Designer 103 | ResXFileCodeGenerator 104 | Resources.Designer.cs 105 | 106 | 107 | SetupDialogForm.cs 108 | Designer 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | SettingsSingleFileGenerator 117 | Settings.Designer.cs 118 | 119 | 120 | 121 | 122 | 123 | 124 | False 125 | .NET Framework 3.5 SP1 Client Profile 126 | false 127 | 128 | 129 | False 130 | .NET Framework 3.5 SP1 131 | true 132 | 133 | 134 | False 135 | Windows Installer 3.1 136 | true 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 151 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Driver.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_ObservingConditions/Driver.cs -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | // 9 | // TODO - Add your authorship information here 10 | [assembly: AssemblyTitle("ASCOM.Arduino.ObservingConditions")] 11 | [assembly: AssemblyDescription("ASCOM ObservingConditions driver for Arduino")] 12 | [assembly: AssemblyConfiguration("")] 13 | [assembly: AssemblyCompany("The ASCOM Initiative")] 14 | [assembly: AssemblyProduct("ASCOM ObservingConditions driver for Arduino")] 15 | [assembly: AssemblyCopyright("Copyright © 2016 The ASCOM Initiative")] 16 | [assembly: AssemblyTrademark("")] 17 | [assembly: AssemblyCulture("")] 18 | 19 | // Setting ComVisible to false makes the types in this assembly not visible 20 | // to COM components. If you need to access a type in this assembly from 21 | // COM, set the ComVisible attribute to true on that type. 22 | [assembly: ComVisible(true)] 23 | 24 | // The following GUID is for the ID of the typelib if this project is exposed to COM 25 | [assembly: Guid("b42986b3-fa6b-458f-9847-bfcd36f9f881")] 26 | 27 | // Version information for an assembly consists of the following four values: 28 | // 29 | // Major Version 30 | // Minor Version 31 | // Build Number 32 | // Revision 33 | // 34 | // You can specify all the values or you can default the Revision and Build Numbers 35 | // by using the '*' as shown below: 36 | // 37 | // TODO - Set your driver's version here 38 | [assembly: AssemblyVersion("6.2.*")] 39 | [assembly: AssemblyFileVersion("6.2.0.0")] 40 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.18052 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ASCOM.Arduino.Properties 12 | { 13 | using System; 14 | 15 | 16 | /// 17 | /// A strongly-typed resource class, for looking up localized strings, etc. 18 | /// 19 | // This class was auto-generated by the StronglyTypedResourceBuilder 20 | // class via a tool like ResGen or Visual Studio. 21 | // To add or remove a member, edit your .ResX file then rerun ResGen 22 | // with the /str option, or rebuild your VS project. 23 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 24 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 25 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 26 | internal class Resources 27 | { 28 | 29 | private static global::System.Resources.ResourceManager resourceMan; 30 | 31 | private static global::System.Globalization.CultureInfo resourceCulture; 32 | 33 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 34 | internal Resources() 35 | { 36 | } 37 | 38 | /// 39 | /// Returns the cached ResourceManager instance used by this class. 40 | /// 41 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 42 | internal static global::System.Resources.ResourceManager ResourceManager 43 | { 44 | get 45 | { 46 | if (object.ReferenceEquals(resourceMan, null)) 47 | { 48 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Arduino.Properties.Resources", typeof(Resources).Assembly); 49 | resourceMan = temp; 50 | } 51 | return resourceMan; 52 | } 53 | } 54 | 55 | /// 56 | /// Overrides the current thread's CurrentUICulture property for all 57 | /// resource lookups using this strongly typed resource class. 58 | /// 59 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 60 | internal static global::System.Globalization.CultureInfo Culture 61 | { 62 | get 63 | { 64 | return resourceCulture; 65 | } 66 | set 67 | { 68 | resourceCulture = value; 69 | } 70 | } 71 | 72 | /// 73 | /// Looks up a localized resource of type System.Drawing.Bitmap. 74 | /// 75 | internal static System.Drawing.Bitmap ASCOM 76 | { 77 | get 78 | { 79 | object obj = ResourceManager.GetObject("ASCOM", resourceCulture); 80 | return ((System.Drawing.Bitmap)(obj)); 81 | } 82 | } 83 | 84 | /// 85 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). 86 | /// 87 | internal static System.Drawing.Icon DefaultIcon 88 | { 89 | get 90 | { 91 | object obj = ResourceManager.GetObject("DefaultIcon", resourceCulture); 92 | return ((System.Drawing.Icon)(obj)); 93 | } 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 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 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\ASCOM.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\ASCOM.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.18052 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ASCOM.Arduino.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/ReadMe.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_ObservingConditions/ReadMe.pdf -------------------------------------------------------------------------------- /Arduino_ObservingConditions/Resources/ASCOM.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_ObservingConditions/Resources/ASCOM.bmp -------------------------------------------------------------------------------- /Arduino_ObservingConditions/SetupDialogForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Drawing; 5 | using System.Runtime.InteropServices; 6 | using System.Text; 7 | using System.Windows.Forms; 8 | using ASCOM.Utilities; 9 | using ASCOM.Arduino; 10 | 11 | namespace ASCOM.Arduino 12 | { 13 | [ComVisible(false)] // Form not registered for COM! 14 | public partial class SetupDialogForm : Form 15 | { 16 | public SetupDialogForm() 17 | { 18 | InitializeComponent(); 19 | // Initialise current values of user settings from the ASCOM Profile 20 | InitUI(); 21 | } 22 | 23 | private void cmdOK_Click(object sender, EventArgs e) // OK button event handler 24 | { 25 | // Place any validation constraint checks here 26 | // Update the state variables with results from the dialogue 27 | ObservingConditions.comPort = (string)comboBoxComPort.SelectedItem; 28 | 29 | ObservingConditions.tl.Enabled = chkTrace.Checked; 30 | 31 | ObservingConditions.updateInterval = (int)numericUpDown1.Value; 32 | 33 | ObservingConditions.cloudySkies = float.Parse(textBox1.Text); 34 | ObservingConditions.clearSkies = float.Parse(textBox2.Text); 35 | ObservingConditions.cloudyCond = int.Parse(textBox6.Text); 36 | ObservingConditions.veryCloudyCond = int.Parse(textBox5.Text); 37 | 38 | ObservingConditions.nightVol = float.Parse(textBox4.Text); 39 | ObservingConditions.dayVol = float.Parse(textBox3.Text); 40 | 41 | ObservingConditions.nightLux = int.Parse(textBox10.Text); 42 | ObservingConditions.dayLux = int.Parse(textBox9.Text); 43 | 44 | ObservingConditions.twilightCond = int.Parse(textBox11.Text); 45 | ObservingConditions.daylightCond = int.Parse(textBox12.Text); 46 | 47 | ObservingConditions.windyCond = float.Parse(textBox8.Text); 48 | ObservingConditions.veryWindyCond = float.Parse(textBox7.Text); 49 | 50 | ObservingConditions.bwf = textBox13.Text; 51 | ObservingConditions.bwfEnabled = chkBWF.Checked; 52 | } 53 | 54 | private void cmdCancel_Click(object sender, EventArgs e) // Cancel button event handler 55 | { 56 | Close(); 57 | } 58 | 59 | private void BrowseToAscom(object sender, EventArgs e) // Click on ASCOM logo event handler 60 | { 61 | try 62 | { 63 | System.Diagnostics.Process.Start("http://ascom-standards.org/"); 64 | } 65 | catch (System.ComponentModel.Win32Exception noBrowser) 66 | { 67 | if (noBrowser.ErrorCode == -2147467259) 68 | MessageBox.Show(noBrowser.Message); 69 | } 70 | catch (System.Exception other) 71 | { 72 | MessageBox.Show(other.Message); 73 | } 74 | } 75 | 76 | private void InitUI() 77 | { 78 | chkTrace.Checked = ObservingConditions.tl.Enabled; 79 | // set the list of com ports to those that are currently available 80 | comboBoxComPort.Items.Clear(); 81 | comboBoxComPort.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); // use System.IO because it's static 82 | // select the current port if possible 83 | if (comboBoxComPort.Items.Contains(ObservingConditions.comPort)) 84 | { 85 | comboBoxComPort.SelectedItem = ObservingConditions.comPort; 86 | } 87 | 88 | textBox1.Text = ObservingConditions.cloudySkies.ToString(); 89 | textBox2.Text = ObservingConditions.clearSkies.ToString(); 90 | textBox6.Text = ObservingConditions.cloudyCond.ToString(); 91 | textBox5.Text = ObservingConditions.veryCloudyCond.ToString(); 92 | 93 | textBox4.Text = ObservingConditions.nightVol.ToString(); 94 | textBox3.Text = ObservingConditions.dayVol.ToString(); 95 | 96 | textBox10.Text = ObservingConditions.nightLux.ToString(); 97 | textBox9.Text = ObservingConditions.dayLux.ToString(); 98 | 99 | textBox11.Text = ObservingConditions.twilightCond.ToString(); 100 | textBox12.Text = ObservingConditions.daylightCond.ToString(); 101 | 102 | textBox8.Text = ObservingConditions.windyCond.ToString(); 103 | textBox7.Text = ObservingConditions.veryWindyCond.ToString(); 104 | 105 | textBox13.Text = ObservingConditions.bwf; 106 | 107 | chkBWF.Checked = ObservingConditions.bwfEnabled; 108 | 109 | 110 | } 111 | 112 | private void textBox13_Clicked(object sender, EventArgs e) 113 | { 114 | DialogResult result = folderBrowserDialog1.ShowDialog(); 115 | if (result == DialogResult.OK) 116 | textBox13.Text = folderBrowserDialog1.SelectedPath + "\\ArdinoBWF.txt"; 117 | } 118 | } 119 | } -------------------------------------------------------------------------------- /Arduino_ObservingConditions/SetupDialogForm.designer.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_ObservingConditions/SetupDialogForm.designer.cs -------------------------------------------------------------------------------- /Arduino_ObservingConditions/SetupDialogForm.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 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 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | -------------------------------------------------------------------------------- /Arduino_ObservingConditions/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Arduino_Sketch/WeatherStation/WeatherStation.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | Arduino based weather station implementing Ascom Observing Conditions 4 | 5 | Based on Arduino Uno, Sparkfun weather shield https://www.sparkfun.com/products/12081 6 | and Sparkfun weather meters: https://www.sparkfun.com/products/8942 7 | Also using Melexis 90614 IR Sensor for sky temperature and cloud detection 8 | 9 | Original sketch based on what was written by Nathan Seidle https://github.com/sparkfun/Weather_Shield 10 | 11 | Author: Manoj Koushik (manoj.koushik@gmail.com) 12 | Version: 1.1.0 13 | 14 | License: This code is public domain. Beers and a thank you are always welcome. 15 | 16 | */ 17 | 18 | #include //I2C needed for sensors 19 | #include //Pressure sensor - Search "SparkFun MPL3115" and install from Library Manager 20 | #include //Humidity sensor - Search "SparkFun HTU21D" and install from Library Manager 21 | #include // MLX90614 IR thermometer library https://github.com/sparkfun/SparkFun_MLX90614_Arduino_Library 22 | 23 | // Which Serial port on the leonardo? 24 | #define WRITE Serial 25 | #define READ Serial 26 | 27 | // Weather Objects to read sensors 28 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 29 | MPL3115A2 myPressure; //Create an instance of the pressure sensor 30 | HTU21D myHumidity; //Create an instance of the humidity sensor 31 | IRTherm myIRSkyTemp; // Create an IRTherm object called temp 32 | 33 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 34 | // Hardware pin definitions 35 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 36 | // digital I/O pins 37 | const byte WSPEED = 3; 38 | const byte RAIN = 2; 39 | const byte STAT1 = 7; 40 | const byte STAT2 = 8; 41 | 42 | // analog I/O pins 43 | const byte REFERENCE_3V3 = A3; 44 | const byte LIGHT = A1; 45 | const byte BATT = A2; 46 | const byte WDIR = A0; 47 | const byte RG11 = 8; 48 | const byte HDS10 = A5; 49 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 50 | // Constants 51 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 52 | const byte WINDGUST_MAX_PERIOD = 40; 53 | const byte WINDGUST_AVG_PERIOD = 3; 54 | const byte RAIN_PERIOD = 60; 55 | const byte SWITCH_BOUNCE = 10; 56 | const float RAIN_PER_INT = 0.011; 57 | const int MSECS_TO_SEC = 1000; 58 | const byte SECS_TO_MIN = 60; 59 | const byte MINS_TO_HOUR = 60; 60 | const float SPEED_PER_WINDCLICK = 1.492; 61 | 62 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 63 | // Global Variables to keep track of things 64 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 65 | // Various timers and indices 66 | long lastSecond; //The millis counter to see when a second rolls by 67 | byte seconds = 0; //When it hits 60, increase the current minute 68 | byte minutes = 0; //Keeps track of where we are in various arrays of data 69 | 70 | long lastWindCheck = 0; 71 | volatile long lastWindIRQ = 0; 72 | volatile byte windClicks = 0; 73 | 74 | // volatiles are subject to modification by IRQs 75 | volatile float rainHour[60]; //60 floating numbers to keep track of 60 minutes of rain 76 | volatile unsigned long raintime, rainlast, raininterval; 77 | 78 | float windspeed = 0; // [m/s instantaneous wind speed] 79 | float windgusts[40]; // Keep track of 3s windgusts over the last 2 minutes 80 | byte windgusts_index = 0; // Index to track wind gusts over the last two minutes 81 | float windgust_calc[WINDGUST_AVG_PERIOD - 1]; // keep the last 2 wind speeds (plus the current) to calculate windgust 82 | byte windgust_calc_index = 0; // Index to keep track of these 3 wind speeds 83 | 84 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 85 | //Interrupt routines (these are called by the hardware interrupts, not by the main code) 86 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 87 | void rainIRQ() 88 | // Count rain gauge bucket tips as they occur 89 | // Activated by the magnet and reed switch in the rain gauge, attached to input D2 90 | { 91 | raintime = millis(); // grab current time 92 | raininterval = raintime - rainlast; // calculate interval between this and last event 93 | 94 | if (raininterval > SWITCH_BOUNCE) // ignore switch-bounce glitches less than 10mS after initial edge 95 | { 96 | rainHour[minutes] += RAIN_PER_INT; //Increase this minute's amount of rain 97 | rainlast = raintime; // set up for next event 98 | } 99 | } 100 | 101 | void wspeedIRQ() 102 | // Activated by the magnet in the anemometer (2 ticks per rotation), attached to input D3 103 | { 104 | if (millis() - lastWindIRQ > SWITCH_BOUNCE) // Ignore switch-bounce glitches less than 10ms (142MPH max reading) after the reed switch closes 105 | { 106 | lastWindIRQ = millis(); //Grab the current time 107 | windClicks++; //There is 1.492MPH for each click per second. 108 | } 109 | } 110 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 111 | 112 | 113 | void setup() 114 | { 115 | Serial.begin(9600); 116 | 117 | pinMode(STAT1, OUTPUT); //Status LED Blue 118 | pinMode(STAT2, OUTPUT); //Status LED Green 119 | 120 | pinMode(WSPEED, INPUT_PULLUP); // input from wind meters windspeed sensor 121 | pinMode(RAIN, INPUT_PULLUP); // input from wind meters rain gauge sensor 122 | 123 | pinMode(REFERENCE_3V3, INPUT); 124 | pinMode(LIGHT, INPUT); 125 | 126 | pinMode(RG11, INPUT); // Hydreon RG11 for rain sensing. Remember to divide the voltage down before consuming as input 127 | pinMode(HDS10, INPUT); // HDS10 for condensation sensing 128 | 129 | //Configure the pressure sensor 130 | myPressure.begin(); // Get sensor online 131 | myPressure.setModeBarometer(); // Measure pressure in Pascals from 20 to 110 kPa 132 | myPressure.setOversampleRate(7); // Set Oversample to the recommended 128 133 | myPressure.enableEventFlags(); // Enable all three pressure and temp event flags 134 | 135 | //Configure the humidity sensor 136 | myHumidity.begin(); 137 | 138 | lastSecond = millis(); 139 | 140 | // attach external interrupt pins to IRQ functions 141 | attachInterrupt(0, rainIRQ, FALLING); 142 | attachInterrupt(1, wspeedIRQ, FALLING); 143 | 144 | myIRSkyTemp.begin(MLX90614_DEFAULT_ADDRESS); // Initialize I2C library and the MLX90614 145 | myIRSkyTemp.setUnit(TEMP_C); // Set units to Centigrade (alternatively TEMP_C or TEMP_K) 146 | 147 | // Zero out the arrays 148 | int i; 149 | for (i = 0; i < WINDGUST_MAX_PERIOD; i++) 150 | windgusts[i] = 0; 151 | 152 | for (i = 0; i < RAIN_PERIOD; i++) 153 | rainHour[i] = 0; 154 | 155 | for (i = 0; i < WINDGUST_AVG_PERIOD - 1; i++) 156 | windgust_calc[i] = 0; 157 | 158 | // turn on interrupts 159 | interrupts(); 160 | } 161 | 162 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 163 | // Commands for Action property of Ascom Driver 164 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 165 | 166 | void HumidityDescription() 167 | { 168 | WRITE.println("HTU21D"); 169 | } 170 | 171 | void PressureDescription() 172 | { 173 | WRITE.println("MPL3115A2"); 174 | } 175 | 176 | void SkyTemperatureDescription() 177 | { 178 | WRITE.println("MLX90614"); 179 | } 180 | 181 | void TemperatureDescription() 182 | { 183 | WRITE.println("MLX90614"); 184 | } 185 | 186 | void SkyBrightnessDescription() 187 | { 188 | WRITE.println("ALS-PT19"); 189 | } 190 | 191 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 192 | // Ascom command handlers 193 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 194 | void RainDetect() 195 | { 196 | // If not using hydreon sensor, then print 1 if rainHour[minutes] > 1 197 | WRITE.println(digitalRead(RG11)); 198 | } 199 | 200 | void CondensationDetect() 201 | { 202 | if (analogRead(HDS10) > 1000 || rainHour[minutes] > 0 || digitalRead(RG11) > 0) { 203 | WRITE.println("1"); 204 | } else { 205 | WRITE.println("0"); 206 | } 207 | } 208 | 209 | void Humidity() 210 | { 211 | WRITE.println(myHumidity.readHumidity(),5); 212 | } 213 | 214 | void Pressure() 215 | { 216 | WRITE.println(myPressure.readPressure(),5); 217 | } 218 | 219 | void RainRate() 220 | { 221 | float rainRate; 222 | 223 | for (int i = 0; i < RAIN_PERIOD; i++) 224 | rainRate += rainHour[i]; 225 | 226 | WRITE.println(rainRate,5); 227 | } 228 | 229 | void SkyBrightness() 230 | { 231 | WRITE.println(get_light_level(),5); 232 | } 233 | 234 | void SkyTemperature() 235 | { 236 | if (myIRSkyTemp.read()) // Read from the sensor 237 | { 238 | // If the read is successful: 239 | WRITE.println(myIRSkyTemp.object(),5); 240 | float irTempc = myIRSkyTemp.ambient(); // Get updated ambient temperature 241 | } else 242 | { 243 | WRITE.println(""); 244 | } 245 | } 246 | 247 | void Temperature() 248 | { 249 | if (myIRSkyTemp.read()) // Read from the sensor 250 | { 251 | // If the read is successful: 252 | WRITE.println(myIRSkyTemp.ambient(),5); 253 | } else 254 | { 255 | WRITE.println(""); 256 | } 257 | } 258 | 259 | void WindGust() 260 | { 261 | float peakwindgust = 0; 262 | 263 | for (int i = 0; i < WINDGUST_MAX_PERIOD; i++) 264 | if (windgusts[i] > peakwindgust) 265 | peakwindgust = windgusts[i]; 266 | 267 | WRITE.println(peakwindgust,5); 268 | } 269 | 270 | void WindSpeed() 271 | { 272 | WRITE.println(windspeed,5); 273 | } 274 | 275 | void WindDirection() 276 | { 277 | unsigned int winddir; 278 | 279 | unsigned int adc; 280 | 281 | adc = analogRead(WDIR); // get the current reading from the sensor 282 | 283 | // The following table is ADC readings for the wind direction sensor output, sorted from low to high. 284 | // Each threshold is the midpoint between adjacent headings. The output is degrees for that ADC reading. 285 | // Note that these are not in compass degree order! See Weather Meters datasheet for more information. 286 | //0,33k, 3.84v 287 | //22.5, 6.57k, 1.98v 288 | //45, 8.2k, 2.25v 289 | //67.5, 891, 0.41v 290 | //90, 1k, 0.45v 291 | //112.5, 688, 0.32v 292 | //135,2.2k, 0.90v 293 | //157.5, 1.41k, 0.62v 294 | //180 ,3.9k, 1.40v 295 | //202.5, 3.14k, 1.19v 296 | //225, 16k ,3.08v 297 | //247.5, 14.12k, 2.93v 298 | //270, 120k ,4.62v 299 | //292.5, 42.12k, 4.04v 300 | //315, 64.9k, 4.78v 301 | //337.5, 21.88k, 3.43v 302 | 303 | winddir = -1; 304 | if (adc < 990) winddir = 270; 305 | if (adc < 967) winddir = 315; 306 | if (adc < 940) winddir = 293; 307 | if (adc < 913) winddir = 0; 308 | if (adc < 878) winddir = 338; 309 | if (adc < 833) winddir = 225; 310 | if (adc < 801) winddir = 248; 311 | if (adc < 746) winddir = 45; 312 | if (adc < 680) winddir = 23; 313 | if (adc < 615) winddir = 180; 314 | if (adc < 551) winddir = 203; 315 | if (adc < 508) winddir = 135; 316 | if (adc < 456) winddir = 158; 317 | if (adc < 414) winddir = 90; 318 | if (adc < 393) winddir = 68; 319 | if (adc < 380) winddir = 113; 320 | 321 | if(winddir > 180) winddir -= 180; 322 | else winddir += 180; 323 | if (windspeed == 0) winddir = 0; 324 | WRITE.println(winddir,DEC); 325 | } 326 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 327 | 328 | 329 | void loop() 330 | { 331 | //Keep track of which minute it is 332 | if(millis() - lastSecond >= MSECS_TO_SEC) 333 | { 334 | lastSecond += MSECS_TO_SEC; 335 | 336 | // Calculate all weather readings 337 | // Calc rain 338 | calc_rain(); 339 | 340 | // Calc Wind 341 | calc_wind(); 342 | } 343 | 344 | String command = ""; 345 | if (READ.available() > 0) { 346 | command = READ.readStringUntil('\n'); 347 | if (command.equalsIgnoreCase("H")) { 348 | // Atmospheric humidity (%) 349 | Humidity(); 350 | } else if (command.equalsIgnoreCase("P")) { 351 | // Atmospheric presure at the observatory (Ascom needs hPa) 352 | // This must be the pressure at the observatory altitude and not the adjusted pressure at sea level. 353 | Pressure(); 354 | } else if (command.equalsIgnoreCase("RR")) { 355 | // Rain rate (Ascom needs mm/hour) 356 | // This property can be interpreted as 0.0 = Dry any positive nonzero value = wet. 357 | // Rainfall intensity is classified according to the rate of precipitation: 358 | // Light rain — when the precipitation rate is < 2.5 mm (0.098 in) per hour 359 | // Moderate rain — when the precipitation rate is between 2.5 mm (0.098 in) - 7.6 mm (0.30 in) or 10 mm (0.39 in) per hour 360 | // Heavy rain — when the precipitation rate is > 7.6 mm (0.30 in) per hour, or between 10 mm (0.39 in) and 50 mm (2.0 in) per hour 361 | // Violent rain — when the precipitation rate is > 50 mm (2.0 in) per hour 362 | RainRate(); 363 | } else if (command.equalsIgnoreCase("SB")) { 364 | // Sky brightness (Ascom needs Lux, but we are returning voltage. Ascom driver will have to be calibrated) 365 | // 0.0001 lux Moonless, overcast night sky (starlight) 366 | // 0.002 lux Moonless clear night sky with airglow 367 | // 0.27–1.0 lux Full moon on a clear night 368 | // 3.4 lux Dark limit of civil twilight under a clear sky 369 | // 50 lux Family living room lights (Australia, 1998) 370 | // 80 lux Office building hallway/toilet lighting 371 | // 100 lux Very dark overcast day 372 | // 320–500 lux Office lighting 373 | // 400 lux Sunrise or sunset on a clear day. 374 | // 1000 lux Overcast day; typical TV studio lighting 375 | // 10000–25000 lux Full daylight (not direct sun) 376 | // 32000–100000 lux Direct sunlight 377 | SkyBrightness(); 378 | } else if (command.equalsIgnoreCase("ST")) { 379 | // Sky temperature in °C 380 | SkyTemperature(); 381 | } else if (command.equalsIgnoreCase("T")) { 382 | // Temperature in °C 383 | Temperature(); 384 | } else if (command.equalsIgnoreCase("WD")) { 385 | // Wind direction (degrees, 0..360.0) 386 | // Value of 0.0 is returned when the wind speed is 0.0. 387 | // Wind direction is measured clockwise from north, through east, 388 | // where East=90.0, South=180.0, West=270.0 and North=360.0 389 | WindDirection(); 390 | } else if (command.equalsIgnoreCase("WG")) { 391 | // Wind gust (Ascom needs m/s) Peak 3 second wind speed over the last 2 minutes 392 | WindGust(); 393 | } else if (command.equalsIgnoreCase("WS")) { 394 | // Wind speed (Ascom needs m/s) 395 | WindSpeed(); 396 | } else if (command.equalsIgnoreCase("RD")) { 397 | // Rain Detect through Hydreon RG11 398 | RainDetect(); 399 | } else if (command.equalsIgnoreCase("CD")) { 400 | // Condensation Detect through HDS10 401 | CondensationDetect(); 402 | } else if (command.equalsIgnoreCase("HD")) { 403 | HumidityDescription(); 404 | } else if (command.equalsIgnoreCase("PD")) { 405 | PressureDescription(); 406 | } else if (command.equalsIgnoreCase("STD")) { 407 | SkyTemperatureDescription(); 408 | } else if (command.equalsIgnoreCase("TD")) { 409 | TemperatureDescription(); 410 | } else if (command.equalsIgnoreCase("SBD")) { 411 | SkyBrightnessDescription(); 412 | } else if (command.equalsIgnoreCase("PW")) { 413 | printWeather(); 414 | } 415 | } 416 | } 417 | 418 | void calc_rain() 419 | { 420 | if(++seconds >= SECS_TO_MIN) 421 | { 422 | seconds = 0; 423 | if(++minutes >= MINS_TO_HOUR) minutes = 0; 424 | rainHour[minutes] = 0; //Zero out this minute's rainfall amount 425 | } 426 | } 427 | 428 | void calc_wind() 429 | { 430 | 431 | 432 | // WindSpeed 433 | // Interrupt adds up the clicks. Each click is 1.492MPH of additional speed 434 | 435 | float deltaTime = millis() - lastWindCheck; //750ms 436 | lastWindCheck = millis(); 437 | 438 | deltaTime /= MSECS_TO_SEC; //Convert to seconds 439 | 440 | windspeed = (float)windClicks / deltaTime; //3 / 0.750s = 4 441 | windClicks = 0; //Reset and start watching for new wind 442 | 443 | windspeed *= SPEED_PER_WINDCLICK; //4 * 1.492 = 5.968MPH 444 | 445 | // To calculate windgust we keep a 2 minute rolling history of instantaneous wingusts 446 | // Ascom needs 3 second gust over 2 minutes 447 | 448 | // Figure out the average windspeed over the last 3 seconds 449 | // Current is available from above calculations 450 | // Pas two are in the array windgust_calc 451 | windgusts[windgusts_index] = windspeed; 452 | for (int i = 0; i < WINDGUST_AVG_PERIOD - 1; i++) 453 | windgusts[windgusts_index] += windgust_calc[i]; 454 | 455 | windgusts[windgusts_index] /= WINDGUST_AVG_PERIOD; 456 | 457 | // Store this windspeed in an array that covers 2 minutes 458 | windgust_calc[windgust_calc_index] = windspeed; 459 | 460 | // Increment the indices on a rolling dial basis 461 | windgust_calc_index = (windgust_calc_index + 1) % (WINDGUST_AVG_PERIOD - 1); 462 | windgusts_index = (windgusts_index + 1) % WINDGUST_MAX_PERIOD; 463 | } 464 | 465 | //Returns the voltage of the light sensor based on the 3.3V rail 466 | //This allows us to ignore what VCC might be (an Arduino plugged into USB has VCC of 4.5 to 5.2V) 467 | float get_light_level() 468 | { 469 | float operatingVoltage = analogRead(REFERENCE_3V3); 470 | 471 | float lightSensor = analogRead(LIGHT); 472 | 473 | operatingVoltage = 3.3 / operatingVoltage; //The reference voltage is 3.3V 474 | 475 | lightSensor = operatingVoltage * lightSensor; 476 | 477 | return(lightSensor); 478 | } 479 | 480 | void printWeather() 481 | { 482 | WRITE.println("*********************"); 483 | 484 | WRITE.print("H: "); 485 | Humidity(); 486 | 487 | WRITE.print("P: "); 488 | Pressure(); 489 | 490 | WRITE.print("RR: "); 491 | RainRate(); 492 | 493 | WRITE.print("SB: "); 494 | SkyBrightness(); 495 | 496 | WRITE.print("ST: "); 497 | SkyTemperature(); 498 | 499 | // Calc Temp 500 | WRITE.println("T:"); 501 | // Ambient from humidity sensor 502 | WRITE.print("->H: "); 503 | WRITE.println(myHumidity.readTemperature(),5); 504 | // Ambient from pressure sensor 505 | WRITE.print("->P: "); 506 | WRITE.println(myPressure.readTemp(),5); 507 | // Ambient from IR sensor 508 | WRITE.print("->IR: "); 509 | if (myIRSkyTemp.read()) // Read from the sensor 510 | { 511 | // If the read is successful: 512 | // Get updated ambient temperature 513 | WRITE.println(myIRSkyTemp.ambient()); 514 | } else 515 | { 516 | WRITE.println(""); 517 | } 518 | 519 | WRITE.print("WG: "); 520 | WindGust(); 521 | 522 | WRITE.print("WS: "); 523 | WindSpeed(); 524 | 525 | WRITE.print("WD: "); 526 | WindDirection(); 527 | 528 | WRITE.print("RD: "); 529 | RainDetect(); 530 | 531 | WRITE.print("CD: "); 532 | CondensationDetect(); 533 | WRITE.println("*********************"); 534 | } 535 | 536 | 537 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Arduino_WeatherStation.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | x86 6 | 8.0.30703 7 | 2.0 8 | {8E8D406C-1838-4914-867D-AB602D0EAF3E} 9 | WinExe 10 | Properties 11 | ASCOM.Arduino 12 | Arduino_WeatherStation 13 | v4.0 14 | 512 15 | 16 | 17 | 18 | x86 19 | true 20 | full 21 | false 22 | bin\Debug\ 23 | DEBUG;TRACE 24 | prompt 25 | 4 26 | 27 | 28 | x86 29 | pdbonly 30 | true 31 | bin\Release\ 32 | TRACE 33 | prompt 34 | 4 35 | 36 | 37 | Arduino_WeatherStation.ico 38 | 39 | 40 | 41 | 42 | 43 | ..\packages\OxyPlot.Core.1.0.0\lib\net40\OxyPlot.dll 44 | True 45 | 46 | 47 | ..\packages\OxyPlot.WindowsForms.1.0.0\lib\net40\OxyPlot.WindowsForms.dll 48 | True 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | Form 63 | 64 | 65 | Form1.cs 66 | 67 | 68 | 69 | 70 | Form1.cs 71 | 72 | 73 | ResXFileCodeGenerator 74 | Resources.Designer.cs 75 | Designer 76 | 77 | 78 | True 79 | Resources.resx 80 | True 81 | 82 | 83 | 84 | 85 | SettingsSingleFileGenerator 86 | Settings.Designer.cs 87 | 88 | 89 | True 90 | Settings.settings 91 | True 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 106 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Arduino_WeatherStation.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_WeatherStation/Arduino_WeatherStation.ico -------------------------------------------------------------------------------- /Arduino_WeatherStation/F6RIPAPHQF9H5IO.MEDIUM.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_WeatherStation/F6RIPAPHQF9H5IO.MEDIUM.ico -------------------------------------------------------------------------------- /Arduino_WeatherStation/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace ASCOM.Arduino 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 32 | this.tabControl1 = new System.Windows.Forms.TabControl(); 33 | this.tabPage1 = new System.Windows.Forms.TabPage(); 34 | this.label4 = new System.Windows.Forms.Label(); 35 | this.label3 = new System.Windows.Forms.Label(); 36 | this.label2 = new System.Windows.Forms.Label(); 37 | this.tempDiffPlot = new OxyPlot.WindowsForms.PlotView(); 38 | this.skyTempPlot = new OxyPlot.WindowsForms.PlotView(); 39 | this.tempPlot = new OxyPlot.WindowsForms.PlotView(); 40 | this.tabPage2 = new System.Windows.Forms.TabPage(); 41 | this.label7 = new System.Windows.Forms.Label(); 42 | this.label6 = new System.Windows.Forms.Label(); 43 | this.label5 = new System.Windows.Forms.Label(); 44 | this.windSpeedPlot = new OxyPlot.WindowsForms.PlotView(); 45 | this.windGustPlot = new OxyPlot.WindowsForms.PlotView(); 46 | this.windDirPlot = new OxyPlot.WindowsForms.PlotView(); 47 | this.tabPage3 = new System.Windows.Forms.TabPage(); 48 | this.label10 = new System.Windows.Forms.Label(); 49 | this.label9 = new System.Windows.Forms.Label(); 50 | this.label8 = new System.Windows.Forms.Label(); 51 | this.cloudsPlot = new OxyPlot.WindowsForms.PlotView(); 52 | this.brightnessPlot = new OxyPlot.WindowsForms.PlotView(); 53 | this.rainPlot = new OxyPlot.WindowsForms.PlotView(); 54 | this.tabPage5 = new System.Windows.Forms.TabPage(); 55 | this.label13 = new System.Windows.Forms.Label(); 56 | this.label12 = new System.Windows.Forms.Label(); 57 | this.label11 = new System.Windows.Forms.Label(); 58 | this.pressurePlot = new OxyPlot.WindowsForms.PlotView(); 59 | this.dewPtPlot = new OxyPlot.WindowsForms.PlotView(); 60 | this.humidityPlot = new OxyPlot.WindowsForms.PlotView(); 61 | this.tabPage4 = new System.Windows.Forms.TabPage(); 62 | this.pressureUnits = new System.Windows.Forms.GroupBox(); 63 | this.hectoPascals = new System.Windows.Forms.RadioButton(); 64 | this.kiloPascals = new System.Windows.Forms.RadioButton(); 65 | this.pascals = new System.Windows.Forms.RadioButton(); 66 | this.rainUnits = new System.Windows.Forms.GroupBox(); 67 | this.inHr = new System.Windows.Forms.RadioButton(); 68 | this.mmHr = new System.Windows.Forms.RadioButton(); 69 | this.windUnits = new System.Windows.Forms.GroupBox(); 70 | this.kph = new System.Windows.Forms.RadioButton(); 71 | this.mph = new System.Windows.Forms.RadioButton(); 72 | this.ms = new System.Windows.Forms.RadioButton(); 73 | this.label1 = new System.Windows.Forms.Label(); 74 | this.updateInterval = new System.Windows.Forms.NumericUpDown(); 75 | this.tempUnits = new System.Windows.Forms.GroupBox(); 76 | this.fahrenheit = new System.Windows.Forms.RadioButton(); 77 | this.centigrade = new System.Windows.Forms.RadioButton(); 78 | this.labelDriverId = new System.Windows.Forms.Label(); 79 | this.buttonConnect = new System.Windows.Forms.Button(); 80 | this.buttonChoose = new System.Windows.Forms.Button(); 81 | this.tabControl1.SuspendLayout(); 82 | this.tabPage1.SuspendLayout(); 83 | this.tabPage2.SuspendLayout(); 84 | this.tabPage3.SuspendLayout(); 85 | this.tabPage5.SuspendLayout(); 86 | this.tabPage4.SuspendLayout(); 87 | this.pressureUnits.SuspendLayout(); 88 | this.rainUnits.SuspendLayout(); 89 | this.windUnits.SuspendLayout(); 90 | ((System.ComponentModel.ISupportInitialize)(this.updateInterval)).BeginInit(); 91 | this.tempUnits.SuspendLayout(); 92 | this.SuspendLayout(); 93 | // 94 | // tabControl1 95 | // 96 | this.tabControl1.Appearance = System.Windows.Forms.TabAppearance.Buttons; 97 | this.tabControl1.Controls.Add(this.tabPage1); 98 | this.tabControl1.Controls.Add(this.tabPage2); 99 | this.tabControl1.Controls.Add(this.tabPage3); 100 | this.tabControl1.Controls.Add(this.tabPage5); 101 | this.tabControl1.Controls.Add(this.tabPage4); 102 | this.tabControl1.Location = new System.Drawing.Point(0, 8); 103 | this.tabControl1.Name = "tabControl1"; 104 | this.tabControl1.SelectedIndex = 0; 105 | this.tabControl1.Size = new System.Drawing.Size(1922, 1495); 106 | this.tabControl1.TabIndex = 3; 107 | // 108 | // tabPage1 109 | // 110 | this.tabPage1.Controls.Add(this.label4); 111 | this.tabPage1.Controls.Add(this.label3); 112 | this.tabPage1.Controls.Add(this.label2); 113 | this.tabPage1.Controls.Add(this.tempDiffPlot); 114 | this.tabPage1.Controls.Add(this.skyTempPlot); 115 | this.tabPage1.Controls.Add(this.tempPlot); 116 | this.tabPage1.Location = new System.Drawing.Point(4, 43); 117 | this.tabPage1.Name = "tabPage1"; 118 | this.tabPage1.Padding = new System.Windows.Forms.Padding(3); 119 | this.tabPage1.Size = new System.Drawing.Size(1914, 1448); 120 | this.tabPage1.TabIndex = 0; 121 | this.tabPage1.Text = "Temperature"; 122 | this.tabPage1.UseVisualStyleBackColor = true; 123 | // 124 | // label4 125 | // 126 | this.label4.AutoSize = true; 127 | this.label4.Location = new System.Drawing.Point(14, 957); 128 | this.label4.Name = "label4"; 129 | this.label4.Size = new System.Drawing.Size(58, 32); 130 | this.label4.TabIndex = 5; 131 | this.label4.Text = "Diff"; 132 | // 133 | // label3 134 | // 135 | this.label3.AutoSize = true; 136 | this.label3.Location = new System.Drawing.Point(14, 476); 137 | this.label3.Name = "label3"; 138 | this.label3.Size = new System.Drawing.Size(62, 32); 139 | this.label3.TabIndex = 4; 140 | this.label3.Text = "Sky"; 141 | // 142 | // label2 143 | // 144 | this.label2.AutoSize = true; 145 | this.label2.Location = new System.Drawing.Point(14, 8); 146 | this.label2.Name = "label2"; 147 | this.label2.Size = new System.Drawing.Size(120, 32); 148 | this.label2.TabIndex = 3; 149 | this.label2.Text = "Ambient"; 150 | // 151 | // tempDiffPlot 152 | // 153 | this.tempDiffPlot.Location = new System.Drawing.Point(20, 992); 154 | this.tempDiffPlot.Name = "tempDiffPlot"; 155 | this.tempDiffPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 156 | this.tempDiffPlot.Size = new System.Drawing.Size(1862, 435); 157 | this.tempDiffPlot.TabIndex = 2; 158 | this.tempDiffPlot.Text = "tempDifference"; 159 | this.tempDiffPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 160 | this.tempDiffPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 161 | this.tempDiffPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 162 | // 163 | // skyTempPlot 164 | // 165 | this.skyTempPlot.Location = new System.Drawing.Point(20, 511); 166 | this.skyTempPlot.Name = "skyTempPlot"; 167 | this.skyTempPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 168 | this.skyTempPlot.Size = new System.Drawing.Size(1862, 435); 169 | this.skyTempPlot.TabIndex = 1; 170 | this.skyTempPlot.Text = "skyTemperature"; 171 | this.skyTempPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 172 | this.skyTempPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 173 | this.skyTempPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 174 | // 175 | // tempPlot 176 | // 177 | this.tempPlot.Location = new System.Drawing.Point(20, 38); 178 | this.tempPlot.Name = "tempPlot"; 179 | this.tempPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 180 | this.tempPlot.Size = new System.Drawing.Size(1862, 435); 181 | this.tempPlot.TabIndex = 0; 182 | this.tempPlot.Text = "Temperature"; 183 | this.tempPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 184 | this.tempPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 185 | this.tempPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 186 | // 187 | // tabPage2 188 | // 189 | this.tabPage2.Controls.Add(this.label7); 190 | this.tabPage2.Controls.Add(this.label6); 191 | this.tabPage2.Controls.Add(this.label5); 192 | this.tabPage2.Controls.Add(this.windSpeedPlot); 193 | this.tabPage2.Controls.Add(this.windGustPlot); 194 | this.tabPage2.Controls.Add(this.windDirPlot); 195 | this.tabPage2.Location = new System.Drawing.Point(4, 43); 196 | this.tabPage2.Name = "tabPage2"; 197 | this.tabPage2.Padding = new System.Windows.Forms.Padding(3); 198 | this.tabPage2.Size = new System.Drawing.Size(1914, 1448); 199 | this.tabPage2.TabIndex = 1; 200 | this.tabPage2.Text = "Wind"; 201 | this.tabPage2.UseVisualStyleBackColor = true; 202 | // 203 | // label7 204 | // 205 | this.label7.AutoSize = true; 206 | this.label7.Location = new System.Drawing.Point(14, 957); 207 | this.label7.Name = "label7"; 208 | this.label7.Size = new System.Drawing.Size(147, 32); 209 | this.label7.TabIndex = 6; 210 | this.label7.Text = "Wind Gust"; 211 | // 212 | // label6 213 | // 214 | this.label6.AutoSize = true; 215 | this.label6.Location = new System.Drawing.Point(14, 476); 216 | this.label6.Name = "label6"; 217 | this.label6.Size = new System.Drawing.Size(200, 32); 218 | this.label6.TabIndex = 5; 219 | this.label6.Text = "Wind Direction"; 220 | // 221 | // label5 222 | // 223 | this.label5.AutoSize = true; 224 | this.label5.Location = new System.Drawing.Point(14, 8); 225 | this.label5.Name = "label5"; 226 | this.label5.Size = new System.Drawing.Size(170, 32); 227 | this.label5.TabIndex = 4; 228 | this.label5.Text = "Wind Speed"; 229 | // 230 | // windSpeedPlot 231 | // 232 | this.windSpeedPlot.Location = new System.Drawing.Point(20, 38); 233 | this.windSpeedPlot.Name = "windSpeedPlot"; 234 | this.windSpeedPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 235 | this.windSpeedPlot.Size = new System.Drawing.Size(1862, 435); 236 | this.windSpeedPlot.TabIndex = 3; 237 | this.windSpeedPlot.Text = "WindSpeed"; 238 | this.windSpeedPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 239 | this.windSpeedPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 240 | this.windSpeedPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 241 | // 242 | // windGustPlot 243 | // 244 | this.windGustPlot.Location = new System.Drawing.Point(20, 992); 245 | this.windGustPlot.Name = "windGustPlot"; 246 | this.windGustPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 247 | this.windGustPlot.Size = new System.Drawing.Size(1862, 435); 248 | this.windGustPlot.TabIndex = 2; 249 | this.windGustPlot.Text = "Wind Gust"; 250 | this.windGustPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 251 | this.windGustPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 252 | this.windGustPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 253 | // 254 | // windDirPlot 255 | // 256 | this.windDirPlot.Location = new System.Drawing.Point(20, 511); 257 | this.windDirPlot.Name = "windDirPlot"; 258 | this.windDirPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 259 | this.windDirPlot.Size = new System.Drawing.Size(1862, 435); 260 | this.windDirPlot.TabIndex = 1; 261 | this.windDirPlot.Text = "Wind Direction"; 262 | this.windDirPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 263 | this.windDirPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 264 | this.windDirPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 265 | // 266 | // tabPage3 267 | // 268 | this.tabPage3.Controls.Add(this.label10); 269 | this.tabPage3.Controls.Add(this.label9); 270 | this.tabPage3.Controls.Add(this.label8); 271 | this.tabPage3.Controls.Add(this.cloudsPlot); 272 | this.tabPage3.Controls.Add(this.brightnessPlot); 273 | this.tabPage3.Controls.Add(this.rainPlot); 274 | this.tabPage3.Location = new System.Drawing.Point(4, 43); 275 | this.tabPage3.Name = "tabPage3"; 276 | this.tabPage3.Padding = new System.Windows.Forms.Padding(3); 277 | this.tabPage3.Size = new System.Drawing.Size(1914, 1448); 278 | this.tabPage3.TabIndex = 2; 279 | this.tabPage3.Text = "Clouds, Rain & Sky Brightness"; 280 | this.tabPage3.UseVisualStyleBackColor = true; 281 | // 282 | // label10 283 | // 284 | this.label10.AutoSize = true; 285 | this.label10.Location = new System.Drawing.Point(14, 957); 286 | this.label10.Name = "label10"; 287 | this.label10.Size = new System.Drawing.Size(204, 32); 288 | this.label10.TabIndex = 9; 289 | this.label10.Text = "Sky Brightness"; 290 | // 291 | // label9 292 | // 293 | this.label9.AutoSize = true; 294 | this.label9.Location = new System.Drawing.Point(14, 476); 295 | this.label9.Name = "label9"; 296 | this.label9.Size = new System.Drawing.Size(74, 32); 297 | this.label9.TabIndex = 8; 298 | this.label9.Text = "Rain"; 299 | // 300 | // label8 301 | // 302 | this.label8.AutoSize = true; 303 | this.label8.Location = new System.Drawing.Point(14, 8); 304 | this.label8.Name = "label8"; 305 | this.label8.Size = new System.Drawing.Size(104, 32); 306 | this.label8.TabIndex = 7; 307 | this.label8.Text = "Clouds"; 308 | // 309 | // cloudsPlot 310 | // 311 | this.cloudsPlot.Location = new System.Drawing.Point(20, 38); 312 | this.cloudsPlot.Name = "cloudsPlot"; 313 | this.cloudsPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 314 | this.cloudsPlot.RightToLeft = System.Windows.Forms.RightToLeft.Yes; 315 | this.cloudsPlot.Size = new System.Drawing.Size(1862, 435); 316 | this.cloudsPlot.TabIndex = 6; 317 | this.cloudsPlot.Text = "Clouds"; 318 | this.cloudsPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 319 | this.cloudsPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 320 | this.cloudsPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 321 | // 322 | // brightnessPlot 323 | // 324 | this.brightnessPlot.Location = new System.Drawing.Point(20, 992); 325 | this.brightnessPlot.Name = "brightnessPlot"; 326 | this.brightnessPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 327 | this.brightnessPlot.Size = new System.Drawing.Size(1862, 435); 328 | this.brightnessPlot.TabIndex = 5; 329 | this.brightnessPlot.Text = "Sky Brightness"; 330 | this.brightnessPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 331 | this.brightnessPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 332 | this.brightnessPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 333 | // 334 | // rainPlot 335 | // 336 | this.rainPlot.Location = new System.Drawing.Point(20, 511); 337 | this.rainPlot.Name = "rainPlot"; 338 | this.rainPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 339 | this.rainPlot.Size = new System.Drawing.Size(1862, 435); 340 | this.rainPlot.TabIndex = 4; 341 | this.rainPlot.Text = "Rain"; 342 | this.rainPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 343 | this.rainPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 344 | this.rainPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 345 | // 346 | // tabPage5 347 | // 348 | this.tabPage5.Controls.Add(this.label13); 349 | this.tabPage5.Controls.Add(this.label12); 350 | this.tabPage5.Controls.Add(this.label11); 351 | this.tabPage5.Controls.Add(this.pressurePlot); 352 | this.tabPage5.Controls.Add(this.dewPtPlot); 353 | this.tabPage5.Controls.Add(this.humidityPlot); 354 | this.tabPage5.Location = new System.Drawing.Point(4, 43); 355 | this.tabPage5.Name = "tabPage5"; 356 | this.tabPage5.Padding = new System.Windows.Forms.Padding(3); 357 | this.tabPage5.Size = new System.Drawing.Size(1914, 1448); 358 | this.tabPage5.TabIndex = 4; 359 | this.tabPage5.Text = "Humidity & Pressure"; 360 | this.tabPage5.UseVisualStyleBackColor = true; 361 | // 362 | // label13 363 | // 364 | this.label13.AutoSize = true; 365 | this.label13.Location = new System.Drawing.Point(14, 957); 366 | this.label13.Name = "label13"; 367 | this.label13.Size = new System.Drawing.Size(128, 32); 368 | this.label13.TabIndex = 6; 369 | this.label13.Text = "Pressure"; 370 | // 371 | // label12 372 | // 373 | this.label12.AutoSize = true; 374 | this.label12.Location = new System.Drawing.Point(14, 476); 375 | this.label12.Name = "label12"; 376 | this.label12.Size = new System.Drawing.Size(144, 32); 377 | this.label12.TabIndex = 5; 378 | this.label12.Text = "Dew Point"; 379 | // 380 | // label11 381 | // 382 | this.label11.AutoSize = true; 383 | this.label11.Location = new System.Drawing.Point(14, 8); 384 | this.label11.Name = "label11"; 385 | this.label11.Size = new System.Drawing.Size(126, 32); 386 | this.label11.TabIndex = 4; 387 | this.label11.Text = "Humidity"; 388 | // 389 | // pressurePlot 390 | // 391 | this.pressurePlot.Location = new System.Drawing.Point(20, 992); 392 | this.pressurePlot.Name = "pressurePlot"; 393 | this.pressurePlot.PanCursor = System.Windows.Forms.Cursors.Hand; 394 | this.pressurePlot.Size = new System.Drawing.Size(1862, 435); 395 | this.pressurePlot.TabIndex = 3; 396 | this.pressurePlot.Text = "Pressure"; 397 | this.pressurePlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 398 | this.pressurePlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 399 | this.pressurePlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 400 | // 401 | // dewPtPlot 402 | // 403 | this.dewPtPlot.Location = new System.Drawing.Point(20, 511); 404 | this.dewPtPlot.Name = "dewPtPlot"; 405 | this.dewPtPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 406 | this.dewPtPlot.Size = new System.Drawing.Size(1862, 435); 407 | this.dewPtPlot.TabIndex = 2; 408 | this.dewPtPlot.Text = "Dew Point"; 409 | this.dewPtPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 410 | this.dewPtPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 411 | this.dewPtPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 412 | // 413 | // humidityPlot 414 | // 415 | this.humidityPlot.Location = new System.Drawing.Point(22, 38); 416 | this.humidityPlot.Name = "humidityPlot"; 417 | this.humidityPlot.PanCursor = System.Windows.Forms.Cursors.Hand; 418 | this.humidityPlot.Size = new System.Drawing.Size(1862, 435); 419 | this.humidityPlot.TabIndex = 1; 420 | this.humidityPlot.Text = "Humidity"; 421 | this.humidityPlot.ZoomHorizontalCursor = System.Windows.Forms.Cursors.SizeWE; 422 | this.humidityPlot.ZoomRectangleCursor = System.Windows.Forms.Cursors.SizeNWSE; 423 | this.humidityPlot.ZoomVerticalCursor = System.Windows.Forms.Cursors.SizeNS; 424 | // 425 | // tabPage4 426 | // 427 | this.tabPage4.Controls.Add(this.pressureUnits); 428 | this.tabPage4.Controls.Add(this.rainUnits); 429 | this.tabPage4.Controls.Add(this.windUnits); 430 | this.tabPage4.Controls.Add(this.label1); 431 | this.tabPage4.Controls.Add(this.updateInterval); 432 | this.tabPage4.Controls.Add(this.tempUnits); 433 | this.tabPage4.Controls.Add(this.labelDriverId); 434 | this.tabPage4.Controls.Add(this.buttonConnect); 435 | this.tabPage4.Controls.Add(this.buttonChoose); 436 | this.tabPage4.Location = new System.Drawing.Point(4, 43); 437 | this.tabPage4.Name = "tabPage4"; 438 | this.tabPage4.Padding = new System.Windows.Forms.Padding(3); 439 | this.tabPage4.Size = new System.Drawing.Size(1914, 1448); 440 | this.tabPage4.TabIndex = 3; 441 | this.tabPage4.Text = "Connection Settings"; 442 | this.tabPage4.UseVisualStyleBackColor = true; 443 | // 444 | // pressureUnits 445 | // 446 | this.pressureUnits.Controls.Add(this.hectoPascals); 447 | this.pressureUnits.Controls.Add(this.kiloPascals); 448 | this.pressureUnits.Controls.Add(this.pascals); 449 | this.pressureUnits.Location = new System.Drawing.Point(122, 291); 450 | this.pressureUnits.Name = "pressureUnits"; 451 | this.pressureUnits.Size = new System.Drawing.Size(1669, 100); 452 | this.pressureUnits.TabIndex = 7; 453 | this.pressureUnits.TabStop = false; 454 | this.pressureUnits.Text = "Pressure Units"; 455 | // 456 | // hectoPascals 457 | // 458 | this.hectoPascals.AutoSize = true; 459 | this.hectoPascals.Checked = true; 460 | this.hectoPascals.Location = new System.Drawing.Point(641, 32); 461 | this.hectoPascals.Name = "hectoPascals"; 462 | this.hectoPascals.Size = new System.Drawing.Size(233, 36); 463 | this.hectoPascals.TabIndex = 3; 464 | this.hectoPascals.TabStop = true; 465 | this.hectoPascals.Text = "Hecto Pascals"; 466 | this.hectoPascals.UseVisualStyleBackColor = true; 467 | // 468 | // kiloPascals 469 | // 470 | this.kiloPascals.AutoSize = true; 471 | this.kiloPascals.Location = new System.Drawing.Point(1130, 32); 472 | this.kiloPascals.Name = "kiloPascals"; 473 | this.kiloPascals.Size = new System.Drawing.Size(208, 36); 474 | this.kiloPascals.TabIndex = 2; 475 | this.kiloPascals.Text = "Kilo Pascals"; 476 | this.kiloPascals.UseVisualStyleBackColor = true; 477 | // 478 | // pascals 479 | // 480 | this.pascals.AutoSize = true; 481 | this.pascals.Location = new System.Drawing.Point(276, 37); 482 | this.pascals.Name = "pascals"; 483 | this.pascals.Size = new System.Drawing.Size(152, 36); 484 | this.pascals.TabIndex = 1; 485 | this.pascals.Text = "Pascals"; 486 | this.pascals.UseVisualStyleBackColor = true; 487 | // 488 | // rainUnits 489 | // 490 | this.rainUnits.Controls.Add(this.inHr); 491 | this.rainUnits.Controls.Add(this.mmHr); 492 | this.rainUnits.Location = new System.Drawing.Point(122, 489); 493 | this.rainUnits.Name = "rainUnits"; 494 | this.rainUnits.Size = new System.Drawing.Size(1669, 100); 495 | this.rainUnits.TabIndex = 7; 496 | this.rainUnits.TabStop = false; 497 | this.rainUnits.Text = "Rain Units"; 498 | // 499 | // inHr 500 | // 501 | this.inHr.AutoSize = true; 502 | this.inHr.Location = new System.Drawing.Point(928, 32); 503 | this.inHr.Name = "inHr"; 504 | this.inHr.Size = new System.Drawing.Size(112, 36); 505 | this.inHr.TabIndex = 3; 506 | this.inHr.Text = "in/Hr"; 507 | this.inHr.UseVisualStyleBackColor = true; 508 | // 509 | // mmHr 510 | // 511 | this.mmHr.AutoSize = true; 512 | this.mmHr.Checked = true; 513 | this.mmHr.Location = new System.Drawing.Point(552, 32); 514 | this.mmHr.Name = "mmHr"; 515 | this.mmHr.Size = new System.Drawing.Size(135, 36); 516 | this.mmHr.TabIndex = 2; 517 | this.mmHr.TabStop = true; 518 | this.mmHr.Text = "mm/Hr"; 519 | this.mmHr.UseVisualStyleBackColor = true; 520 | // 521 | // windUnits 522 | // 523 | this.windUnits.Controls.Add(this.kph); 524 | this.windUnits.Controls.Add(this.mph); 525 | this.windUnits.Controls.Add(this.ms); 526 | this.windUnits.Location = new System.Drawing.Point(122, 683); 527 | this.windUnits.Name = "windUnits"; 528 | this.windUnits.Size = new System.Drawing.Size(1669, 100); 529 | this.windUnits.TabIndex = 7; 530 | this.windUnits.TabStop = false; 531 | this.windUnits.Text = "Wind Units"; 532 | // 533 | // kph 534 | // 535 | this.kph.AutoSize = true; 536 | this.kph.Location = new System.Drawing.Point(668, 30); 537 | this.kph.Name = "kph"; 538 | this.kph.Size = new System.Drawing.Size(98, 36); 539 | this.kph.TabIndex = 6; 540 | this.kph.Text = "kph"; 541 | this.kph.UseVisualStyleBackColor = true; 542 | // 543 | // mph 544 | // 545 | this.mph.AutoSize = true; 546 | this.mph.Location = new System.Drawing.Point(1157, 30); 547 | this.mph.Name = "mph"; 548 | this.mph.Size = new System.Drawing.Size(107, 36); 549 | this.mph.TabIndex = 5; 550 | this.mph.Text = "mph"; 551 | this.mph.UseVisualStyleBackColor = true; 552 | // 553 | // ms 554 | // 555 | this.ms.AutoSize = true; 556 | this.ms.Checked = true; 557 | this.ms.Location = new System.Drawing.Point(303, 35); 558 | this.ms.Name = "ms"; 559 | this.ms.Size = new System.Drawing.Size(97, 36); 560 | this.ms.TabIndex = 4; 561 | this.ms.TabStop = true; 562 | this.ms.Text = "m/s"; 563 | this.ms.UseVisualStyleBackColor = true; 564 | // 565 | // label1 566 | // 567 | this.label1.AutoSize = true; 568 | this.label1.Location = new System.Drawing.Point(654, 892); 569 | this.label1.Name = "label1"; 570 | this.label1.Size = new System.Drawing.Size(207, 32); 571 | this.label1.TabIndex = 8; 572 | this.label1.Text = "Update Interval"; 573 | // 574 | // updateInterval 575 | // 576 | this.updateInterval.Location = new System.Drawing.Point(964, 886); 577 | this.updateInterval.Maximum = new decimal(new int[] { 578 | 120, 579 | 0, 580 | 0, 581 | 0}); 582 | this.updateInterval.Minimum = new decimal(new int[] { 583 | 5, 584 | 0, 585 | 0, 586 | 0}); 587 | this.updateInterval.Name = "updateInterval"; 588 | this.updateInterval.Size = new System.Drawing.Size(148, 38); 589 | this.updateInterval.TabIndex = 7; 590 | this.updateInterval.Value = new decimal(new int[] { 591 | 15, 592 | 0, 593 | 0, 594 | 0}); 595 | // 596 | // tempUnits 597 | // 598 | this.tempUnits.Controls.Add(this.fahrenheit); 599 | this.tempUnits.Controls.Add(this.centigrade); 600 | this.tempUnits.Location = new System.Drawing.Point(122, 66); 601 | this.tempUnits.Name = "tempUnits"; 602 | this.tempUnits.Size = new System.Drawing.Size(1669, 100); 603 | this.tempUnits.TabIndex = 6; 604 | this.tempUnits.TabStop = false; 605 | this.tempUnits.Text = "Temperature Units"; 606 | // 607 | // fahrenheit 608 | // 609 | this.fahrenheit.AutoSize = true; 610 | this.fahrenheit.Location = new System.Drawing.Point(842, 37); 611 | this.fahrenheit.Name = "fahrenheit"; 612 | this.fahrenheit.Size = new System.Drawing.Size(189, 36); 613 | this.fahrenheit.TabIndex = 1; 614 | this.fahrenheit.Text = "Fahrenheit"; 615 | this.fahrenheit.UseVisualStyleBackColor = true; 616 | // 617 | // centigrade 618 | // 619 | this.centigrade.AutoSize = true; 620 | this.centigrade.Checked = true; 621 | this.centigrade.Location = new System.Drawing.Point(466, 37); 622 | this.centigrade.Name = "centigrade"; 623 | this.centigrade.Size = new System.Drawing.Size(192, 36); 624 | this.centigrade.TabIndex = 0; 625 | this.centigrade.TabStop = true; 626 | this.centigrade.Text = "Centigrade"; 627 | this.centigrade.UseVisualStyleBackColor = true; 628 | // 629 | // labelDriverId 630 | // 631 | this.labelDriverId.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 632 | this.labelDriverId.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::ASCOM.Arduino.Properties.Settings.Default, "DriverId", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 633 | this.labelDriverId.Location = new System.Drawing.Point(122, 1009); 634 | this.labelDriverId.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0); 635 | this.labelDriverId.Name = "labelDriverId"; 636 | this.labelDriverId.Size = new System.Drawing.Size(1669, 47); 637 | this.labelDriverId.TabIndex = 5; 638 | this.labelDriverId.Text = global::ASCOM.Arduino.Properties.Settings.Default.DriverId; 639 | this.labelDriverId.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 640 | // 641 | // buttonConnect 642 | // 643 | this.buttonConnect.Location = new System.Drawing.Point(1252, 1149); 644 | this.buttonConnect.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); 645 | this.buttonConnect.Name = "buttonConnect"; 646 | this.buttonConnect.Size = new System.Drawing.Size(548, 131); 647 | this.buttonConnect.TabIndex = 4; 648 | this.buttonConnect.Text = "Connect"; 649 | this.buttonConnect.UseVisualStyleBackColor = true; 650 | this.buttonConnect.Click += new System.EventHandler(this.buttonConnect_Click); 651 | // 652 | // buttonChoose 653 | // 654 | this.buttonChoose.Location = new System.Drawing.Point(131, 1149); 655 | this.buttonChoose.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); 656 | this.buttonChoose.Name = "buttonChoose"; 657 | this.buttonChoose.Size = new System.Drawing.Size(548, 131); 658 | this.buttonChoose.TabIndex = 3; 659 | this.buttonChoose.Text = "Choose"; 660 | this.buttonChoose.UseVisualStyleBackColor = true; 661 | this.buttonChoose.Click += new System.EventHandler(this.buttonChoose_Click); 662 | // 663 | // Form1 664 | // 665 | this.AutoScaleDimensions = new System.Drawing.SizeF(16F, 31F); 666 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 667 | this.AutoSize = true; 668 | this.ClientSize = new System.Drawing.Size(1934, 1502); 669 | this.Controls.Add(this.tabControl1); 670 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 671 | this.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); 672 | this.Name = "Form1"; 673 | this.Text = "Arduino Weather Station"; 674 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); 675 | this.tabControl1.ResumeLayout(false); 676 | this.tabPage1.ResumeLayout(false); 677 | this.tabPage1.PerformLayout(); 678 | this.tabPage2.ResumeLayout(false); 679 | this.tabPage2.PerformLayout(); 680 | this.tabPage3.ResumeLayout(false); 681 | this.tabPage3.PerformLayout(); 682 | this.tabPage5.ResumeLayout(false); 683 | this.tabPage5.PerformLayout(); 684 | this.tabPage4.ResumeLayout(false); 685 | this.tabPage4.PerformLayout(); 686 | this.pressureUnits.ResumeLayout(false); 687 | this.pressureUnits.PerformLayout(); 688 | this.rainUnits.ResumeLayout(false); 689 | this.rainUnits.PerformLayout(); 690 | this.windUnits.ResumeLayout(false); 691 | this.windUnits.PerformLayout(); 692 | ((System.ComponentModel.ISupportInitialize)(this.updateInterval)).EndInit(); 693 | this.tempUnits.ResumeLayout(false); 694 | this.tempUnits.PerformLayout(); 695 | this.ResumeLayout(false); 696 | 697 | } 698 | 699 | #endregion 700 | 701 | private System.Windows.Forms.TabControl tabControl1; 702 | private System.Windows.Forms.TabPage tabPage1; 703 | private System.Windows.Forms.TabPage tabPage2; 704 | private System.Windows.Forms.TabPage tabPage3; 705 | private System.Windows.Forms.TabPage tabPage4; 706 | private System.Windows.Forms.Label labelDriverId; 707 | private System.Windows.Forms.Button buttonConnect; 708 | private System.Windows.Forms.Button buttonChoose; 709 | private System.Windows.Forms.TabPage tabPage5; 710 | private OxyPlot.WindowsForms.PlotView tempDiffPlot; 711 | private OxyPlot.WindowsForms.PlotView skyTempPlot; 712 | private OxyPlot.WindowsForms.PlotView tempPlot; 713 | private OxyPlot.WindowsForms.PlotView windSpeedPlot; 714 | private OxyPlot.WindowsForms.PlotView windGustPlot; 715 | private OxyPlot.WindowsForms.PlotView windDirPlot; 716 | private OxyPlot.WindowsForms.PlotView pressurePlot; 717 | private OxyPlot.WindowsForms.PlotView dewPtPlot; 718 | private OxyPlot.WindowsForms.PlotView humidityPlot; 719 | private OxyPlot.WindowsForms.PlotView cloudsPlot; 720 | private OxyPlot.WindowsForms.PlotView brightnessPlot; 721 | private OxyPlot.WindowsForms.PlotView rainPlot; 722 | private System.Windows.Forms.GroupBox pressureUnits; 723 | private System.Windows.Forms.RadioButton hectoPascals; 724 | private System.Windows.Forms.RadioButton kiloPascals; 725 | private System.Windows.Forms.RadioButton pascals; 726 | private System.Windows.Forms.GroupBox rainUnits; 727 | private System.Windows.Forms.RadioButton inHr; 728 | private System.Windows.Forms.RadioButton mmHr; 729 | private System.Windows.Forms.GroupBox windUnits; 730 | private System.Windows.Forms.RadioButton kph; 731 | private System.Windows.Forms.RadioButton mph; 732 | private System.Windows.Forms.RadioButton ms; 733 | private System.Windows.Forms.Label label1; 734 | private System.Windows.Forms.NumericUpDown updateInterval; 735 | private System.Windows.Forms.GroupBox tempUnits; 736 | private System.Windows.Forms.RadioButton fahrenheit; 737 | private System.Windows.Forms.RadioButton centigrade; 738 | private System.Windows.Forms.Label label4; 739 | private System.Windows.Forms.Label label3; 740 | private System.Windows.Forms.Label label2; 741 | private System.Windows.Forms.Label label7; 742 | private System.Windows.Forms.Label label6; 743 | private System.Windows.Forms.Label label5; 744 | private System.Windows.Forms.Label label8; 745 | private System.Windows.Forms.Label label10; 746 | private System.Windows.Forms.Label label9; 747 | private System.Windows.Forms.Label label13; 748 | private System.Windows.Forms.Label label12; 749 | private System.Windows.Forms.Label label11; 750 | } 751 | } 752 | 753 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Form1.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | using OxyPlot; 4 | using OxyPlot.Series; 5 | using OxyPlot.WindowsForms; 6 | using System.Threading; 7 | 8 | 9 | namespace ASCOM.Arduino 10 | { 11 | public partial class Form1 : Form 12 | { 13 | private ASCOM.DriverAccess.ObservingConditions driver; 14 | private System.Threading.Thread t; 15 | private bool graphThreadRun = false; 16 | private bool graphThreadRunning = false; 17 | public Form1() 18 | { 19 | InitializeComponent(); 20 | SetUIState(); 21 | } 22 | private void updateGraphs() 23 | { 24 | // Set the run flag to true 25 | graphThreadRunning = true; 26 | 27 | 28 | #region temperature 29 | 30 | // Temperature Plots 31 | // Used for cloud calibration 32 | 33 | double lowestTempDiff = 100; 34 | double highestTempDiff = 0; 35 | 36 | double highestTemp = double.MinValue; 37 | double lowestTemp = double.MaxValue; 38 | 39 | double highestSkyTemp = double.MinValue; 40 | double lowestSkyTemp = double.MaxValue; 41 | 42 | var tempUnitsText = "°c"; 43 | double tempMajorStep = 5; 44 | double tempMinorStep = 1; 45 | 46 | if (fahrenheit.Checked) 47 | { 48 | tempUnitsText = "°f"; 49 | tempMajorStep = 1; 50 | tempMinorStep = 0.1; 51 | } 52 | 53 | // Ambient Temperature 54 | var tempSeries = new LineSeries(); 55 | var temperature = new PlotModel 56 | { 57 | PlotAreaBorderThickness = new OxyThickness(0) 58 | }; 59 | temperature.Series.Add(tempSeries); 60 | temperature.Axes.Add(new OxyPlot.Axes.DateTimeAxis 61 | { 62 | AxislineStyle = LineStyle.Solid, 63 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 64 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 65 | StringFormat = "hh:mm:ss", 66 | Title = "Time", 67 | TitleFontSize = 10, 68 | FontSize = 8, 69 | }); 70 | temperature.Axes.Add(new OxyPlot.Axes.LinearAxis 71 | { 72 | Title = tempUnitsText, 73 | AxislineStyle = LineStyle.Solid, 74 | MajorStep = tempMajorStep, 75 | MinorStep = tempMinorStep, 76 | MajorGridlineStyle = LineStyle.Dash, 77 | MinorGridlineStyle = LineStyle.Dot, 78 | }); 79 | this.tempPlot.Model = temperature; 80 | 81 | // Sky Temperature 82 | var skyTempSeries = new LineSeries(); 83 | var skyTemperature = new PlotModel 84 | { 85 | PlotAreaBorderThickness = new OxyThickness(0) 86 | }; 87 | skyTemperature.Series.Add(skyTempSeries); 88 | skyTemperature.Axes.Add(new OxyPlot.Axes.DateTimeAxis 89 | { 90 | AxislineStyle = LineStyle.Solid, 91 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 92 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 93 | StringFormat = "hh:mm:ss", 94 | Title = "Time", 95 | TitleFontSize = 10, 96 | FontSize = 8, 97 | }); 98 | skyTemperature.Axes.Add(new OxyPlot.Axes.LinearAxis 99 | { 100 | Title = tempUnitsText, 101 | AxislineStyle = LineStyle.Solid, 102 | MajorStep = tempMajorStep, 103 | MinorStep = tempMinorStep, 104 | MajorGridlineStyle = LineStyle.Dash, 105 | MinorGridlineStyle = LineStyle.Dot, 106 | }); 107 | this.skyTempPlot.Model = skyTemperature; 108 | 109 | // Temp Diff 110 | var tempDiffSeries = new LineSeries(); 111 | var tempDiff = new PlotModel 112 | { 113 | PlotAreaBorderThickness = new OxyThickness(0) 114 | }; 115 | tempDiff.Series.Add(tempDiffSeries); 116 | tempDiff.Axes.Add(new OxyPlot.Axes.DateTimeAxis 117 | { 118 | AxislineStyle = LineStyle.Solid, 119 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 120 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 121 | StringFormat = "hh:mm:ss", 122 | Title = "Time", 123 | TitleFontSize = 10, 124 | FontSize = 8, 125 | }); 126 | tempDiff.Axes.Add(new OxyPlot.Axes.LinearAxis 127 | { 128 | Title = tempUnitsText, 129 | AxislineStyle = LineStyle.Solid, 130 | MajorStep = tempMajorStep, 131 | MinorStep = tempMinorStep, 132 | MajorGridlineStyle = LineStyle.Dash, 133 | MinorGridlineStyle = LineStyle.Dot, 134 | }); 135 | this.tempDiffPlot.Model = tempDiff; 136 | #endregion 137 | 138 | #region wind 139 | 140 | // Wind items 141 | // Wind Speed 142 | 143 | var windUnitsText = "m/s"; 144 | double windMajorStep = 5; 145 | double windMinorStep = 1; 146 | 147 | double windSpeedMax = double.MinValue; 148 | double windSpeedMin = double.MaxValue; 149 | double windGustMax = double.MinValue; 150 | double windGustMin = double.MaxValue; 151 | 152 | if (this.kph.Checked) 153 | { 154 | windUnitsText = "kph"; 155 | windMajorStep = 15; 156 | windMinorStep = 5; 157 | } 158 | 159 | if (this.mph.Checked) 160 | { 161 | windUnitsText = "mph"; 162 | windMajorStep = 10; 163 | windMinorStep = 2; 164 | } 165 | 166 | var windSpeedSeries = new LineSeries(); 167 | var windSpeed = new PlotModel 168 | { 169 | PlotAreaBorderThickness = new OxyThickness(0) 170 | }; 171 | windSpeed.Series.Add(windSpeedSeries); 172 | windSpeed.Axes.Add(new OxyPlot.Axes.DateTimeAxis 173 | { 174 | AxislineStyle = LineStyle.Solid, 175 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 176 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 177 | StringFormat = "hh:mm:ss", 178 | Title = "Time", 179 | TitleFontSize = 10, 180 | FontSize = 8, 181 | }); 182 | windSpeed.Axes.Add(new OxyPlot.Axes.LinearAxis 183 | { 184 | Title = windUnitsText, 185 | AxislineStyle = LineStyle.Solid, 186 | MajorStep = windMajorStep, 187 | MinorStep = windMinorStep, 188 | MajorGridlineStyle = LineStyle.Dash, 189 | MinorGridlineStyle = LineStyle.Dot, 190 | }); 191 | this.windSpeedPlot.Model = windSpeed; 192 | 193 | // Wind Direction 194 | var windDirectionSeries = new LineSeries(); 195 | var windDirection = new PlotModel 196 | { 197 | PlotAreaBorderThickness = new OxyThickness(0) 198 | }; 199 | windDirection.Series.Add(windDirectionSeries); 200 | windDirection.Axes.Add(new OxyPlot.Axes.DateTimeAxis 201 | { 202 | AxislineStyle = LineStyle.Solid, 203 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 204 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 205 | StringFormat = "hh:mm:ss", 206 | Title = "Time", 207 | TitleFontSize = 10, 208 | FontSize = 8, 209 | }); 210 | windDirection.Axes.Add(new OxyPlot.Axes.LinearAxis 211 | { 212 | Title = "Degrees", 213 | AxislineStyle = LineStyle.Solid, 214 | MajorStep = 90, 215 | MinorStep = 15, 216 | MajorGridlineStyle = LineStyle.Dash, 217 | MinorGridlineStyle = LineStyle.Dot, 218 | Maximum = 360, 219 | Minimum = 0, 220 | }); 221 | this.windDirPlot.Model = windDirection; 222 | 223 | // Wind Speed 224 | var windGustSeries = new LineSeries(); 225 | var windGust = new PlotModel 226 | { 227 | PlotAreaBorderThickness = new OxyThickness(0) 228 | }; 229 | windGust.Series.Add(windGustSeries); 230 | windGust.Axes.Add(new OxyPlot.Axes.DateTimeAxis 231 | { 232 | AxislineStyle = LineStyle.Solid, 233 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 234 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 235 | StringFormat = "hh:mm:ss", 236 | Title = "Time", 237 | TitleFontSize = 10, 238 | FontSize = 8, 239 | }); 240 | windGust.Axes.Add(new OxyPlot.Axes.LinearAxis 241 | { 242 | Title = windUnitsText, 243 | AxislineStyle = LineStyle.Solid, 244 | MajorStep = windMajorStep, 245 | MinorStep = windMinorStep, 246 | MajorGridlineStyle = LineStyle.Dash, 247 | MinorGridlineStyle = LineStyle.Dot, 248 | }); 249 | this.windGustPlot.Model = windGust; 250 | 251 | #endregion 252 | 253 | #region rain 254 | 255 | // Rain 256 | double rainMultiplier = 1; 257 | var rainUnitsText = "mm/Hr"; 258 | double rainMajorStep = 4; 259 | double rainMinorStep = 1; 260 | double rainMax = double.MinValue; 261 | double rainMin = double.MaxValue; 262 | 263 | if (this.inHr.Checked) 264 | { 265 | rainMultiplier = 0.0394; 266 | rainUnitsText = "in/Hr"; 267 | rainMajorStep = 0.16; 268 | rainMinorStep = 0.04; 269 | } 270 | var rainSeries = new LineSeries(); 271 | var rain = new PlotModel 272 | { 273 | PlotAreaBorderThickness = new OxyThickness(0) 274 | }; 275 | rain.Series.Add(rainSeries); 276 | rain.Axes.Add(new OxyPlot.Axes.DateTimeAxis 277 | { 278 | AxislineStyle = LineStyle.Solid, 279 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 280 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 281 | StringFormat = "hh:mm:ss", 282 | Title = "Time", 283 | TitleFontSize = 10, 284 | FontSize = 8, 285 | }); 286 | rain.Axes.Add(new OxyPlot.Axes.LinearAxis 287 | { 288 | Title = rainUnitsText, 289 | AxislineStyle = LineStyle.Solid, 290 | MajorStep = rainMajorStep, 291 | MinorStep = rainMinorStep, 292 | MajorGridlineStyle = LineStyle.Dash, 293 | MinorGridlineStyle = LineStyle.Dot, 294 | }); 295 | this.rainPlot.Model = rain; 296 | #endregion 297 | 298 | #region clouds 299 | // Clouds 300 | 301 | double cloudsMax = double.MinValue; 302 | double cloudsMin = double.MaxValue; 303 | 304 | var cloudsSeries = new LineSeries(); 305 | var clouds = new PlotModel 306 | { 307 | PlotAreaBorderThickness = new OxyThickness(0) 308 | }; 309 | clouds.Series.Add(cloudsSeries); 310 | clouds.Axes.Add(new OxyPlot.Axes.DateTimeAxis 311 | { 312 | AxislineStyle = LineStyle.Solid, 313 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 314 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 315 | StringFormat = "hh:mm:ss", 316 | Title = "Time", 317 | TitleFontSize = 10, 318 | FontSize = 8, 319 | }); 320 | clouds.Axes.Add(new OxyPlot.Axes.LinearAxis 321 | { 322 | Title = "%age", 323 | AxislineStyle = LineStyle.Solid, 324 | MajorStep = 10, 325 | MinorStep = 5, 326 | MajorGridlineStyle = LineStyle.Dash, 327 | MinorGridlineStyle = LineStyle.Dot, 328 | Maximum = 100, 329 | Minimum = 0, 330 | }); 331 | this.cloudsPlot.Model = clouds; 332 | #endregion 333 | 334 | #region skybrightness 335 | // Sky Brightness 336 | 337 | double skyBrightnessMax = double.MinValue; 338 | double skyBrightnessMin = double.MaxValue; 339 | double sbMajorStep = 5000; 340 | double sbMinorStep = 1000; 341 | 342 | var skyBrightnessSeries = new LineSeries(); 343 | var skyBrightness = new PlotModel 344 | { 345 | PlotAreaBorderThickness = new OxyThickness(0) 346 | }; 347 | skyBrightness.Series.Add(skyBrightnessSeries); 348 | skyBrightness.Axes.Add(new OxyPlot.Axes.DateTimeAxis 349 | { 350 | AxislineStyle = LineStyle.Solid, 351 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 352 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 353 | StringFormat = "hh:mm:ss", 354 | Title = "Time", 355 | TitleFontSize = 10, 356 | FontSize = 8, 357 | }); 358 | skyBrightness.Axes.Add(new OxyPlot.Axes.LinearAxis 359 | { 360 | Title = "Lux", 361 | AxislineStyle = LineStyle.Solid, 362 | MajorStep = sbMajorStep, 363 | MinorStep = sbMinorStep, 364 | MajorGridlineStyle = LineStyle.Dash, 365 | MinorGridlineStyle = LineStyle.Dot, 366 | Maximum = 25000, 367 | Minimum = 0, 368 | }); 369 | this.brightnessPlot.Model = skyBrightness; 370 | #endregion 371 | 372 | #region humidity 373 | // Humidity 374 | 375 | double humidityMax = double.MinValue; 376 | double humidityMin = double.MaxValue; 377 | 378 | var humiditySeries = new LineSeries(); 379 | var humidity = new PlotModel 380 | { 381 | PlotAreaBorderThickness = new OxyThickness(0) 382 | }; 383 | humidity.Series.Add(humiditySeries); 384 | humidity.Axes.Add(new OxyPlot.Axes.DateTimeAxis 385 | { 386 | AxislineStyle = LineStyle.Solid, 387 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 388 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 389 | StringFormat = "hh:mm:ss", 390 | Title = "Time", 391 | TitleFontSize = 10, 392 | FontSize = 8, 393 | }); 394 | humidity.Axes.Add(new OxyPlot.Axes.LinearAxis 395 | { 396 | Title = "%age", 397 | AxislineStyle = LineStyle.Solid, 398 | MajorStep = 10, 399 | MinorStep = 5, 400 | MajorGridlineStyle = LineStyle.Dash, 401 | MinorGridlineStyle = LineStyle.Dot, 402 | Maximum = 100, 403 | Minimum = 0, 404 | }); 405 | this.humidityPlot.Model = humidity; 406 | #endregion 407 | 408 | #region dewpt 409 | // Dew Point 410 | 411 | double dewPtMax = double.MinValue; 412 | double dewPtMin = double.MaxValue; 413 | 414 | var dewPointSeries = new LineSeries(); 415 | var dewPoint = new PlotModel 416 | { 417 | PlotAreaBorderThickness = new OxyThickness(0) 418 | }; 419 | dewPoint.Series.Add(dewPointSeries); 420 | dewPoint.Axes.Add(new OxyPlot.Axes.DateTimeAxis 421 | { 422 | AxislineStyle = LineStyle.Solid, 423 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 424 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 425 | StringFormat = "hh:mm:ss", 426 | Title = "Time", 427 | TitleFontSize = 10, 428 | FontSize = 8, 429 | }); 430 | dewPoint.Axes.Add(new OxyPlot.Axes.LinearAxis 431 | { 432 | Title = tempUnitsText, 433 | AxislineStyle = LineStyle.Solid, 434 | MajorStep = tempMajorStep, 435 | MinorStep = tempMinorStep, 436 | MajorGridlineStyle = LineStyle.Dash, 437 | MinorGridlineStyle = LineStyle.Dot, 438 | }); 439 | this.dewPtPlot.Model = dewPoint; 440 | #endregion 441 | 442 | #region pressure 443 | // Pressure 444 | double pressureMult = 1; 445 | var pressureUnitsText = "hPa"; 446 | double pressureMax = double.MinValue; 447 | double pressureMin = double.MaxValue; 448 | 449 | if (this.pascals.Checked) 450 | { 451 | pressureMult = 100; 452 | pressureUnitsText = "Pa"; 453 | } 454 | 455 | if (this.kiloPascals.Checked) 456 | { 457 | pressureMult = 0.1; 458 | pressureUnitsText = "kPa"; 459 | } 460 | 461 | var pressureSeries = new LineSeries(); 462 | var pressure = new PlotModel 463 | { 464 | PlotAreaBorderThickness = new OxyThickness(0) 465 | }; 466 | pressure.Series.Add(pressureSeries); 467 | pressure.Axes.Add(new OxyPlot.Axes.DateTimeAxis 468 | { 469 | AxislineStyle = LineStyle.Solid, 470 | IntervalType = OxyPlot.Axes.DateTimeIntervalType.Minutes, 471 | MinorIntervalType = OxyPlot.Axes.DateTimeIntervalType.Seconds, 472 | StringFormat = "hh:mm:ss", 473 | Title = "Time", 474 | TitleFontSize = 10, 475 | FontSize = 8, 476 | }); 477 | pressure.Axes.Add(new OxyPlot.Axes.LinearAxis 478 | { 479 | Title = pressureUnitsText, 480 | AxislineStyle = LineStyle.Solid, 481 | MajorStep = 100*pressureMult, 482 | MinorStep = 10*pressureMult, 483 | MajorGridlineStyle = LineStyle.Dash, 484 | MinorGridlineStyle = LineStyle.Dot, 485 | }); 486 | this.pressurePlot.Model = pressure; 487 | #endregion 488 | 489 | // give ourselves some time so arduino is connected 490 | Thread.Sleep(3000); 491 | 492 | #region graph update loop 493 | // Start updating graphs 494 | while (graphThreadRun) 495 | { 496 | var now = DateTime.Now; 497 | 498 | var before = now.AddMinutes((double)((decimal)-100 * updateInterval.Value / 60)); 499 | 500 | #region temp 501 | // Temperature series 502 | double temp = driver.Temperature; 503 | double skyTemp = driver.SkyTemperature; 504 | double dewPt = driver.DewPoint; 505 | 506 | if (fahrenheit.Checked) 507 | { 508 | temp *= 1.8; 509 | skyTemp *= 1.8; 510 | dewPt *= 1.8; 511 | 512 | temp += 32; 513 | skyTemp += 32; 514 | dewPt += 32; 515 | } 516 | 517 | if (temp < lowestTemp) lowestTemp = temp; 518 | if (temp > highestTemp) highestTemp = temp; 519 | 520 | if (skyTemp < lowestSkyTemp) lowestSkyTemp = skyTemp; 521 | if (skyTemp > highestSkyTemp) highestSkyTemp = skyTemp; 522 | 523 | double diff = temp - skyTemp; 524 | if (diff < lowestTempDiff) lowestTempDiff = diff; 525 | if (diff > highestTempDiff) highestTempDiff = diff; 526 | 527 | tempDiff.LegendTitle = "Cur:"+diff.ToString("F2") + tempUnitsText + 528 | " Low:" + lowestTempDiff.ToString("F2") + tempUnitsText + 529 | " High:" + highestTempDiff.ToString("F2") + tempUnitsText; 530 | tempDiff.Axes[1].Maximum = highestTempDiff + tempMajorStep; 531 | tempDiff.Axes[1].Minimum = lowestTempDiff - tempMajorStep; 532 | 533 | temperature.LegendTitle = "Cur:" + temp.ToString("F2") + tempUnitsText + 534 | " Low:" + lowestTemp.ToString("F2") + tempUnitsText + 535 | " High:" + highestTemp.ToString("F2") + tempUnitsText; 536 | temperature.Axes[1].Maximum = highestTemp + tempMajorStep; 537 | temperature.Axes[1].Minimum = lowestTemp - tempMajorStep; 538 | 539 | skyTemperature.LegendTitle = "Cur:" + skyTemp.ToString("F2") + tempUnitsText + 540 | " Low:" + lowestSkyTemp.ToString("F2") + tempUnitsText + 541 | " High:" + highestSkyTemp.ToString("F2") + tempUnitsText; 542 | skyTemperature.Axes[1].Maximum = highestSkyTemp + tempMajorStep; 543 | skyTemperature.Axes[1].Minimum = lowestSkyTemp - tempMajorStep; 544 | 545 | tempSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), temp)); 546 | temperature.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 547 | this.tempPlot.InvalidatePlot(true); 548 | 549 | skyTempSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), skyTemp)); 550 | skyTemperature.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 551 | this.skyTempPlot.InvalidatePlot(true); 552 | 553 | tempDiffSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), diff)); 554 | tempDiff.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 555 | this.tempDiffPlot.InvalidatePlot(true); 556 | #endregion 557 | 558 | #region wind 559 | //Wind Series 560 | var wSpeed = driver.WindSpeed; 561 | var wGust = driver.WindGust; 562 | 563 | if (this.kph.Checked) 564 | { 565 | wSpeed *= 3.6; 566 | wGust *= 3.6; 567 | } 568 | 569 | if (this.mph.Checked) 570 | { 571 | wSpeed *= 2.24; 572 | wGust *= 2.24; 573 | } 574 | 575 | if (wSpeed < windSpeedMin) windSpeedMin = wSpeed; 576 | if (wSpeed > windSpeedMax) windSpeedMax = wSpeed; 577 | 578 | if (wGust < windGustMin) windGustMin = wGust; 579 | if (wSpeed > windGustMax) windGustMax = wGust; 580 | 581 | windSpeed.LegendTitle = "Cur:" + wSpeed.ToString("F2") + windUnitsText + 582 | " Low:" + windSpeedMin.ToString("F2") + windUnitsText + 583 | " High:" + windSpeedMax.ToString("F2") + windUnitsText; 584 | windSpeed.Axes[1].Maximum = windSpeedMax + windMajorStep; 585 | windSpeed.Axes[1].Minimum = windSpeedMin - windMinorStep; 586 | 587 | windGust.LegendTitle = "Cur:" + wGust.ToString("F2") + windUnitsText + 588 | " Low:" + windGustMin.ToString("F2") + windUnitsText + 589 | " High:" + windGustMax.ToString("F2") + windUnitsText; 590 | windGust.Axes[1].Maximum = windGustMax + windMajorStep; 591 | windGust.Axes[1].Minimum = windGustMin - windMinorStep; 592 | 593 | windSpeedSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), wSpeed)); 594 | windSpeed.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 595 | this.windSpeedPlot.InvalidatePlot(true); 596 | 597 | windGustSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), wGust)); 598 | windGust.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 599 | this.windGustPlot.InvalidatePlot(true); 600 | 601 | double wDir = driver.WindDirection; 602 | windDirection.LegendTitle = "Cur:" + wDir.ToString("F2") + "°"; 603 | 604 | windDirectionSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), wDir)); 605 | windDirection.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 606 | this.windDirPlot.InvalidatePlot(true); 607 | #endregion 608 | 609 | #region rain 610 | // Rain 611 | 612 | var rainVal = driver.RainRate * rainMultiplier; 613 | 614 | if (rainVal > rainMax) rainMax = rainVal; 615 | if (rainVal < rainMin) rainMin = rainVal; 616 | 617 | rain.LegendTitle = "Cur:" + rainVal.ToString("F2") + rainUnitsText + 618 | " Low:" + rainMin.ToString("F2") + rainUnitsText + 619 | " High:" + rainMax.ToString("F2") + rainUnitsText; 620 | rain.Axes[1].Maximum = rainMax + rainMajorStep; 621 | rain.Axes[1].Minimum = rainMin - rainMinorStep; 622 | 623 | rainSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), rainVal)); 624 | rain.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 625 | this.rainPlot.InvalidatePlot(true); 626 | #endregion 627 | 628 | #region clouds 629 | // Clouds 630 | 631 | double c = driver.CloudCover; 632 | 633 | if (c > cloudsMax) cloudsMax = c; 634 | if (c < cloudsMin) cloudsMin = c; 635 | 636 | clouds.LegendTitle = "Cur:" + c.ToString("F2") + 637 | "% Low:" + cloudsMin.ToString("F2") + 638 | "% High:" + cloudsMax.ToString("F2") + "%"; 639 | 640 | cloudsSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), c)); 641 | clouds.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 642 | this.cloudsPlot.InvalidatePlot(true); 643 | #endregion 644 | 645 | #region sky brightness 646 | // Sky Brightness 647 | double sb = driver.SkyBrightness; 648 | 649 | if (sb > skyBrightnessMax) skyBrightnessMax = sb; 650 | if (sb < skyBrightnessMin) skyBrightnessMin = sb; 651 | 652 | skyBrightness.LegendTitle = "Cur:" + sb.ToString("F2") + 653 | "Lux Low:" + skyBrightnessMin.ToString("F2") + 654 | "Lux High:" + skyBrightnessMax.ToString("F2") + "Lux"; 655 | skyBrightness.Axes[1].Maximum = skyBrightnessMax + sbMajorStep; 656 | skyBrightness.Axes[1].Minimum = skyBrightnessMin - sbMajorStep; 657 | 658 | skyBrightnessSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), sb)); 659 | skyBrightness.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 660 | this.brightnessPlot.InvalidatePlot(true); 661 | #endregion 662 | 663 | #region humidity 664 | // Humidity 665 | double h = driver.Humidity; 666 | 667 | if (h > humidityMax) humidityMax = h; 668 | if (h < humidityMin) humidityMin = h; 669 | 670 | humidity.LegendTitle = "Cur:" + h.ToString("F2") + 671 | "% Low:" + humidityMin.ToString("F2") + 672 | "% High:" + humidityMax.ToString("F2") + "%"; 673 | 674 | humiditySeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), h)); 675 | humidity.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 676 | this.humidityPlot.InvalidatePlot(true); 677 | #endregion 678 | 679 | #region dew point 680 | // Dew Point 681 | 682 | if (dewPt < dewPtMin) dewPtMin = dewPt; 683 | if (dewPt > dewPtMax) dewPtMax = dewPt; 684 | 685 | dewPoint.LegendTitle = "Cur:" + dewPt.ToString("F2") + tempUnitsText + 686 | " Low:" + dewPtMin.ToString("F2") + tempUnitsText + 687 | " High:" + dewPtMax.ToString("F2") + tempUnitsText; 688 | dewPoint.Axes[1].Maximum = dewPtMax + tempMajorStep; 689 | dewPoint.Axes[1].Minimum = dewPtMin - tempMajorStep; 690 | 691 | dewPointSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), dewPt)); 692 | dewPoint.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 693 | this.dewPtPlot.InvalidatePlot(true); 694 | #endregion 695 | 696 | #region pressure 697 | // Pressure 698 | 699 | double p = driver.Pressure; 700 | 701 | p *= pressureMult; 702 | 703 | if (p < pressureMin) pressureMin = p; 704 | if (p > pressureMax) pressureMax = p; 705 | 706 | pressure.LegendTitle = "Cur:" + p.ToString("F2") + pressureUnitsText + 707 | " Low:" + pressureMin.ToString("F2") + pressureUnitsText + 708 | " High:" + pressureMax.ToString("F2") + pressureUnitsText; 709 | pressure.Axes[1].Maximum = pressureMax + 100*pressureMult; 710 | pressure.Axes[1].Minimum = pressureMin - 100*pressureMult; 711 | 712 | pressureSeries.Points.Add(new DataPoint(OxyPlot.Axes.DateTimeAxis.ToDouble(now), p)); 713 | pressure.Axes[0].Minimum = OxyPlot.Axes.DateTimeAxis.ToDouble(before); 714 | this.pressurePlot.InvalidatePlot(true); 715 | #endregion 716 | 717 | Thread.Sleep((int)this.updateInterval.Value * 1000); 718 | } 719 | #endregion 720 | 721 | // Indicate that this thread has not stopped 722 | graphThreadRunning = false; 723 | } 724 | private void Form1_FormClosing(object sender, FormClosingEventArgs e) 725 | { 726 | if (IsConnected) 727 | driver.Connected = false; 728 | 729 | Properties.Settings.Default.Save(); 730 | } 731 | 732 | private void buttonChoose_Click(object sender, EventArgs e) 733 | { 734 | Properties.Settings.Default.DriverId = ASCOM.DriverAccess.ObservingConditions.Choose(Properties.Settings.Default.DriverId); 735 | SetUIState(); 736 | } 737 | 738 | private void buttonConnect_Click(object sender, EventArgs e) 739 | { 740 | if (IsConnected) 741 | { 742 | // Disable the button till we are done disconnecting 743 | buttonConnect.Text = "Disconnecting, Please Wait..."; 744 | buttonConnect.Enabled = false; 745 | 746 | // Tell the graphing thread to stop 747 | graphThreadRun = false; 748 | 749 | // Wait for the graphing thread to quit before disconnecting 750 | while (graphThreadRunning) 751 | { 752 | // Check every second 753 | Thread.Sleep(1000); 754 | } 755 | 756 | // Disconnect 757 | driver.Connected = false; 758 | 759 | // Enable all unit settings. Graph update thread will exit when driver is not connected 760 | centigrade.Enabled = true; 761 | fahrenheit.Enabled = true; 762 | pascals.Enabled = true; 763 | hectoPascals.Enabled = true; 764 | kiloPascals.Enabled = true; 765 | mmHr.Enabled = true; 766 | inHr.Enabled = true; 767 | ms.Enabled = true; 768 | kph.Enabled = true; 769 | mph.Enabled = true; 770 | } 771 | else 772 | { 773 | if (driver == null) 774 | driver = new ASCOM.DriverAccess.ObservingConditions(Properties.Settings.Default.DriverId); 775 | driver.Connected = true; 776 | 777 | // Disable all unit settings before starting graph updates in a thread 778 | centigrade.Enabled = false; 779 | fahrenheit.Enabled = false; 780 | pascals.Enabled = false; 781 | hectoPascals.Enabled = false; 782 | kiloPascals.Enabled = false; 783 | mmHr.Enabled = false; 784 | inHr.Enabled = false; 785 | ms.Enabled = false; 786 | kph.Enabled = false; 787 | mph.Enabled = false; 788 | 789 | // Start thread to update graphs 790 | t = new System.Threading.Thread(updateGraphs); 791 | t.Start(); 792 | 793 | // Ask graphing thread to update graphs 794 | graphThreadRun = true; 795 | } 796 | SetUIState(); 797 | } 798 | 799 | private void SetUIState() 800 | { 801 | buttonConnect.Enabled = !string.IsNullOrEmpty(Properties.Settings.Default.DriverId); 802 | buttonChoose.Enabled = !IsConnected; 803 | buttonConnect.Text = IsConnected ? "Disconnect" : "Connect"; 804 | } 805 | 806 | private bool IsConnected 807 | { 808 | get 809 | { 810 | return ((this.driver != null) && (driver.Connected == true)); 811 | } 812 | } 813 | } 814 | } 815 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Windows.Forms; 5 | 6 | namespace ASCOM.Arduino 7 | { 8 | static class Program 9 | { 10 | /// 11 | /// The main entry point for the application. 12 | /// 13 | [STAThread] 14 | static void Main() 15 | { 16 | Application.EnableVisualStyles(); 17 | Application.SetCompatibleTextRenderingDefault(false); 18 | Application.Run(new Form1()); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("ASCOM Driver Test Forms Application")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("ASCOM Initiative")] 12 | [assembly: AssemblyProduct("Driver Test Forms Application Template CSharp")] 13 | [assembly: AssemblyCopyright("Copyright © ASCOM Initiative 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("e6c7b090-1f16-486f-bdba-d45785e9f6f1")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("6.2.0.0")] 36 | [assembly: AssemblyFileVersion("6.2.0.0")] 37 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.18444 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ASCOM.Arduino.Properties 12 | { 13 | using System; 14 | 15 | 16 | /// 17 | /// A strongly-typed resource class, for looking up localized strings, etc. 18 | /// 19 | // This class was auto-generated by the StronglyTypedResourceBuilder 20 | // class via a tool like ResGen or Visual Studio. 21 | // To add or remove a member, edit your .ResX file then rerun ResGen 22 | // with the /str option, or rebuild your VS project. 23 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 24 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 25 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 26 | internal class Resources 27 | { 28 | 29 | private static global::System.Resources.ResourceManager resourceMan; 30 | 31 | private static global::System.Globalization.CultureInfo resourceCulture; 32 | 33 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 34 | internal Resources() 35 | { 36 | } 37 | 38 | /// 39 | /// Returns the cached ResourceManager instance used by this class. 40 | /// 41 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 42 | internal static global::System.Resources.ResourceManager ResourceManager 43 | { 44 | get 45 | { 46 | if (object.ReferenceEquals(resourceMan, null)) 47 | { 48 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASCOM.Arduino.Properties.Resources", typeof(Resources).Assembly); 49 | resourceMan = temp; 50 | } 51 | return resourceMan; 52 | } 53 | } 54 | 55 | /// 56 | /// Overrides the current thread's CurrentUICulture property for all 57 | /// resource lookups using this strongly typed resource class. 58 | /// 59 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 60 | internal static global::System.Globalization.CultureInfo Culture 61 | { 62 | get 63 | { 64 | return resourceCulture; 65 | } 66 | set 67 | { 68 | resourceCulture = value; 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 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 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.18444 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace ASCOM.Arduino.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | 30 | [global::System.Configuration.UserScopedSettingAttribute()] 31 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 32 | [global::System.Configuration.DefaultSettingValueAttribute("")] 33 | public string DriverId 34 | { 35 | get 36 | { 37 | return ((string)(this["DriverId"])); 38 | } 39 | set 40 | { 41 | this["DriverId"] = value; 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Arduino_WeatherStation/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Arduino_Weather_Station.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Arduino_Weather_Station.pdf -------------------------------------------------------------------------------- /Installers/Arduino ObservingConditions Setup.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Installers/Arduino ObservingConditions Setup.exe -------------------------------------------------------------------------------- /Installers/Arduino_WeatherStation.msi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manojkoushik/Arduino_ObservingConditions/b3294eaf1934d82e9762776788c6062a93bddd4f/Installers/Arduino_WeatherStation.msi --------------------------------------------------------------------------------