uCAM III-application (including TCP- and HTTP transfer)

I just take Rick’s word for it but IIRC in his tests he had a 50-60% overhead due to the permanent handshaking.

1 Like

That’s looking great!

Can’t test for myself as I am still waiting for my Photon to arrive, but I’m thrilled and can’t wait to test things on an Electron as well.

I’m not really too fussed about some overhead; the small images should keep the amount of data pretty low anyway.

So for the Electron example will Node JS be required to receive the pictures sent by the Electron?

The only thing I think needs added to the web interface options is the ability to adjust the brightness and contrast for when the image gets washed out due to lighting conditions.

I’m also curious if there is a way to have the image auto-update automatically in the web browser at a set frequency like every 10-20-30-60 seconds or so?

@ScruffR Here are some issues I’m seeing when testing the code + camera.

It always works inside the house or in lower light levels.

When I point it towards an outside facing window where the picture has the sun and is really bright when I try to take an image JPG 640 x 480 image the Photon it will try to start taking the picture and the blue LED will light up but the Photon will then go to blinking RED on the status led and eventually restart the Photon.

If I take the outside picture in the lower resolution 320 x 240 JPG it works fine but when I switch back to 640 x 480 and take bright pictures the photon will send the red SOS panic LED again for some reason.

If you take the kit outside in bright sunlight does the same thing happen to you?

The photon was not in the direct sunlight but shielded from direct sunlight.

I switched wiring and it still happens.

Also is there anywhere Particle Process should be called during the image transfer process because I’ve seen the Blue flashing status LED switch to Green flashing LED when trying to take bright outdoor pictures for some reason.

It’s weird this does not happen inside when the light is not as bright.

The 320x240 JPGs will be between 10k & 20k depending on the image and its compressability.

I haven't tried "overly" bright images, but since the content of the image influences the compressability it might be that my static buffer gets too small for images that won't compress well.
But since the buffer is not part of the library but does get provided to the lib by the user app, you can increase the size at will.

I guess so, but nothing is fix yet, I've not yet started implementing the sample.

I'm not going to add an auto-update feature, but may consider adding the CBE settings in the sample, but not before the TCPClient sample.
You can extend the demo as you wish - the library provides the functions to change the settings.

Good to hear! I'll play with the buffer size and see what happens.

I wonder if there is a way to just send the picture data to an email address? No idea if that's easy to do or not.

Makes sense. Getting this running on the Electron was the initial goal anyways.

The outdoor pictures did seem to adjust to the brighter images just fine with the images I got at 320x240. I'll do some more testing once I increase the buffer size and get some outdoor 640 sized images.

Keep up the great work! :wink:

1 Like

@ScruffR When changing the image buffer size I just need to worry about this image buffer line correct?

I’ve tried changing this to 56960 and 46960 and the compile but the program does not run correctly.

I’m assuming I need to increase by a certain number for this to work correctly with other code maybe?

What would you recommend as a buffer size that should work but not take up more memory than needed?

You are correct about the imageBuffer but what does this mean?

This is a rather vague symptom description :wink:

I'd have to do some tests.


Update:
I've now added the contrast, brightness and exposure settings and made the page "remember" the last settings.
But I couldn't reproduce your crashing even with a rather bright picture

Are you using a uCamIII or uCamII?
I'm not sure whether the uCamII supports contrast/brightness/exposure and the JPG compression might be a bit weaker than on the uCamIII.

1 Like

When I change the image buffer size to 46960 the photon does not take pictures.

If I increase to 56960 the Photon breathes white. Do you see the same thing?

Sweet! Remembering the last settings is helpful.

Happens every time I try an outside bright picture for some reason, this is on and off a breadboard.

I'm using the same camera that was sent to you, the ucam3.

1 Like

I tried the new library sketch and it’s working great.

I still can not take pictures out the outside without the Photon going into flashing red SOS mode and then restarting. If I switch to 320x240 jpg size mode it works perfectly.

I found an auto refresh add-on app for Firefox browser so now it automatically updates the picture in the browser every 15 seconds automatically which is nice.

The only thing I found myself wanting was to know what time the picture on the webpage was taken. Like a timestamp below the image and above the Download Image Link.

This is pretty cool.

The only thing it leaves me wishing for is a sharper image :slight_smile:

That would be easy to add, but I want to leave some puzzles for you to solve :wink:
The web page is all there to add some <label> tag and when you extend the P(script) and the respective snprintf() that uses it as format string and populates it with the settings, you just add the timestamp there and there you are.

You can turn the lense to adjust focus it that'd be the reason.

I'll try to reproduce your SOS panic. How many blinks do follow the SOS?

BTW, there is a commented SerialLogHanlder line at the top of the sketch. When you uncomment that, you can get some trace output via USB Serial that might help narrowing down the problem.
The extra time for the logging might break the transfer due to timeouts but the SOS panic should happen before that, so the trace output would be helpful.

Cool, the date and time is not a big deal so I’m cool with the way it is now.

I emailed Arducam to ask if they had any higher resolution camera modules that work on the same commands that the uCamIII does. Doubt they have any but I figured it was worth asking.

I will see what I get on the Serial Log output next time I give it a try. I’m assuming it’s an image size and buffer being not large enough issue.

Yup, with logging on, with 46960 you get this info

0000000520 [hal.wlan] TRACE: Free RAM connect: 7720

~7KB is not a lot when you start off before the Webserver is instantiated.

With 40960 you do get this

0000000521 [hal.wlan] TRACE: Free RAM connect: 13720

So you haven't got a lot of room to play with to increase the buffer, but as I'm still unable to make my 640x480 high dynamic JPGs any bigger than ~32KB I'm stumped by how you do it.
Maybe the log will reveal how big your images actually get.

Have you played with different CBE settings?
Do they have any impact on the image size?

However, since the uCam delivers JPGs in chunks of max 512 byte at a time, splitting an image up and transfer it slice by slice is an option - just not for the example app.

    if (imageType == uCamIII_SNAP_JPEG)
      for (int received = 0, chunk = 0; (received < imageSize) && (chunk = ucam.getJpegData(&imageBuffer[received], 512, callback)); received += chunk);

The actual intent if the library is to enable users to incorporate the uCam into their own project, not to deliver a fully fledged solution.
The examples should just be a show case of what's possible and help getting started :wink:


I've rearranged the select fields a bit and while doing so I've also incorporated your image timestamp :wink:
https:/go.particle.io/shared_apps/5ac87e29fd44eba92e0002fe
Latest revision: Particle Web IDE

1 Like

@ScruffR

Inside pictures work fine but here is the Serial Log when I point the camera outside on a sunny day.

The log shows the output after the Photon resets from the previous SOS error.

The SOS panic happens after this last line.

0000061796 [app] TRACE: defaultCmd
0000062118 [app] TRACE: hardReset
0000062138 [app] TRACE: sync
0000062138 [app] TRACE: sendCmdWithAck
0000062138 [app] TRACE: sendCmd
0000062138 [app] INFO: sendCmd: AA 0D 00 00 00 00
0000062139 [app] TRACE: expectPackage(0e,0d)
0000062639 [app] WARN: timeout: 00 00 00 00 00 00 (6)
0000062639 [app] TRACE: sendCmdWithAck
0000062639 [app] TRACE: sendCmd
0000062639 [app] INFO: sendCmd: AA 0D 00 00 00 00
0000062640 [app] TRACE: expectPackage(0e,0d)
0000063140 [app] WARN: timeout: 00 00 00 00 00 00 (7)
0000063140 [app] TRACE: sendCmdWithAck
0000063140 [app] TRACE: sendCmd
0000063140 [app] INFO: sendCmd: AA 0D 00 00 00 00
0000063140 [app] TRACE: expectPackage(0e,0d)
0000063141 [app] TRACE: received: AA 0E 0D 00 00 00
0000063142 [app] INFO: sync after 3 tries
0000063142 [app] TRACE: expectPackage(0d,ff)
0000063142 [app] TRACE: received: AA 0D 00 00 00 00
0000063142 [app] TRACE: sendCmd
0000063143 [app] INFO: sendCmd: AA 0E 0D 00 00 00
0000063143 [app] TRACE: setImageFormat
0000063143 [app] TRACE: sendCmdWithAck
0000063143 [app] TRACE: sendCmd
0000063143 [app] INFO: sendCmd: AA 01 00 07 07 07
0000063144 [app] TRACE: expectPackage(0e,01)
0000063194 [app] TRACE: received: AA 0E 01 01 00 00
0000063194 [app] TRACE: setCBE
0000063194 [app] TRACE: sendCmdWithAck
0000063194 [app] TRACE: sendCmd
0000063195 [app] INFO: sendCmd: AA 14 02 02 02 00
0000063195 [app] TRACE: expectPackage(0e,14)
0000063203 [app] TRACE: received: AA 0E 14 02 00 00
0000063203 [app] TRACE: takeSnapshot
0000063203 [app] TRACE: sendCmdWithAck
0000063204 [app] TRACE: sendCmd
0000063204 [app] INFO: sendCmd: AA 05 00 00 00 00
0000063204 [app] TRACE: expectPackage(0e,05)
0000063205 [app] TRACE: received: AA 0E 05 03 00 00
0000063705 [app] TRACE: setPackageSize
0000063706 [app] TRACE: sendCmdWithAck
0000063706 [app] TRACE: sendCmd
0000063706 [app] INFO: sendCmd: AA 06 08 00 02 00
0000063706 [app] TRACE: expectPackage(0e,06)
0000063707 [app] TRACE: received: AA 0E 06 04 00 00
0000063708 [app] TRACE: getPicture
0000063708 [app] TRACE: sendCmdWithAck
0000063708 [app] TRACE: sendCmd
0000063708 [app] INFO: sendCmd: AA 04 01 00 00 00
0000063708 [app] TRACE: expectPackage(0e,04)
0000063709 [app] TRACE: received: AA 0E 04 05 00 00
0000063710 [app] TRACE: expectPackage(0a,01)
0000063710 [app] TRACE: received: AA 0A 01 1C 1B 01
0000063710 [app] INFO:
ImageSize: 72476
0000063710 [app] TRACE: getJpegData
0000063711 [app] TRACE: sendCmd
0000063711 [app] INFO: sendCmd: AA 0E 00 00 00 00
0000063757 [app] TRACE: getJpegData
0000063757 [app] TRACE: sendCmd
0000063757 [app] INFO: sendCmd: AA 0E 00 00 01 00
0000063803 [app] TRACE: getJpegData
0000063803 [app] TRACE: sendCmd
0000063803 [app] INFO: sendCmd: AA 0E 00 00 02 00
0000063849 [app] TRACE: getJpegData
0000063850 [app] TRACE: sendCmd
0000063850 [app] INFO: sendCmd: AA 0E 00 00 03 00
0000063896 [app] TRACE: getJpegData
0000063896 [app] TRACE: sendCmd
0000063896 [app] INFO: sendCmd: AA 0E 00 00 04 00
0000063942 [app] TRACE: getJpegData
0000063942 [app] TRACE: sendCmd
0000063942 [app] INFO: sendCmd: AA 0E 00 00 05 00
0000063988 [app] TRACE: getJpegData
0000063989 [app] TRACE: sendCmd
0000063989 [app] INFO: sendCmd: AA 0E 00 00 06 00
0000064035 [app] TRACE: getJpegData
0000064035 [app] TRACE: sendCmd
0000064035 [app] INFO: sendCmd: AA 0E 00 00 07 00
0000064081 [app] TRACE: getJpegData
0000064081 [app] TRACE: sendCmd
0000064081 [app] INFO: sendCmd: AA 0E 00 00 08 00
0000064127 [app] TRACE: getJpegData
0000064127 [app] TRACE: sendCmd
0000064128 [app] INFO: sendCmd: AA 0E 00 00 09 00
0000064174 [app] TRACE: getJpegData
0000064174 [app] TRACE: sendCmd
0000064174 [app] INFO: sendCmd: AA 0E 00 00 0A 00
0000064220 [app] TRACE: getJpegData
0000064220 [app] TRACE: sendCmd
0000064220 [app] INFO: sendCmd: AA 0E 00 00 0B 00
0000064266 [app] TRACE: getJpegData
0000064266 [app] TRACE: sendCmd
0000064267 [app] INFO: sendCmd: AA 0E 00 00 0C 00
0000064313 [app] TRACE: getJpegData
0000064313 [app] TRACE: sendCmd
0000064313 [app] INFO: sendCmd: AA 0E 00 00 0D 00
0000064359 [app] TRACE: getJpegData
0000064359 [app] TRACE: sendCmd
0000064359 [app] INFO: sendCmd: AA 0E 00 00 0E 00
0000064405 [app] TRACE: getJpegData
0000064405 [app] TRACE: sendCmd
0000064405 [app] INFO: sendCmd: AA 0E 00 00 0F 00
0000064452 [app] TRACE: getJpegData
0000064452 [app] TRACE: sendCmd
0000064452 [app] INFO: sendCmd: AA 0E 00 00 10 00
0000064498 [app] TRACE: getJpegData
0000064498 [app] TRACE: sendCmd
0000064498 [app] INFO: sendCmd: AA 0E 00 00 11 00
0000064544 [app] TRACE: getJpegData
0000064544 [app] TRACE: sendCmd
0000064544 [app] INFO: sendCmd: AA 0E 00 00 12 00
0000064590 [app] TRACE: getJpegData
0000064591 [app] TRACE: sendCmd
0000064591 [app] INFO: sendCmd: AA 0E 00 00 13 00
0000064637 [app] TRACE: getJpegData
0000064637 [app] TRACE: sendCmd
0000064637 [app] INFO: sendCmd: AA 0E 00 00 14 00
0000064683 [app] TRACE: getJpegData
0000064683 [app] TRACE: sendCmd
0000064683 [app] INFO: sendCmd: AA 0E 00 00 15 00
0000064729 [app] TRACE: getJpegData
0000064730 [app] TRACE: sendCmd
0000064730 [app] INFO: sendCmd: AA 0E 00 00 16 00
0000064776 [app] TRACE: getJpegData
0000064776 [app] TRACE: sendCmd
0000064776 [app] INFO: sendCmd: AA 0E 00 00 17 00
0000064822 [app] TRACE: getJpegData
0000064822 [app] TRACE: sendCmd
0000064822 [app] INFO: sendCmd: AA 0E 00 00 18 00
0000064868 [app] TRACE: getJpegData
0000064868 [app] TRACE: sendCmd
0000064869 [app] INFO: sendCmd: AA 0E 00 00 19 00
0000064915 [app] TRACE: getJpegData
0000064915 [app] TRACE: sendCmd
0000064915 [app] INFO: sendCmd: AA 0E 00 00 1A 00
0000064961 [app] TRACE: getJpegData
0000064961 [app] TRACE: sendCmd
0000064961 [app] INFO: sendCmd: AA 0E 00 00 1B 00
0000065007 [app] TRACE: getJpegData
0000065007 [app] TRACE: sendCmd
0000065008 [app] INFO: sendCmd: AA 0E 00 00 1C 00
0000065054 [app] TRACE: getJpegData
0000065054 [app] TRACE: sendCmd
0000065054 [app] INFO: sendCmd: AA 0E 00 00 1D 00
0000065100 [app] TRACE: getJpegData
0000065100 [app] TRACE: sendCmd
0000065100 [app] INFO: sendCmd: AA 0E 00 00 1E 00
0000065146 [app] TRACE: getJpegData
0000065146 [app] TRACE: sendCmd
0000065146 [app] INFO: sendCmd: AA 0E 00 00 1F 00
0000065193 [app] TRACE: getJpegData
0000065193 [app] TRACE: sendCmd
0000065193 [app] INFO: sendCmd: AA 0E 00 00 20 00
0000065239 [app] TRACE: getJpegData
0000065239 [app] TRACE: sendCmd
0000065239 [app] INFO: sendCmd: AA 0E 00 00 21 00
0000065285 [app] TRACE: getJpegData
0000065285 [app] TRACE: sendCmd
0000065285 [app] INFO: sendCmd: AA 0E 00 00 22 00
0000065331 [app] TRACE: getJpegData
0000065332 [app] TRACE: sendCmd
0000065332 [app] INFO: sendCmd: AA 0E 00 00 23 00
0000065378 [app] TRACE: getJpegData
0000065378 [app] TRACE: sendCmd
0000065378 [app] INFO: sendCmd: AA 0E 00 00 24 00
0000065424 [app] TRACE: getJpegData
0000065424 [app] TRACE: sendCmd
0000065424 [app] INFO: sendCmd: AA 0E 00 00 25 00
0000065470 [app] TRACE: getJpegData
0000065471 [app] TRACE: sendCmd
0000065471 [app] INFO: sendCmd: AA 0E 00 00 26 00
0000065517 [app] TRACE: getJpegData
0000065517 [app] TRACE: sendCmd
0000065517 [app] INFO: sendCmd: AA 0E 00 00 27 00
0000065563 [app] TRACE: getJpegData
0000065563 [app] TRACE: sendCmd
0000065563 [app] INFO: sendCmd: AA 0E 00 00 28 00
0000065609 [app] TRACE: getJpegData
0000065609 [app] TRACE: sendCmd
0000065610 [app] INFO: sendCmd: AA 0E 00 00 29 00
0000065656 [app] TRACE: getJpegData
0000065656 [app] TRACE: sendCmd
0000065656 [app] INFO: sendCmd: AA 0E 00 00 2A 00
0000065702 [app] TRACE: getJpegData
0000065702 [app] TRACE: sendCmd
0000065702 [app] INFO: sendCmd: AA 0E 00 00 2B 00
0000065748 [app] TRACE: getJpegData
0000065748 [app] TRACE: sendCmd
0000065749 [app] INFO: sendCmd: AA 0E 00 00 2C 00
0000065795 [app] TRACE: getJpegData
0000065795 [app] TRACE: sendCmd
0000065795 [app] INFO: sendCmd: AA 0E 00 00 2D 00
0000065841 [app] TRACE: getJpegData
0000065841 [app] TRACE: sendCmd
0000065841 [app] INFO: sendCmd: AA 0E 00 00 2E 00
0000065887 [app] TRACE: getJpegData
0000065887 [app] TRACE: sendCmd
0000065887 [app] INFO: sendCmd: AA 0E 00 00 2F 00
0000065933 [app] TRACE: getJpegData
0000065934 [app] TRACE: sendCmd
0000065934 [app] INFO: sendCmd: AA 0E 00 00 30 00
0000065980 [app] TRACE: getJpegData
0000065980 [app] TRACE: sendCmd
0000065980 [app] INFO: sendCmd: AA 0E 00 00 31 00
0000066026 [app] TRACE: getJpegData
0000066026 [app] TRACE: sendCmd
0000066026 [app] INFO: sendCmd: AA 0E 00 00 32 00
0000066072 [app] TRACE: getJpegData
0000066073 [app] TRACE: sendCmd
0000066073 [app] INFO: sendCmd: AA 0E 00 00 33 00
0000066119 [app] TRACE: getJpegData
0000066119 [app] TRACE: sendCmd
0000066119 [app] INFO: sendCmd: AA 0E 00 00 34 00
0000066165 [app] TRACE: getJpegData
0000066165 [app] TRACE: sendCmd
0000066165 [app] INFO: sendCmd: AA 0E 00 00 35 00
0000066211 [app] TRACE: getJpegData
0000066211 [app] TRACE: sendCmd
0000066212 [app] INFO: sendCmd: AA 0E 00 00 36 00
0000066258 [app] TRACE: getJpegData
0000066258 [app] TRACE: sendCmd
0000066258 [app] INFO: sendCmd: AA 0E 00 00 37 00
0000066304 [app] TRACE: getJpegData
0000066304 [app] TRACE: sendCmd
0000066304 [app] INFO: sendCmd: AA 0E 00 00 38 00
0000066350 [app] TRACE: getJpegData
0000066350 [app] TRACE: sendCmd
0000066351 [app] INFO: sendCmd: AA 0E 00 00 39 00
0000066397 [app] TRACE: getJpegData
0000066397 [app] TRACE: sendCmd
0000066397 [app] INFO: sendCmd: AA 0E 00 00 3A 00
0000066443 [app] TRACE: getJpegData
0000066443 [app] TRACE: sendCmd
0000066443 [app] INFO: sendCmd: AA 0E 00 00 3B 00
0000066489 [app] TRACE: getJpegData
0000066489 [app] TRACE: sendCmd
0000066489 [app] INFO: sendCmd: AA 0E 00 00 3C 00
0000066535 [app] TRACE: getJpegData
0000066536 [app] TRACE: sendCmd
0000066536 [app] INFO: sendCmd: AA 0E 00 00 3D 00
0000066582 [app] TRACE: getJpegData
0000066582 [app] TRACE: sendCmd
0000066582 [app] INFO: sendCmd: AA 0E 00 00 3E 00
0000066628 [app] TRACE: getJpegData
0000066628 [app] TRACE: sendCmd
0000066628 [app] INFO: sendCmd: AA 0E 00 00 3F 00
0000066674 [app] TRACE: getJpegData
0000066675 [app] TRACE: sendCmd
0000066675 [app] INFO: sendCmd: AA 0E 00 00 40 00
0000066721 [app] TRACE: getJpegData
0000066721 [app] TRACE: sendCmd
0000066721 [app] INFO: sendCmd: AA 0E 00 00 41 00
0000066767 [app] TRACE: getJpegData
0000066767 [app] TRACE: sendCmd
0000066767 [app] INFO: sendCmd: AA 0E 00 00 42 00
0000066813 [app] TRACE: getJpegData
0000066813 [app] TRACE: sendCmd
0000066814 [app] INFO: sendCmd: AA 0E 00 00 43 00
0000066860 [app] TRACE: getJpegData
0000066860 [app] TRACE: sendCmd
0000066860 [app] INFO: sendCmd: AA 0E 00 00 44 00
0000066906 [app] TRACE: getJpegData
0000066906 [app] TRACE: sendCmd
0000066906 [app] INFO: sendCmd: AA 0E 00 00 45 00
0000066952 [app] TRACE: getJpegData
0000066952 [app] TRACE: sendCmd
0000066953 [app] INFO: sendCmd: AA 0E 00 00 46 00
0000066999 [app] TRACE: getJpegData
0000066999 [app] TRACE: sendCmd
0000066999 [app] INFO: sendCmd: AA 0E 00 00 47 00
0000067045 [app] TRACE: getJpegData
0000067045 [app] TRACE: sendCmd
0000067045 [app] INFO: sendCmd: AA 0E 00 00 48 00
0000067091 [app] TRACE: getJpegData
0000067091 [app] TRACE: sendCmd
0000067091 [app] INFO: sendCmd: AA 0E 00 00 49 00
0000067138 [app] TRACE: getJpegData
0000067138 [app] TRACE: sendCmd
0000067138 [app] INFO: sendCmd: AA 0E 00 00 4A 00
0000067184 [app] TRACE: getJpegData
0000067184 [app] TRACE: sendCmd
0000067184 [app] INFO: sendCmd: AA 0E 00 00 4B 00
0000067230 [app] TRACE: getJpegData
0000067230 [app] TRACE: sendCmd
0000067230 [app] INFO: sendCmd: AA 0E 00 00 4C 00
0000067276 [app] TRACE: getJpegData
0000067277 [app] TRACE: sendCmd
0000067277 [app] INFO: sendCmd: AA 0E 00 00 4D 00
0000067323 [app] TRACE: getJpegData
0000067323 [app] TRACE: sendCmd
0000067323 [app] INFO: sendCmd: AA 0E 00 00 4E 00
0000067369 [app] TRACE: getJpegData
0000067369 [app] TRACE: sendCmd
0000067369 [app] INFO: sendCmd: AA 0E 00 00 4F 00
0000067415 [app] TRACE: getJpegData
0000067415 [app] TRACE: sendCmd
0000067416 [app] INFO: sendCmd: AA 0E 00 00 50 00

That is massive!!!
I just don't know how you manage that whatever I do - even pointing the camera directly to the sun - I don't get beyond 32KB.
The log breaks of after 80 (0x50) blocks of 506 bytes (= 40480 byte) transferred and that makes complete sense, just the sheer size of the image doesn't (for me).

Can you try with lower exposure and minimal brightness and contrast whether this reduces the size in any way?

Can you also try 320x240 inside and outside and note the size of the respective images?

320x240 Image Size with Brightness turned to LOW and Exposure at -2 with the camera pointed at sun gives a image size of ImageSize: 19606

Same image with Brightness at Normal and Exposure at 0 gives a image size of ImageSize: 16442

This inside image that is not that bright at 640x480 with default settings almost goes over the buffer size:

For me it’s easy to get the image size above the buffer limit.

I’m for 100% sure using the uCam3 camera.

I’m stumped :flushed:

This is my cam


Maybe they also had some revised firmware on the cam that does a better job with compression.
No idea whether they offer some way to update the firmware.

Obviously I need to find a way to properly split and transfer the image - can’t have the sample SOS just because of slightly different hardware.

Hum…

I guess the 4D Systems forum is a good place for me to bring this up :thinking:

Is there a command for the camera that displays firmware version?

Posted some questions for 4DSystems on their forum here:

Does the image also “explode” when you take a pic directly into an artificial light?
Might make testing weather independent :wink: