View Full Version here: : Arduino Cloud Detector project
peter_4059
25-10-2019, 07:56 PM
With the cloudy summer weather approaching, I decided I needed a new project. I've never really understood what Arduino micro controllers were all about so decided to investigate. A trip to Jaycar last weekend, a bag full of goodies and a few hours of youtube later I now have a basic weather station connected to the PC reporting the light, barometric pressure, relative humidity, temperature, sky temperature, dew point and rain every 5 seconds.
I was surprised at how easy it was to set up the electronics and write the Arduino code. The difficult part that I'll be embarking on next is how to display that information and potentially integrate that into Ascom.
I'm quite keen on the Grafana type visual interface however I have a lot of questions to set me on a productive path as I'm staring from zero knowledge so watch this space.
Images to come.
peter_4059
26-10-2019, 03:44 PM
Got it all installed in a box today. Here are some photos of the prototype, in the box and a screen shot of the com port monitor showing the output.
Next job is to work out how to write an ASCOM driver.
spiezzy
26-10-2019, 03:55 PM
Hi Peter
well done what a project you have started I have never looked into Arduino Kits do you have any links to how this project all goes together
very interesting stuff
cheers Pete
peter_4059
26-10-2019, 04:27 PM
Hi Pete,
I had zero knowledge of Arduino this time last week. I got the prototype up and running in eight hours so it is pretty simple given my coding experience (almost none).
All the parts I used are from Jarcar. The part numbers are:
XC3902 - Arduino starter kit (this contains the Arduino Uno, the breadboard and some hookup wires
The sensors are:
XC-3704 - Non contact IRsensor module
XC-4446 - Photosensitive LDR sensor module
XC-4603 - Rain sensor
XC-4520 - Temperature and Humidity sensor module
XC-3702 - Barometric Pressure sensor module
Once you have the parts you need to install the Arduino IDE software on the PC you intend to use to program the Arduino Uno.
You then connect the Uno to the PC via USB and start t write the code.
There are Adafruit libraries for some of the modules I used (IR module, Barometric pressure module and the Temp/Humidity module). These get downloaded and linked into the Arduino IDE environment.
The ones I used were :
Adafruit_MLX90614.h
Adafruit_Sensor.h
Adafruit_BMP085.h
The Arduino code is a form of C I think.
I've attached my code in the text file if you want to see what it looks like however I'm a novice so there might be much better coding practices than this.
Enjoy.
Peter
Impressive start Peter. Watching with interest! :cheers:
peter_4059
26-10-2019, 04:37 PM
Cheers Rob. That was the easy part. I'm now trying to learn how to write the Ascom driver. I'd also like to create a pc dashboard with the data trended however I think there is a lot more to that. I've been looking at a product called Grafana that looks quite good but haven't worked out how all the bits fit together yet.
Be interested how you go with the ASCOM. I've never bothered to go off and research what's involved - must be some example code somewhere.
What would you write it in?
peter_4059
26-10-2019, 07:00 PM
I'm currently thinking VB but could do C# if necessary. There are plenty of youtube videos and github code - the trick is finding the one that is going to be helpful.
peter_4059
27-10-2019, 07:54 PM
I've got it all properly installed outside now and had a good opportunity to test this evening with heavy cloud rolling in. I think I've got the detection setting dialled in now so will be focusing on trying to write an ascom driver and/or a decent pc interface.
How does it detect the clouds Peter - the IR sensor, by temp difference?
peter_4059
28-10-2019, 09:04 AM
Yes that's correct Rob. It calculates the difference between ambient and sky temp (IR measurement) and you build a model of the temp difference for clear and cloudy. Last night was first proper cloudy night so I was able to observe the temp difference change as the clouds rolled in and then calibrate the model. Next step is to work on the pc end interface.
troypiggo
28-10-2019, 09:18 AM
Very cool project. Can't wait til you start mass production of these. :)
codemonkey
30-10-2019, 07:53 AM
Very cool, Peter. I'll need something like this once I get around to motorizing my ROR. I haven't decided whether to DIY like you have, or buy something off the shelf. I may end up doing the latter... I'm wary about risking very expensive equipment by trying to save a few bucks.
peter_4059
30-10-2019, 09:43 AM
Lee,
It would be interesting to look inside some of the commercial detectors. I wouldn't be surprised to find an Arduino in many of them. The detectors in the images all look like the MLX IR sensor I'm using. The tricky part is the code. I'm currently using a simple straight line correlation but might change that if I observe a different relationship over time. In any case I'm not automating a roof, I don't have expensive equipment and I just want feedback of the sky conditions when I'm sitting inside the house.
peter_4059
31-10-2019, 11:50 PM
One step closer...got my desktop app drafted up this evening in Processing. Not exactly how I hope the end product will look but it is a steep learning curve and any small win is good as far as I'm concerned. This one is using random number generators. Tomorrow night should see it getting real time data....
codemonkey
01-11-2019, 08:50 PM
Oh I wouldn't be surprised in the least to see an Arduino in commercial products, nor am I trying to detract from your project in any way. I'm giving serious thought to doing the same.
My main concern is that in all but the most trivial of applications, there's bugs. Theoretically a commercial product will have been tested more thoroughly and be in use by many more people so it may be less likely to have catastrophic bugs. The flip side to that is, if there is a bug, you're beholden to the manufacturer to fix it.
Anyway, I think this is a great project and it looks like yours is coming along very well. Great work, Peter!
peter_4059
02-11-2019, 06:35 PM
That might be true and I'm no codemonkey but I have managed to get it working today :)
Pretty happy with myself :thumbsup:
peter_4059
03-11-2019, 12:01 AM
Liking the $170 home cooked option...
http://www.iceinspace.com.au/forum/showthread.php?t=178729
multiweb
03-11-2019, 08:32 AM
Impressive. :eyepop: but... where's the crownies temp gauge? :question:
Mon dieu! How coud he leave out such a thing! :question: :D
peter_4059
03-11-2019, 04:23 PM
That's an enhancement for the "Astrofest Special Edition" version.
:cheers:
peter_4059
03-11-2019, 08:23 PM
It's been a big weekend learning how to build a PC GUI and then to tidy up my code in the Arduino. I've now moved all the calculations into the PC code so the Arduino is just exporting the sensor values. That makes it easier to tweak the cloud detection calculation and also provides visibility of all of the raw data for debugging and configuration. I've spent quite a lot of time trying to get my GUI to plot a time series of cloud and light. I've still got a bug in the display however this is cosmetic.
h0ughy
03-11-2019, 08:50 PM
What a fantastic project Peter. You're a very clever bloke, and I think the astrofest version will be world's away from this version.
peter_4059
03-11-2019, 09:09 PM
Thanks Dave. It has been a lot of fun and quite satisfying to get the computer to draw a GUI. I've always wondered how that happens and now I'm a small step closer to understanding how you do that.
I've wanted some real time feedback on cloud status since building the obs and now monitoring things from inside. There have been quite a few occasions where clouds have rolled in and I've been oblivious to what is happening. The next project is to write an ascom driver so I can suspend imaging automatically but that will involve some more significant C# programming.
peter_4059
05-11-2019, 07:14 PM
Got my display bug sorted this evening and have been playing with the cloud model the last few nights. I think I'm getting quite a good fit now so I've built a compiled version to test tonight. So far so good :D
Any way you could record the data every few mins along with a webcam feed of the sky conditions perhaps Peter? Guess its hard to beat the Mark I eyeball in the end though.... :question:
peter_4059
05-11-2019, 08:34 PM
That's pretty much what I'm doing in a spreadsheet. The % cloud gets a bit subjective once it is dark though - especially for high cloud like last night. I'm comparing my estimate to what CFN is predicting as a bit of a sense check.
peter_4059
09-11-2019, 08:09 PM
Spent a bit of time today on the next steps. Objectives are:
1. Add wind speed sensor
2. Improve light measurement at low light levels
3. Maybe improve accuracy of humidity measurement
I've settled on the DFRobot SEN0170 Anemometer Kit for wind speed and I'm thinking the Adafruit TSL2591 High Dynamic Range Digital Light Sensor will do the trick for more accurate light measurement. I'm also toying with the Adafruit HTU21D-F Temperature & Humidity Sensor Breakout Board for better humidity measurement that the DHT11 I'm currently using.
Does anyone have experience with any of these?
peter_4059
11-11-2019, 09:18 PM
More fun with coding and some more progress this weekend. I've now worked out how to build a digital panel to display the data instead of the meter library I used in my first GUI. This makes the data panel a lot smaller. I've also got it changing the background colour in the box to highlight cloud and light.
Thanks for the updates Peter. Keep 'em coming :)
troypiggo
12-11-2019, 10:19 AM
Instead of "Weatherbox", how about calling it "SkyNews" :)
peter_4059
12-11-2019, 09:18 PM
Very clever Troy. Althoigh your time in the technical department was short lived, perhaps theres a place for you in the marketing department.
If you end up living in paradise AND making megabucks from this thing - then.....then...don't expect open slather from the mini B next year dammit! :P
peter_4059
12-11-2019, 10:33 PM
Rob. I'm tipping MBs will follow a similar trendline that DTs did over the past 10 years. One day you'll look back and say..."I created that" ;) :thumbsup:
peter_4059
15-11-2019, 09:48 PM
A bit more progress this week. My extra parts arrived and I've assembled the light sensor (MKII). This one uses an Adafruit TSL2591 high dynamic range digital light sensor which, according to the specs can measure between 0.000118 to 88,000 Lux. It also breaks out IR, full spectrum and visible light readings.
The original LDR sensor I purchased was ok at distinguishing daylight from twilight, however it was not sensitive enough between twilight and full on darkness.
I'm also going to locate the new sensor remote to the rest of the project in a separate box and this has necessitated use of differential I2C bus extenders for that sensor. That part of the project is all wired up and I've tested the Arduino code to check it is all working (which it is). Don't look too closely at the soldering :eyepop: :eyepop:
Tomorrow I will be making openings in the two enclosures for the cat5 cable connectors and a bit of soldering to include the new sensor in the original project.
Impressive going Peter
If you get around to including aural warnings, JJJ might still have a recording of Cleeuuood Diiissaapppear somewhere.....
peter_4059
15-11-2019, 11:08 PM
Rob,
I'm sure that is do-able and now you have got me thinking about a proximity sensor addition coupled with cat sounds. Might have to upgrade the Uno to a Mega. :question::question:
CalvinKlein
16-11-2019, 09:29 PM
I'm following with interest. I've recently starting doing some Arduino work after a couple of years break. Also have an ROR observatory slowly in the making and I'll be wanting cloud detection (as much electronics will be DIY as possible)
peter_4059
16-11-2019, 09:43 PM
Managed to get the new Lux sensor incorporated today and have been playing with the code this evening.
The TSL2591 has variable gain and exposure parameters so there has been a bit of experimentation to find the sweet spot between sensitivity and saturation. I've been testing things by switching on various lights in the house to see how it responds and so far it is doing what I had hoped. This is evident in the steps in the light plot on the right.
Next step is further refinement of the cloud model as I build a bigger database of observations and model input data.
I've also purchased an anemometer however that has been put away for Christmas.
peter_4059
23-11-2019, 06:11 PM
More experimentation this week. I've been researching cloud models and came across a paper that compares a number of models that predict sky temperature for clear and cloudy skies. Most of the cloud based models factor in air moisture content either as dew point or vapour pressure, something I didn't have in my home grown model.
I've been busy trying out the various theoretical models this week and have settled on a couple that seemed to fit my data reasonably well. I've now added the necessary code to my WeatherBox app. I also decided to add a more accurate relative humidity sensor to my arduino project since this is one of the key variables in predicting cloud and the DHT11 sensors don't have a great reputation for accuracy.
It's clear at the moment but supposedly getting cloudy tonight so I'm looking forward to see how the new model goes.
peter_4059
30-11-2019, 06:09 PM
I feel like I've made some progress on this over the week. I've incorporated and tuned the literature based sky temperature models and I'm getting quite a good fit to my measured temperatures. I've got a bit more tweaking to do on the cloud model but it is also looking quite good I think.
I've also done some better colour coding for the display to change with a set of thresholds I've set.
peter_4059
03-12-2019, 11:47 PM
I've made some more progress over the past few nights. I've now got a test app writing the Boltwood style single line data file. The significance of that is the existing Ascom Observing Conditions Drivers (available from the Ascom website) will read this file and pass the information to any compliant app (including SGP) so I don't need to write my own Ascom driver.
The data file is very specifically formatted (spacing of the numbers seems to be critical for it to work) so a lot of the effort is in creating a string with the data values in the right places:
2019-12-03 22:40:24.00 C K 14.0 2.0 7.0 1.0 9 13.2 3 0 0 00002 043802.94472 1 1 1 1 0 0
Next step is to link this to the actual live data.
Happy days :)
peter_4059
04-12-2019, 07:30 PM
I've got my Boltwood single line data file code incorporated into my WeatherBox app and now have live data feed to SGP.
Ascom is a beautiful thing!
A bit more tweaking on the data being passed through and I'm almost done.
troypiggo
04-12-2019, 09:31 PM
Sweet! Well done mate!
Is that cloud cover % in SGP window rounded down from your 0.7?
peter_4059
04-12-2019, 09:51 PM
Cheers Troy. The Boltwood system reports Clear, Cloudy or Very Cloudy. They transpose to 0%, 50% 100%.
My app outputs % cloud cover throughout the entire range 0-100% but to use the generic Boltwood single line data driver I've had to translate my figure to their three steps for pass through to SGP.
troypiggo
05-12-2019, 10:04 AM
So the Boltwood system is a bit "coarser" than your app, and to use their ASCOM driver you end up having to dumb down your more accurate modelling. Again - well done.
good to see your progress with this. arduino is dead simple to get into and tinker with. I often find myself reading academic papers like you did with clouds and can get enough information to be usable to refine part of how i'm measuring and other factors to take into effect. I built a lap timer just to measure tweaks I make to my coding of an autonomous driving robot. ended up having to learn about rolling averages to smooth out sensor noise and using temp/hum measurements to make precise distance calculations across the track as my method of detecting the robot passing by (as opposed to hall sensor or laser line methods but thats the beauty too of arduino you can try all these methods and see which you find most effective for your project.) As you're finding integrating with other systems can impose limits when they only accept certain values but you have the luxury to use the true values in your own custom display while passing modified values to another system calibrated to your projects scope and observations. for example you may take values of 20% as measured and transpose those to 50% so Boltwood reports cloudy.
Plus arduino is such an easy platform to replicate. I mostly use Arduino Uno as my base boards and bought an official one which is nice and stable to use as my development board then get others from ebay which are chinese clones with often dubious construction quality. hooking parts up to the cheaper board and copying the code across and its a functional copy that should give the same results. So for your project you may want to provide the info for others to replicate your build and maybe gather test data for you to help refine your coding. or maybe not if your aim is to profitise your work rather than share. but arduino is dead easy and affordable to pretty much anyone really. there is so much information out there. grab an arduino uno starter kit from ebay and go to arduino.cc and start with simple tutorials doing simple things then tinker with ideas from there. its NOT difficult.
peter_4059
05-12-2019, 05:23 PM
I've had to apply their three settings to my continuous measurement for both cloud and light and ultimately the same will apply for wind. I still have the full 0-100% measurement in my desktop app however the interface via the ascom driver I'm using only has the 0%/50%/100% type options.
Steve,
That pretty much sums up my experience. Have you turned your arduino projects into something more that a prototype - I'm wondering whether the sensors and interface board could be manufactured onto a custom arduino shield? I'm also happy to share what I've done if anyone is interested in giving it a try.
peter_4059
08-12-2019, 04:37 PM
More work on the code this weekend. I've now tidied up my WeatherBox code into a series of sub routines and this has made it a lot easier to follow. I've re-configured the display to add wind and a third trend plot as I'll be adding an anemometer sensor over the holidays. Finally I've added a basic checksum to the Arduino data string to ensure the data being received by my app is the same as that being transmitted by the Arduino.
peter_4059
14-12-2019, 08:13 PM
A bit more progress today. A trip to Jaycar to get some parts in preparation for the wind speed sensor I'm planning to add and some tests to check if the extra voltage required for the sensor can be supplied via the Arduino.
I've also been tweaking my cloud model to tune it to my local observations.
More holes to drill in the enclosure tomorrow to take in 9 or 12V feed and signal line to the anemometer.
Where did you get the enclosure Peter? Jaycar?
peter_4059
14-12-2019, 09:36 PM
Rob - yes all the basic stuff has come from Jaycar. I've purchased some of the sensors that Jaycar doesn't stock from Core Electronics.
peter_4059
23-12-2019, 06:26 PM
Put some finishing touches on this project over the past few days. I've now added the anemometer and adjusted the code to cater. I've also worked out how to better format some of the output to make it easier to read.
Looks great.
Thanks for sharing the layout pics - very nicely organized.... :thumbsup:
peter_4059
30-12-2019, 08:38 PM
Service test of the rain sensor tonight. It works.
peter_4059
31-12-2019, 05:42 PM
After my test of the rain sensor last night, I decided it would be a good idea to add an audible alarm to the rain detection just in case I'm not looking at the computer at the time. That turned out to be quite straight forward and I gave it a test today by manually adding a drop of water to the sensor. Everything worked as planned.
I've also done a bit of work on the Arduino code to select the gain settings for the TSL light sensor in a more robust way. It now has a day and a night mode and automatically switches between the two depending on the light level.
peter_4059
04-01-2020, 05:52 PM
Moved onto the next phase of this project yesterday. I'm re-working the PC interface in VB.net as a more mainstream and flexible alternative to Processing. Thanks to the excellent help from my good friend Chris Garbz I've now got the basic form with serial connection to the Arduino working and displaying data in boxes. Next step is to work out how to draw the plots.
peter_4059
11-01-2020, 08:22 PM
Made a bit more progress on this project today. I've worked out how to format the plots and how to create a form with tabs. This means I can reduce the footprint of the application and add some other functionality. I've added the ability to change the thresholds on the fly and also a screen showing the raw sensor values being transmitted from the arduino (these are random numbers in my test case in the attached screen shots). I'm still grappling with an error when I try to increase the number of history points that is taking some time to resolve. Any ideas on how to resolve this will be gratefully received!
peter_4059
12-01-2020, 02:54 PM
Feeling quite pleased with myself this afternoon. I've managed to resolve the bug in my code that was preventing me adding extra history points to the graph. Turned out a different approach to adding data was required. I've also worked out how to flush the serial port so I don't need to unplug the arduino if I stop and re-start the code.
The majority of my remaining work list improves functionality and should be pretty straight forward.
troypiggo
12-01-2020, 06:54 PM
Awesome work
peter_4059
12-01-2020, 09:03 PM
Cheers Troy. I've now completed the bulk of what I was hoping to do with this. VB has provided a lot of extra flexibility that was difficult to do in Processing so it was worth the effort.
Here are my near final screen shots (all still using dummy random numbers for testing).
peter_4059
13-01-2020, 09:57 PM
Put the finishing touches on this tonight. I've added the ability to log some basic data to a text file that will help me refine my cloud model. I've also compiled my first version into an exe file and it works :)
Kudos again Peter for a great project.
I think you'd be well over Boltwood if charging labour by now? :P
peter_4059
14-01-2020, 10:38 AM
Cheers Rob. That might be so however it was all about learning Arduino, Java and Visual Basic rather than trying to do it cheaper than a Boltwood. I also think this does a lot more than the Boltwood does.
And you can improve it, repair it, etc as you need as time goes by :)
ozstronomer
14-01-2020, 09:12 PM
Great project Peter, looks like you have come up with a really nice detector and comprehensive software to match.
Congrats on a job well done :thumbsup:
Cheers Geoff
peter_4059
15-01-2020, 06:36 PM
Thanks Geoff. Quite satisfying to see it all come together.
peter_4059
15-01-2020, 07:33 PM
Code now transferred to the observatory PC and all hooked up to the real sensors tonight. Log file and Obs Conditions text file both working as is connection to SGP Observing conditions.
Now I will focus on collecting data to refine the cloud model.
Should be plenty of cloud and rain to help refine that end of the spectrum over the next week....!
peter_4059
15-01-2020, 09:38 PM
Yep - nearly got to try out the rain sensor tonight however the calibrated skin set off the alarm first.
turbo_pascale
27-02-2020, 11:25 AM
Hey Peter,
Where'd you get up to with this project?
I'm wanting to embark on a similar thing, as I need to automate more so I can get some sleep at night, and close the observatory if there is bad weather.
I'm looking to build something like yours, but you also changed a lot of things along the way. Have you "settled in" on the final hardware items?
Also, where did you find the boltwood one-liner specification?
I have a cheap-ish eBay weather station, and I think I can potentially use some of it's sensors (particularly wind speed and direction) to feed in.
Depending on the pricing of the parts though, it might end up cheaper to buy an AAG device. Not sure yet!
turbo_pascale
27-02-2020, 03:48 PM
Answered one of my own questions.
Was able to find a manual for the boltwood with both their old and new format.
http://song.phys.au.dk/hardware_manuals/boltwood_cloud.pdf
peter_4059
27-02-2020, 07:52 PM
Hi Rob,
I've stopped adding hardware and completed my coding on this project for now. I'm now focusing on collecting data to see if I can improve my cloud model further.
The document you found on the Boltwood device shows the format for the one-line file. The column positions and number formatting are important for the ascom driver to work properly. There is some test apps included with the ascom driver that create a dummy file that you can use to see the actual format of the data.
In terms of hardware items I'd suggest with the benefit of hindsight, the MLX is definitely needed. That sensor has ambient and sky temperature outputs and that is sufficient to replicate the Boltwood methodology (this is also described in that PDF you found).
I was trying to improve the prediction of cloud as I observed simple temperature difference was not particularly accurate. My model needs relative humidity in addition to sky and ambient temperature. I'd recommend bypassing the DHT for humidity as they don't have a great reputation and go for a better sensor. I went for an Adafruit SHT31.
If you want light sensing, I'd go straight for something like the TSL2591 as the LDR was much too insensitive apart from detecting daylight vs night.
If you want more info on my approach, I'd be happy to share what I've done.
I've included a couple of plots below. The first one is ambient-sky temp vs observed cloud fraction. This is the Boltwood approach. You select two deltaT's - one for clear and one for partially cloudy. Based on my observations they would be -18 degC and -11 degC. The problem with this approach is there are plenty of data points where the deltaT would suggest there is cloud when in reality it appeared to be clear.
The second plot is my current model of observed cloud vs predicted cloud. Again not perfect but I'm still collecting a data set and each iteration is improving my R^2.
Cheers,
Peter
turbo_pascale
27-02-2020, 10:12 PM
Peter,
Thanks for all the feedback. I’ll start collating the parts list and see how far I get.
Your last point interests me. How are you correlating the cloud cover (actual) vs readings? By visual observation?
Have you thought of doing a correlated image acquisition analysis from a camera and the readings from the sensor? I’d be interested to see the specs on the FOV of the sky sensor and see if it could be mapped to an image taken at the same time.
Rob
peter_4059
27-02-2020, 10:25 PM
Rob,
I'm using visual feedback to collect the actual cloud cover. I've built a data logging function in my app to collect the raw model input parameters from the sensors together with a manual cloud cover input and write that to a CSV file. The actual model development is in Excel.
Cloud cover percentage is a bit subjective visually and I assume this would also be a challenge using a camera image.
The IR sky temperature sensor that I'm using is a Jaycar XC-3704. You can download the datasheet from their webpage link:
https://www.jaycar.com.au/non-contact-ir-sensor-module/p/XC3704.
The packaging says it has a +/- 40 deg FOV.
peter_4059
01-03-2020, 10:36 PM
I've been getting the occasional error in my VB version of this project. The exception text says:
************** Exception Text **************
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOper ationException(ExceptionResource resource)
at System.Collections.Generic.List`1.E numerator.MoveNextRare()
at System.Collections.Generic.List`1.E numerator.MoveNext()
at System.Windows.Forms.DataVisualizat ion.Charting.ChartTypes.LineChart.P rocessChartType(Boolean selection, ChartGraphics graph, CommonElements common, ChartArea area, Series seriesToDraw)
at System.Windows.Forms.DataVisualizat ion.Charting.ChartTypes.LineChart.P aint(ChartGraphics graph, CommonElements common, ChartArea area, Series seriesToDraw)
at System.Windows.Forms.DataVisualizat ion.Charting.ChartArea.Paint(ChartG raphics graph)
at System.Windows.Forms.DataVisualizat ion.Charting.ChartPicture.Paint(Gra phics graph, Boolean paintTopLevelElementOnly)
at System.Windows.Forms.DataVisualizat ion.Charting.Chart.OnPaint(PaintEve ntArgs e)
at System.Windows.Forms.Control.PaintW ithErrorHandling(PaintEventArgs e, Int16 layer)
at System.Windows.Forms.Control.WmPain t(Message& m)
at System.Windows.Forms.Control.WndPro c(Message& m)
at System.Windows.Forms.Control.Contro lNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.Contro lNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.C allback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Just wondering if anyone has experience that could lead me to a quick resolution?
Don't know if this helps at all?
Rare interaction of threads affecting writing/reading object collection?
https://social.msdn.microsoft.com/Forums/en-US/ab49a907-dd27-4831-a6f3-72b839a6675b/collection-was-modified-enumeration-operation-may-not-execute?forum=MSWinWebChart
peter_4059
07-03-2020, 10:51 AM
Hi Rob,
I had seen that thread before and I suspect that is the cause of the problem however everything I've tried to do to fix that problem so far has not worked. I've decided to start a new thread in the software and computers forum to see if anyone with more programming experience will chime in.
Cheers,
Peter
peter_4059
10-03-2020, 11:48 PM
I'm calling a major breakthrough on this project. Raki has come to the rescue with some thread-safe VB code that has addressed the chart update error and has also allowed me to modify other parts of the code that were a bit sus so now it is working without obvious dodgy workarounds.
I must admit I'm pretty satisfied with the project and I've learned a lot about Arduinos, Java and VB.net.
Still more work to do on the cloud model but that will be something I'll do over 12 months.
Happy to share if anyone is interested in building their own cloud detector/weather station.
turbo_pascale
11-03-2020, 01:47 PM
Hi Peter,
I'm interested to know how the rain sensor has performed for you in real-world use.
Most commercial setups have some kind of heating setup to evaporate the water. Have you found that to be an issue with yours? I found someone selling a similar sensor with a built in heater (link is on an iPad somewhere around here) which would enable the heating portion to be managed.
I need to put the box about 5-10m away from the observatory. How are you powering/running the comms? Can the entire comms/power setup be run over a modified ethernet cable (serial comms + power?)
I've just about got my imaging setup with the dome totally automated and seeming to (mostly) get through the night, so this little project is starting to move to the forefront of my mind.
I priced up an AAG Cloudwatcher from Sidereal Trading, with the relative humidity and wind sensor, and that's going to cost just over $1000, and based on what all the parts cost for your setup (including an annemometer) is around $200.
The obvious advantage is the AAG setup is plug and play though!
peter_4059
11-03-2020, 07:15 PM
Hi Rob,
My device is actually located within my obs so the rain sensor is not normally exposed to the elements unless the roof is open. The point of it was to alert me if the roof was open and it started to rain. At that stage I shut the roof and whatever got any rain drops on it would then need to dry out. I therefore don't really need a heater. It would be easy to add one and drive it from the Uno PWM pins if you needed it. I'm not trying to do remote imaging or a high level of automation - just seeking feedback of what's going on while I'm sitting inside the house.
In terms of cables, I've got USB and 12V power going to my enclosure. The power is only required for the anemometer and could run direct to that device.
Regarding the AAG, I think it uses a similar approach to the Boltwood in terms of ambient-sky temp to predict cloud. I think that gives quite a lot of false positives which is ok if you want to be sure however for me that would rule out a lot of nights I'd rather be capturing something. I'd also rather spend the $800 on something else. If all you need is the cloud monitor, this can be done with just the Uno and the MLX sensor - probably less than $50 in parts. I've added other sensors because I could and part of the exercise was learning to program the Arduino and build the GUI. If you really want wind speed sensing, with the benefit of hindsight, I'd probably consider one of these hot wire options as they are a lot cheaper and easier to incorporate in the project:
https://moderndevice.com/product/wind-sensor-rev-p/
Hot wire wind sensor. Hmmm.
I'm learning stuff just keeping up with the thread... :)
peter_4059
11-03-2020, 09:20 PM
Hey Rob,
No standing still here. Moving on to the MB extension next....:question:
turbo_pascale
11-03-2020, 09:55 PM
I saw a product that's been pushed all over the place on KickStarter and Indiegogo which uses an ultrasonic wind detector for speed and direction.
https://weatherflow.com/tempest-weather-system/
If it had some kind of cloud sensor, it would be perfect. You'd just need to have a listener for the data (apparently can run off the WiFi and you can read UDP packets or Bluetooth LE). Kind of expensive, but still cheaper than the AAG system (minus the cloud sensor)
I particularly enjoy the rain sensor using haptic feedback. Kind of novel approach.
I was interested to see if I could find just the sensor, but that's proving difficult.
https://lcjcapteurs.com/en/girouette-anemometres-capteur-vent/sa-micro-2/
peter_4059
11-03-2020, 11:19 PM
Looks schmick. Go for it. :thumbsup:
turbo_pascale
11-03-2020, 11:58 PM
I'm a little bit shy on the crowdfunding gear - I waited for 2 years on one thing, and it eventually arrived, but by then, things moved on and it was a bit irrelevant.
I am still waiting on something else, which is past 2 years now. I'm working to the theory that if it turns out to be a good product, I'll pay the extra and get them when they are manufacturing normally.
Maybe I just get back to basics and build something that tells me if it's raining, or cloudy or too windy so I can close the dome!!!
peter_4059
14-03-2020, 12:27 AM
sounds like a good plan
peter_4059
02-05-2020, 02:55 PM
It's been a while since I last updated on this project. I've been collecting additional data points to calibrate the model and now have 267 points including 91 with clear skies. With the weather turning cooler and more clear nights I should be able to get some more data points to improve the model as most of the data so far has been over summer. The clear sky emissivity model is showing some bias that should be improved with some more cold night data points. The last chart below shows the observed vs predicted cloud cover (0=clear, 10=cloudy).
turbo_pascale
08-05-2020, 02:22 PM
Good update - looking forward to more in the future.
In the interim, someone on another forum pointed me at this rain sensor: https://rainsensors.com/
Just putting this here are as it fills out options for those looking to DIY.
It has different modes of detection, but it's as simple as a relay you can wire up which could be used to just trigger the dome to close directly, or could be read in to the arduino (it has a tipping bucket emulation).
jwoody
08-05-2020, 02:36 PM
I use that RG-11 rain sensor on my Nexdome observatory and can confirm it works well. A tiny drop on the detection dome and the Shutter on the Nexdome closes immediately. I purchashed mine from here https://oceancontrols.com.au/hys-001.html
Jeremy
turbo_pascale
08-05-2020, 02:55 PM
That's really good to know - how do you have it hooked up?
Directly to the dome or through some kind of controller?
I'm pretty sure my Dome has hardwired switches that I can plug in to (which I've never bothered to look in to), and they appear to be exposed in the dome driver, so maybe that would work too - no other bits in the middle.
Rob
jwoody
08-05-2020, 02:59 PM
It goes straight to the dome (Arduino Leonardo pin 7) The nexdome firmware? already has the code written into it for such a rain sensor.
Jeremy
turbo_pascale
08-05-2020, 06:15 PM
Ah, that's good.
I just sat through the manual of my dome, unfortunately the switches are OUTPUT switches, not input, so I'll have to revert back to a controller plan.
peter_4059
08-05-2020, 06:18 PM
in other news I was googling cat videos today....
Is there a sensor for that Peter - what if a stray cat or possum sits on the corrector plate? :lol:
peter_4059
08-05-2020, 08:14 PM
Rob....its a real risk we have to live with here in the suburbs. In my experience detection is easy.
turbo_pascale
24-05-2020, 02:36 AM
Hi Peter,
I've finally built my own version of this, pending one chip which I'm picking up tomorrow. Other than that, I'm getting readings from everything, which is encouraging!
I was hoping if you could share your code (the arduino sketch for formatting) and the PC project also?
Outside of the rain sensor, which obviously NEEDS to get wet, are the other sensors OK to be behind a clear cover (ie would the IR sensor and the light sensor suffer)? I'm trying to minimise holes in the case if I can. This will somewhat change the type of project box I select.
Thanks for putting together this project. It's been fun so far.
Rob
peter_4059
25-05-2020, 03:05 PM
Hi Rob. I'm not sure about the IR sensor as it depends if the clear cover attenuates IR.
You can test the rain sensor by placing a drop of water on it with your finger.
You should be able to try it with/without the cover in place and see if the readings change. Happy to share the code - just need to work out how to get it to you.
turbo_pascale
25-05-2020, 04:46 PM
Hi Peter,
I've purchased (on order) a couple of different project boxes, one with a clear cover. When it arrives I'll test the difference between beneath and above the cover and see what happens.
If you can use Dropbox (free for their basic version), it's pretty easy to transfer a file/zip etc. If you don't use it, send me a PM and I'll send you a referral link - it's simple to use.
I've got all the readings, but I'm trying to work on the best approach to get the data stored away and formatted. I'm going to probably do with the PC solution anyway (the observatory PC is always going to be on if I'm imaging), but I might make a version that could run independently on a Raspberry Pi or similar once I got a feel for the file creation.
Thanks again
Rob
peter_4059
25-05-2020, 04:49 PM
Hi Rob,
Here's my Arduino sketch. Could probably be a bit tidier but it works :).
I'll zip the VB code and put it on google drive for you. You might also need the excel spreadsheet to see how the calibration works and add your own data points.
//
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>
#include "Adafruit_TSL2591.h"
#include "Adafruit_SHT31.h"
#include "DHT.h"
Adafruit_BMP085 bmp;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); // pass in a number for the sensor identifier (for your use later)
Adafruit_SHT31 sht31 = Adafruit_SHT31();
#define DHTPIN 12 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
int LightSensorPin = A3; // select the input pin for LDR
float lsv = 0; // variable to store the value coming from the sensor
int RainSensorPin = A1; // select the input pin for Rain
float rsv = 0; // variable to store the rain sensor value
int WindSensorPin = A2; // select the input pin for Wind
float wsv = 0; // variable to store the wind sensor value
boolean debug = false;
uint16_t ir;
uint16_t full;
float IR;
float FULL;
float vis;
float lux;
float del;
float last;
float current = 10000;
float nightTh = 10;
float dayTh = 10000;
bool allowChange = true;
int readCount = 0;
String mode = "DAY";
int tslm=1;
char val; // data received from serial port
int ledPin = 13;
boolean ledState = LOW;
boolean contact = false;
int waitTime;
int delayTime = 0;
unsigned long startTime;
unsigned long finishTime;
void setup() {
pinMode(ledPin, OUTPUT); // set ledPin pin as output
Serial.begin(9600);
dht.begin();
mlx.begin();
bmp.begin();
tsl.begin();
sht31.begin();
// start with TSL sensor in DAY mode
tsl.setGain(TSL2591_GAIN_LOW); // 1x gain (bright light)
tsl.setTiming(TSL2591_INTEGRATIONTI ME_500MS);
establishContact(); // send an 'A' down the serial port until the PC responds
}
void loop() {
startTime=millis();
if (Serial.available() > 0){
val = Serial.read();
delayTime = val - 48;
}
if (delayTime==0){
ledState = LOW; // turn the LED off
contact = false;
digitalWrite(ledPin, ledState);
waitTime = 1000;
}
if (delayTime>0){
ledState = HIGH; // turn the LED on
contact = true;
digitalWrite(ledPin, ledState);
waitTime = 1000 * delayTime;
}
//perform the TSL light readings and gain control functions
last = current;
sensorRead(); // perform sensor read routine
// Serial.print(F("Mode: ")); Serial.print(mode); Serial.print(F(" "));
// Serial.print(F("ReadCount: ")); Serial.print(readCount); Serial.print(F(" "));
// Serial.print(F("AllowChange: ")); Serial.print(allowChange); Serial.print(F(" "));
// Serial.print(F("Last: ")); Serial.print(last); Serial.print(F(" "));
// Serial.print(F("Current: ")); Serial.println(current);
if((current < last) && (mode == "DAY")){
// getting darker and in Day mode - consider night mode
//Serial.println(F("running night mode routine"));
nightMode();
}
else if ((current >= last) && (mode == "NIGHT")){
// getting lighter and in Night mode - consider day mode
//Serial.println(F("running day mode routine"));
dayMode();
}
if(readCount > 6){
allowChange = true;
}
// read the other sensors
// Read humidity and temperature from the SHT31
float sh = sht31.readHumidity();
float st = sht31.readTemperature();
// Read humidity and temperature from the DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
// Read ambinet and sky temperature from the MLX
float a = mlx.readAmbientTempC();
float s = mlx.readObjectTempC();
// Read barometric pressure at ambient temperature from BMP
float at = bmp.readTemperature();
float p = bmp.readPressure() / 100;
// read the value from the LDR light sensor
lsv = analogRead(LightSensorPin);
// read the value from the rain sensor
rsv = analogRead(RainSensorPin);
// read the value from the wind sensor
wsv = analogRead(WindSensorPin);
// random number to include in checksum
int rcs = int(random(0,99));
// checksum based on BMP pressure, DHT Humidity, Rain, Light, Vis and IR values
// int chksum = int(st)+int(t)+int(a)+int(at)+int(r sv)+int(wsv)+rcs;
int chksum = int(p)+int(IR)+int(vis)+int(tslm)+i nt(rsv)+int(wsv)+rcs;
if (contact==true) {
// set up print string for PC interface
String dataTrans = "V:";
dataTrans += String(st,1); // SHT31 ambient temp
dataTrans += String(':');
dataTrans += String(t,1); // DHT ambient temp
dataTrans += String(':');
dataTrans += String(a,1); // MLX ambient temp
dataTrans += String(':');
dataTrans += String(at,1); // BMP ambient temp
dataTrans += String(':');
dataTrans += String(p,0); // barometric pressure
dataTrans += String(':');
dataTrans += String(sh,1); // SHT31 humidity
dataTrans += String(':');
dataTrans += String(h,1); // DHT humidity
dataTrans += String(':');
dataTrans += String(s,1); // sky temperature
dataTrans += String(':');
dataTrans += String(lsv,0); // LDR coarse light sensor
dataTrans += String(':');
dataTrans += String(IR,0); // TSL light sensor IR
dataTrans += String(':');
dataTrans += String(vis,0); // TSL light sensor visible
dataTrans += String(':');
dataTrans += String(FULL,0); // TSL light sensor full
dataTrans += String(':');
dataTrans += String(lux,4); // TSL light sensor lux
dataTrans += String(':');
dataTrans += String(tslm); // TSL mode (0=night, 1=day)
dataTrans += String(':');
dataTrans += String(rsv,0); // rain sensor value
dataTrans += String(':');
dataTrans += String(wsv,0); // wind sensor value
dataTrans += String(':');
dataTrans += String(rcs); // random integer
dataTrans += String(':');
dataTrans += String(chksum); // checksum value
dataTrans += String(';');
//send the string to the PC
Serial.println(dataTrans); //
}
else {
Serial.println("A");
}
finishTime=millis();
int elapsedTime = int(finishTime - startTime);
if (waitTime > elapsedTime){
// Pause between measurements.
delay(waitTime - elapsedTime);
}
}
void establishContact() {
while (Serial.available() <= 0){
Serial.println("A");
delay(1000);
}
}
void sensorRead() {
// Advanced data read. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum
uint32_t lum = tsl.getFullLuminosity();
uint16_t ir, full;
ir = lum >> 16;
full = lum & 0xFFFF;
lux = tsl.calculateLux(full, ir);
IR = float(ir);
FULL = float(full);
vis = full - ir;// TSL visible light
current = FULL;
//Serial.print(F("IR: ")); Serial.print(ir); Serial.print(F(" "));
//Serial.print(F("full: ")); Serial.print(full); Serial.print(F(" "));
//Serial.print(F("vis: ")); Serial.print(vis); Serial.print(F(" "));
//Serial.print(F("lux: ")); Serial.println(lux);
readCount = readCount + 1;
return;
}
void nightMode() {
if(debug) Serial.println(F("running night mode routine"));
if((current < nightTh) && (allowChange = true)){
if(debug) Serial.println(F("met criteria - change to night mode"));
// Serial.print(F("Mode: ")); Serial.print(mode); Serial.print(F(" "));
// Serial.print(F("Current: ")); Serial.print(current); Serial.print(F(" "));
// Serial.print(F("nightTh: ")); Serial.print(nightTh); Serial.print(F(" "));
// Serial.print(F("allow change: ")); Serial.println(allowChange);
tsl.setGain(TSL2591_GAIN_HIGH); // switch to night mode 428x gain
mode = "NIGHT";
tslm = 0;
allowChange = false; // switch allow change to false
readCount = 0;
return;
}
return;
}
void dayMode() {
if(debug) Serial.println(F("running day mode routine"));
if((current > dayTh) && (allowChange = true)){
if(debug) Serial.println(F("met criteria - change to day mode"));
// Serial.print(F("Mode: ")); Serial.print(mode); Serial.print(F(" "));
// Serial.print(F("Current: ")); Serial.print(current); Serial.print(F(" "));
// Serial.print(F("dayTh: ")); Serial.print(dayTh); Serial.print(F(" "));
// Serial.print(F("allow change: ")); Serial.println(allowChange);
tsl.setGain(TSL2591_GAIN_LOW); // switch to day mode 1x gain
mode = "DAY";
tslm = 1;
allowChange = false; // switch allow change to false
readCount = 0;
return;
}
return;
}
turbo_pascale
26-05-2020, 12:35 AM
Peter,
Did you end up using that hot-wire wind sensor? I hadn't included a wind sensor yet. I've a weather station setup that is running in to a raspberry pi and pushing data to a web server, but I haven't got around to being particularly clever with that yet in order to use it with this project.
http://weather.turbotalkstech.com
peter_4059
26-05-2020, 07:02 AM
No Rob - I'm using the Adafruit cup anemometer.
https://core-electronics.com.au/anemometer-wind-speed-sensor-w-analog-voltage-output.html?utm_source=google_shopp ing&gclid=CjwKCAjw2a32BRBXEiwAUcugiKVMc 7Yy7Rk6PUl2I46PJGHHbo29QOLF60giY8ro ScyIkb-r3QIW_xoChXcQAvD_BwE
It works fine for my purposes however if I was doing it all again I'd probably go for the hot wire sensor as it is a fraction of the cost, no moving parts and probably easier to install/incorporate in the project.
https://moderndevice.com/product/wind-sensor-rev-p/
Both options are a bit flimsy compared to the gold finger one Boltwood use however I haven't found a supplier of that type yet.
turbo_pascale
26-05-2020, 09:46 AM
Thanks Peter,
I got your link - I'll start going through it all and start to consume it!
Thanks for the sketch as well. 98% of it is the same as what I've already done of course, being the nature of the libraries!
I took the plunge and ordered one of the hot-wire wind sensors, although the shipping was ridiculously expensive. I'll let you know how it goes when it arrives.
I will no doubt have many questions! Again, I very much appreciate the effort you've put in to this.
peter_4059
26-05-2020, 01:05 PM
No problem Rob. Hope you enjoy it and if you ever work out how to write an Ascom driver, there are a number of parameters that the kit measures that the generic Boltwood driver does not pick up.
turbo_pascale
26-05-2020, 01:12 PM
Peter,
That's my "one day wish" to see if I can do that with ASCOM.
I'm hoping to get the template for one for the ObservingConditions driver and see if I can modify it, but, I need to get the sensor kit setup first!
One overwhelming project at a time though!!
peter_4059
26-05-2020, 02:32 PM
The source code is available for the observing conditions driver - I just cant figure it out!
What does the VB code do Peter? Is that for a separate GUI to the generic ASCOM driver interface?
peter_4059
28-05-2020, 07:50 PM
The VB code takes the raw sensor data string that the Arduino sends down the serial interface via the computer com port (the sketch I posted above makes this happen) and manipulates that into a set of data to be presented on the PC including a prediction of cloud cover based on ambient temperature, sky temperature and relative humidity.
A lot of the code is about the PC GUI that I've shown in previous screenshots in this thread. All up it is about 1000 lines of visual basic code. It also generates a text file that the generic Ascom driver reads to create an interface to image control software like SGP.
Ahhh. Thanks for explaining. Thought the arduino code might have been larger, but sounds like VB is where most of the magic is happening. :thumbsup:
peter_4059
28-05-2020, 09:06 PM
Rob,
In my original attempts I performed all of the cloud calcs in the Arduino however as the project developed I made a decision to use the Arduino to just export the raw sensor data and do the heavy lifting in the computer in VB as this was easier to manage as I started changing stuff and making things more complicated.
stephen2615
29-05-2020, 01:34 PM
I just found this thread and I am experimenting with a similar concept. I have a Raspberry Pi collecting similar data. I hope to send the data to my NUC (via a socket or even serial if I can be bothered) and then use it to provide some extra ASCOM data (I only have temp and humidity from my Pegasus Pocket Powerbox). I also want to figure out how to send me an alert if cloud cover comes in but that is not really important as I have a good idea of any cloud. Fog is the problem here in winter.
I am very interested in how you make a prediction of cloud cover based on ambient temperature, sky temperature and relative humidity.
Regards
Stephen
peter_4059
29-05-2020, 03:19 PM
Hi Stephen,
All of the commercial cloud detectors measure the ambient and sky temperature. When the sky is clear, the sky temperature is about 20 degC below the ambient temperature. When there is cloud cover, the sky temperature approaches the ambient temperature (ie the delta T reduces). I initially set up my Arduino project on this basis however I noticed the delta T vs cloud cover relationship wasn't constant such that the model was predicting cloud when it was actually clear. I went searching for any modelling that had been done and found a paper that compared models used for prediction of sky temperatures. Some of those models use cloud cover in the prediction and some use water partial pressure (which is a function of relative humidity). Since I'm directly measuring the sky temperature but want to predict the cloud cover, I rearranged the equations in a couple of those models and that is what my cloud prediction model uses.
troypiggo
29-05-2020, 04:23 PM
Check out the big brain on Peter :nerd:
peter_4059
29-05-2020, 04:35 PM
Use it or you'll lose it ;)
stephen2615
29-05-2020, 08:05 PM
Hi Peter,
What sort of model did you come up with if you don't mind me asking? Is there just some sort of a correlation between the ambient ground level and sky temp with the relative humidity and then trying to forecast the lifting condensation level or something along those lines?
I don't know what time the radiation fog sets in here but basically in winter, the humidity is 99% from about 30 mins past sunset to sometime the next morning or on a bad day, sometimes early afternoon.
I have never been convinced of a (cheaper) sensor's ability to accurately measure relative humidity compared to the web bulb method that is used to get perfect measurements. Those couple of percentage points can make all the difference.
Cheers
Stephen
peter_4059
29-05-2020, 09:36 PM
Stephen,
The models I'm using work on emissivity calculations. One model predicts the clear sky emissivity and the other one back calculates the cloud cover based on the observation of actual emissivity (calculated from ambient and sky temperature measurement). I've used the form of equations from literature but fitted the coefficients of the literature models to my local observations.
I also heard the DHT humidity sensors can be a bit hit and miss so ended up changing to an Adafruit SHT31 to get a more accurate humidity measurement.
https://www.adafruit.com/product/2857
stephen2615
30-05-2020, 01:00 PM
Hi Peter,
Thanks for the info.
That sensor looks interesting if you believe the humidity hype. I might give it a go.
I have been mulling over throwing a light sensor into my range of sensors and seeing what difference it would make. Fog (in my situation) would have to have a different light value than a clear or cloudy sky because the clouds are much higher than fog. Just so many things to play with.
Cheers
Stephen
turbo_pascale
30-05-2020, 01:46 PM
I hadn't seen this before, but the author of the myFocuser arduino project also has a Sky Quality Meter project which uses all the same components as described here in Peter's project.
His code for the Cloud Sensor side of things is pretty rudimentary compared with Peter's.
However, the project as a whole adds a few possibilities in the ASCOM driver side of things which may make it a bit easier to use than pushing files around.
https://sourceforge.net/projects/arduinomysqmskyqualitymeter/
stephen2615
15-06-2020, 04:35 PM
Hi Peter,
I just "discovered" ASCOM Alpaca. The mind boggles what can be exported from my RPi to my imaging computer. Have you looked at it?
Cheers
Stephen
peter_4059
15-06-2020, 05:42 PM
Hi Stephen,
I hadn't seen it before and had a brief look however it looks a bit beyond my current skills atm.
vBulletin® v3.8.7, Copyright ©2000-2025, vBulletin Solutions, Inc.