Connecting to Azure IoT hub

The main aim of my dive into IoT was to get a remote device talking to Azure. After getting the IoT device connected to WiFi, flashing LEDs, accepting input from a button and capturing temperature data, it was now time to make that dream a reality.

There are different methods of connecting devices to Azure but for my first attempt I decided to use Azure IoT hub. The first step in that process is to login to the Azure portal and create a new IoT hub.

image

To do this, select the Create menu option in the top left of the Azure IoT hub blade

image

Once you have selected the Azure subscription and Resource group you’ll need to pick a Name for your Azure IoT hub. This name needs to be unique as a URL will be generated from this. Then select a Region and a Tier. You’ll notice that there is a Free tier, which I have selected for this example (very handy for tests like this).

image

Next, you can configure your networking. Because my device will just connect to a public Internet connection I selected Public access.

image

I left the management options as shown above.

image

The add-ons shown here are not available on the Free tier.

image

I didn’t need any tags.

image

I finally get a summary as shown. Note that the cost will be $0 because I am using the Free tier. Select Create to complete the process.

image

After a few minutes you should be able to see you IoT hub as shown above. Select Devices from the menu on the left.

image

Now select Add device from the menu on the right as shown above.

image

Give a the device a Name, and to keep things simple select Symmetric key for the Authentication type as shown. Ensure that the Auto-generate keys is select and that Connect this device to an IoT hub is set to Enable. Select Save to continue.

image

You should now see the device you just created listed as shown above. Select the name of the device to view it’s properties.

image

Here you will find the settings for your device. You’ll need to grab at least one Key and the matching Connection string to use when configuring your device.

With all of that information it’s time to head back and set up the device.

I have uploaded the code to get the device connected to Azure IoT hub here:

https://github.com/directorcia/Azure/blob/master/Iot/huzzah-iothub.ino

It is much more extensive that before and I will admit I am not yet 100% sure of what it all does but basically it connects the device to local Wifi then sends telemetry information to Azure IoT hub.

You’ll also need to have the file iot_config.h in the same directory when compiling your code. You can find an example of that here:

https://github.com/directorcia/Azure/blob/master/Iot/iot_configs.h

that file basically extracts all the unique security information like WiFi password, device keys and IoT Hub URL away from the main code. You’ll need to modify this file to suit your own environment before compiling.

The only other thing you’ll need to do is connect a single LED to pin 5 of the device to act as a diagnostic indicator. It will basically flash when data is sent to Azure IoT hub which gives a nice visual representation of something actually happening on the device.

image

When you compile the code you’ll also need to ensure all the appropriate libraries are available. Details of each of these is contained in the code.

With the compiled code uploaded to the device you should see the LED light start to flash after a few seconds indicating that data is being sent. If you look at the serial port you should see diagnostic data like so:

image

If you then look at the Overview page in the Azure IoT Hub you should the diagnostics reporting a number of messages increasing over time like so:

image

You can also download a tool called the Azure IoT explorer which you will find here:

https://github.com/Azure/azure-iot-explorer/releases

image

When you configure this for your IoT hub environment and drill down into the Device then Telemetry, as shown above, should allow to see the actual information being sent.

So there you have it. Once you have set up an Azure IoT hub and added a device to it you can grab the connection details and plug them into the code you use to configure your device. You can also use the Azure IoT Explorer to get more granular details of what your device is doing.

The next challenge is now to get the device working with Azure IoT central.

Adafruit Huzzah Temperature senor

image

Last project was:

Input from button

Next up now is connecting the DHT20 temperature sensor to the Adafruit Huzzah. The idea is to read data from the sensor and display it via the serial output.

The wiring diagram is shown above and is pretty straight forward. The main thing is to get the pin functions for the sensor. All 4 pins needs to be connected. On the DHT20 pin 1 goes to the 3V output on Huzzah. Next, the DHT20 pin 2 goes to ground on the Huzzah.

The final 2 pins (SCL and SDA) are for serial communications. Thus, DHT20 pin 2 goes to the SCL connection on the Huzzah. Finally, pin 4 from the DHT20 goes to SDA on the Huzzah.

The code is also very straight forward and I found it here:

https://learn.adafruit.com/adafruit-aht20/arduino

and my version is at:

https://github.com/directorcia/Azure/blob/master/Iot/huzzah-tempsens.ino

To make this work you’ll also need to add the following the library:

Adafruit AHTX0

Once you combine all these elements you can compile the code and upload it to the Huzzah. Now, the Huzzah should produce a serial output that looks like:

image

which shows the temperature and humidity of the room.

A pretty simple one when it comes to capturing temperature and humidity.

The next challenge will be to getting data in and out of Azure.

Adafruit Huzzah input from button

After the last project:

Adafruit Huzzah WiFi

I wanted to have the device take input from a switch (which also came in the Starter kit).

Based on my existing projects I now created a configuration of:

image

Pin 4 = Red LED + Resistor (560 ohm)

Pin 5 = Green LED + resistor (560 ohm)

Pin 2 = button

Each of these lines then went to the GND pin.

For the code I found the following article which was a great help:

https://create.arduino.cc/projecthub/muhammad-aqib/arduino-button-tutorial-using-arduino-digitalread-function-08adb5

from which I adapted my own code at:

https://github.com/directorcia/Azure/blob/master/Iot/huzzah-button.c

So that when the button is pressed it swaps which LED is on like so:

ledclick

Of course, it could be improved but I am still calling it a success as all I really wanted to do was incorporate input from an external source.

With all this now done, the next aim is to work out how to connect the device to Azure and get Azure capturing the input from the device and reporting it somehow.

Adafruit Huzzah Wifi

My last IoT challenge was to get an

External flashing LED

working and the next was to get the Adafruit Huzzah with ESP8266 to connect to Wifi. To do that I found most the required code here:

https://learn.adafruit.com/adafruit-feather-huzzah-esp8266/using-arduino-ide#connecting-via-wifi

and I’ve put my code on my Github here:

https://github.com/directorcia/Azure/blob/master/Iot/huzzah-wifi.c

You’ll need to put in your own WiFi access point details at the top of the code to connect to your own environment.

This script uses a lot of commands like:

serial.println

which basically outputs text to a serial port. This allows much easier troubleshooting so you can see what is going on. To see this output you will however need a dedicated serial monitor console program. I started off using Putty:

https://putty.org/

which works great but upon reflection, I wanted to use something that was integrated directly into Visual Studio code. After some poking around I found this extension:

https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-serial-monitor

which is from Microsoft and seems to do what I needed.

image

You can see the output from my code above in serial monitor. Always ensure you match the output port and baud rate in the serial monitor to the device you have (here COM3 and 115200). Configuring this is very easy with the serial monitor extension.

Without much alteration, I was able to take the initial code and easily connect to my network as well as the Internet. Once connected I could ping the Adafruit Huzzah with ESP8266 from another PC in the network. A pretty painless exercise. Nice that things are becoming a little easier now I’m becoming familiar with this stuff.

So far, all I’ve done is use the Adafruit Huzzah with ESP8266 for output. Next, I’ll be to start taking simple input into the device by reading something like a button press and then taking action on that.

Stay tuned for details on that soon.

External flashing LED

My first IoT project was to get the on board LED flashing which I achieved here:

Not as easy as IoT

With that accomplished, I now wanted to get an external LED flashing.

I firstly needed to pick a pin on the Adafruit device to control the output on.

image

I chose the third in from the bottom on the right which is PIN 2.

Next, I needed to work out the maximum output voltage for the Adafruit Feather Huzzah, which turns out to be 3.3 Volts. I also noted the following from the pin output specifications as well:

“be aware the maximum current drawn per pin is 12mA. 6mA recommended”

I also needed to take into account the voltage drop that would occur across the LED, which is around 0.7V. So the voltage for my calculation was now:

3.3V – 0.7V = 2.3V

To work out what resistor I needed to place in the circuit I used the good ole V= IR.

V=IR

R = V/I

R = 2.3 / 0.006

R = 433 ohms

I double checked my logic at:

http://www.anycalculator.com/ohmslaw.htm

I then went through the:

Microsoft Azure IoT Starter Kit w/ Adafruit Feather HUZZAH

I had bought to see what resistors were included. In there I found a 560 ohm resistor. If you need to check your resistor markings like I did, you can use:

https://byjus.com/physics/resistor-colour-codes/

to help discern what you have.

A 560 ohm resistor would means my current would be:

I = V / R

I = 2.3 / 560

I = 4.1 milliamps (well below the 6 milliamp recommendation)

All I needed now was to find the ground for the Adafruit

image

which turned out to be the fourth pin from the top on the left.

I therefore wired up the output from pin 2 on the Adafruit, through the LED, through the resistor and then to ground, completing the circuit.

Now for the code to make it flash.

#include <Arduino.h>

int LED_Pin = 2;

int status = 1;

void setup(){

pinMode(LED_Pin, OUTPUT);

}

void loop() {

  // put your main code here, to run repeatedly:

if (status) {

digitalWrite(LED_Pin, HIGH);

  } else {

digitalWrite(LED_Pin, LOW);

  }

status = 1-status;

delay (1000);

}

which is basically the same as before, except the LED_pin now is set to 2. The code is at:

https://github.com/directorcia/Azure/blob/master/Iot/huzzah-ext-flash-led.c

Using PlatformIO IDE I uploaded my code to the Adafruit and after a few minutes was greeted by:

iot-flash

Magic eh?

Sure it’s simple but it’s another step along my IoT journey.

Not as easy is IoT

I wanted to start playing with IoT and connecting it up to Azure after being inspired by some previous guests on my podcast (Bryn Lewis and Lars Klint). I did a search for something like ‘Azure IoT starter kit’ and the following popped up:

Microsoft Azure IoT Starter Kit w/ Adafruit Feather HUZZAH

Microsoft Azure IoT Starter Kit w/ Adafruit Feather HUZZAH

So I ordered it. I was looking forward to getting back to my Electrical Engineering roots with this IoT stuff.

A few weeks later (it did take quite a while to arrive) I opened the kit to see what was inside. To my dismay, there wasn’t very much in the ways of instructions. Yes, all the parts where there, but nothing to tell me how to make it all work.

The kit provider did have the following tutorial available:

https://learn.adafruit.com/adafruit-feather-huzzah-esp8266/overview

but it didn’t show me how to actually get my code into the device. That then lead me to the

Arduino IDE

but there wasn’t a lot of positive feedback on it and really wanted to use something I was more familiar with. Luckily, I had a contact who had done some basic IoT and told me I could user Visual Studio Code! Yes please. I like that because I use with with PowerShell nearly everyday.

What I needed to do after firing up Visual Studio code was to search and install an extension called Platformio IDE:

https://docs.platformio.org/en/latest/integration/ide/vscode.html#quick-start

image

It popped right up so I pressed the install button.

Unfortunately, the installation came up with some errors, but I was kind of expecting that because I was installing on a machine that was connected to my Azure AD and locked down with things like Windows ASR. Thus, after many, many attempts at trying to get the installation working and then create a project I moved to using a machine that was NOT connected to my Azure AD and locked down to the hilt. The installation then went smoothly unsurprisingly.

image

With PlatformIO IDE installed I went to create a Project.

image

I used the above settings. Warning, the platform supports a huge range of boards (1400+) so ensure you know the exact model of your board and be prepared to scroll.

With the project created I now needed to write some code to get the built in light on the board to flash. I used the following:

#include <Arduino.h>

int LED_Pin = 0;

int status = 1;

void setup(){

pinMode(LED_Pin, OUTPUT);

}

void loop() {

  // put your main code here, to run repeatedly:

if (status) {

digitalWrite(LED_Pin, HIGH);

  } else {

digitalWrite(LED_Pin, LOW);

  }

status = 1-status;

delay (1000);

}

Which I found after some searching. I have put the code up on GitHub if you want it:

https://github.com/directorcia/Azure/blob/master/Iot/huzzah-flash-led.c

I managed to get that code to compile but it would then not ‘upload’ to the device.

After more searching I discovered that PlatformIO wasn’t showing me any devices like so:

image

If PlatformIO can’t see my device, then it can’t upload to it.

After more searching around I found the following Windows drivers for the board here:

https://learn.adafruit.com/adafruit-arduino-ide-setup/windows-driver-installation

Typically, it seems you shouldn’t really need to manually install drivers on Windows 10/11, but in my case, I did.

With the drivers now installed I could see the board listed as a device in PlatformIO like so:

image

With the drivers now sorted, I could finally upload my code to the device successfully.

The code I found that would flash the light on the device on and off as the most basic test didn’t seem to do anything after it was uploaded. The trick was that the code I found had the LED_Pin = 13 and luckily, after that didn’t work I guessed correctly setting it to LED_Pin = 0 would as you can see from the code above that I actually used.

image

After, uploading the updated code to the device I was then rewarded with a flashing light at the base of the device near the USB connection as shown above. I know it doesn’t look like much but to me it was a huge step after all the time I had invested getting things set up (many hours).

Now that I have the basics working, my next project is to get the WIFI connectivity on device working so I can connect it up to the Internet and then hopefully Azure eventually.

I do have to say that getting this far has been far harder than I imagined it would be. I didn’t find a lot of information out there to help solve my problems. That’s why I’m documenting my results here so that others can find it and hopefully not have to go through the same pain I did.

I’m sure there’ll be more pain coming as I try and do more advanced things with the device but at least getting the light flashing gives me the encouragement to continue with this endeavour and not feel that I wasted my money. I’ll share more in time as I continue my IoT journey, but for now, I need a lie down.

Need to Know podcast–Episode 284

In this episode I speak with MVP Bryn Lewis about IoT and what services like Azure has available to help with these projects. If you are a ‘make’ or just want to get your hands dirty with some hardware, then this is the episode for you.

I’ll also bring you up to date with all the latest news from the Microsoft Cloud.

Take a listen and let us know what you think – feedback@needtoknow.cloud

You can listen directly to this episode at:

https://ciaops.podbean.com/e/episode-284-bryn-lewis/

Subscribe via iTunes at:

https://itunes.apple.com/au/podcast/ciaops-need-to-know-podcasts/id406891445?mt=2

The podcast is also available on Stitcher at:

http://www.stitcher.com/podcast/ciaops/need-to-know-podcast?refid=stpr

Don’t forget to give the show a rating as well as send me any feedback or suggestions you may have for the show.

This episode was recorded using Microsoft Teams and produced with Camtasia 2021.

Brought to you by www.ciaopspatron.com

Resources

Bryn Lewis – Github, Blog, Twitter

IoT for beginners

Microsoft IoT Blog

Hobbyist gear – Sparkfun, Adafruit

Hobbyist and Commercial gear – Tindie, Seeed Studio, Microelektonica

Low Power wireless – Things network, Dragino, RAKWireless

Machine Learning on the Edge – Edge impluse, ML.NET

RTOS – Azure, free RTOS

.NET on the edge – nanoframework, GHI

OneDrive limit change

New security solutions to help secure SMB

Revamped Office.com

What’s new in Endpoint Manager

Do more with OneNote