Enter Your Electronics & Design Project for a chance to win a $100 Shopping Cart! | Project14 Home | |
Monthly Themes | ||
Monthly Theme Poll |
James Young on twitter mentioned that a UV monitor was something he'd find really useful as he has sensitive skin.
So my thought was to use the PocketBeagle to log the UV exposure using a https://www.element14.com/community/view-product.jspa?fsku=2373588&nsku=NULL&COM=noscriptML8511 chip. It could indicate a warning or send a message to a phone when the levels are too high for too long.
The World Health Organisation have defined a simple index which we can use the determine some colour coded outputs. I was also thinking that the duration of exposure would be significant and the WHO have a second value called the daily UV dose which is calculated as the integral of the UVI over the day.
Input
The ADC inputs on the BeagleBones is typically 0 to 1.8v. However the Pocket Beagle Bone has some pins that can cope with 3.3v. One of these is A6. So I attached a potentiometer between 0v and 3.3v and fed it into the A6 pin. So although the documentation does not explicitly mention it, it would appear that the output 0 -> 1 represents voltages 0 -> 3.3v.
{gallery} Analogue In |
---|
Testing: Wiring up a potentiometer to check the A6 input |
Test 1: Floating |
Test 2: 1v |
Test 3: 3,3v |
Output
To test the output I wired up an RGB LED as below, and checked it using the blink LED demo to confirm the pin I was using for the enable for the ML8511. This turned out to be P1_04.
The System Reference manual for the Pocket Beagle mentions that it supports "4 Pulse Width Modulation outputs accessible with 2 enabled by default"
I checked with the config-pin command to confirm that the pin P2_3 that I wanted to use was enabled for PWM and it appears to be ok.
https://zeekhuge.me/post/a_handfull_of_commands_and_scripts_to_get_started_with_beagleboneblack/
debian@beaglebone:~$ config-pin -l P2_3 default gpio gpio_pu gpio_pd gpio_input pwm
I wired up PWM1A, PWM0A and GPIO23 to the LED and checked that it could dim these using analogWrite
var b = require('bonescript'); var f = 0.1; rampLED = function() { f=f + 0.1; if (f>1) { f=0.1; } b.analogWrite('P2_1', f, 2000.0); b.analogWrite('P1_36', f, 2000.0); b.analogWrite('P2_3', f, 2000.0); }; timer = setInterval(rampLED, 100); stopTimer = function() { clearInterval(timer); }; setTimeout(stopTimer, 30000);
https://github.com/beagleboard/pocketbeagle/wiki/Peripherals
Simple demo
When I combined my code together I found that the analogRead was quite slow to return so I adjusted my code to only check every 10s to avoid reading the value faster than the API could handle.
To test the levels I used the potentiometer and the following simple code:
var b = require('bonescript'); console.log('Starting UVMonitor'); function writeLED(err,value) { var col = [0,0,0]; if (value < 0.3) { col = [0,1,0]; } else if (value < 0.8) { col = [1,1,0]; } else if (value >= 0.8) { col = [1,0,0]; } b.analogWrite('P2_1', col[0], 2000.0); b.analogWrite('P1_36', col[1], 2000.0); b.analogWrite('P2_3', col[2], 2000.0); b.digitalWrite('P1_4', b.LOW); } function checkSensor() { b.pinMode('P1_4', b.OUTPUT); b.digitalWrite('P1_4', b.HIGH); setTimeout(checkInput, 500) } function checkInput() { b.analogRead('A6',writeLED ); } timer = setInterval(checkSensor, 1000);
Using the cloud9 IDE saved the file into the cloud9/autoruns directory so it would start on bootup.
Top Comments