Pages

Friday, November 24, 2017

Thingspeak

This weblog has described many projects that connect all kinds of sensors and switches to your network. We had an ESP Controlled ledstrip, a rain sensor, an ESP controlled relay, a thermometer and many more.

All these projects have something in common and that is that they attach an ESP to a web-page which can be controlled from your computer or phone. This works great when you are inside the environment of your wifi home network.

However not all projects are intended to be used from within your home or office. Sometimes you need to control things from another location (your office, on a holliday, visiting friends etc). That implies that you need to open a port on your home router so the information can get out your local environment. This is called port-forwarding.
So if you have multiple sensors and switches attached to multiple ESP's in your house you will need to open many ports on your router and that could (mind you I do not say "will") bring a safety issue. Opening ports on a router may open a port to a hacker, and that is something we certainly do not want to happen.

There are multiple solutions to this. One involves an intercommunication system amongst your ESP's. Meaning that all your ESP's talk to eachother and just you have one central system (being an ESP or a Raspberry) talking to the outside world. That is not the solution I am going to talk about here.

The solution I am going to discuss is using an external IOT platform.

What is an external IOT platform.

Basically it is a computer system run by a company that has an internet connection and allows you to send data to. This data will be put on an open or private webpage which you can access from any part in the world.
The advantage is that any device in your network only has to send data to this computer just like your home computer sends and receives data to and from the internet.

No need to open ports in your router, and often they offer a fancy interface that is easy to use. So there is not a lot of programming hassle.

Thingspeak




In this example I am going to demonstrate how you can put the information from the ESP-Thermometer on to the world-wide-web and read the temperature in your home from any place in the world. I am using the Thingspeak service for this as it has a very easy interface which can be used easily from ESP-Basic or the Arduino environment.

So the first thing you will have to do is to visit the Thingspeak website: https://thingspeak.com/

If you not have an account already (if you have you would not be reading this) Sign Up for an account. You will be asked an e-mail adress, a user ID (which you can define yourself) and a password. Remember both the user ID and the password. You wil be needing them both in the future.



After successfully signing up you will start at the channels page. At this moment you will not have any channels so choose to make a new one. You will be taken to a new page where you can fill in the details of this channel.



Above you can see that I filled in the first details for this channel. Give each channel an identifying name and fill in a fitting description. We will only have one field in this channel being the temperature. If you would have multiple sensors attached to your ESP you could for example have a second filed that represents a door movement. That way you could relate between an opening door and the temperature.


Scrolling down there are more fields which you can fill in which are not necessary exept one important one. That's the field you have to check to make your channel private or public.
Public channels can be accessed by anyone without even having to login. For now make it public.

Now press the Save button.





You will be represented with another screen that shows you the most important part: a chart with your workroom temperature. Off course there will be no information filled in yet.

As you can see there are 3 buttons. Two of them are important at first. The "More Information" button brings you to your own webpage. The "Data Export" button makes it possible to save all the data in a JSON, XML or CSV file on your computer for off-line analysing.



The most important TAB is the API Keys tab.
Here you will find your personal key for writing information to Thingspeak or reading information out of a channel.

For now we will only be looking to writing information to a channel. We will need the Write API key for that. So leave this screen open so you can easily copy the API key later on in your program.

Writing thermometer values to Thingspeak.


In the article "Oh no not another thermometer" I build a.....thermometer that displays the temperature on a webpage using an ESP and a Dallas 18b20 sensor. I programmed it in ESP-Basic and it has been functioning for many weeks in a row flawlessly. But it was only accessible from within my own home-network. Now we are going to bring it in the open.

Open a webpage and access the thermometer. If you do not know how to find it look at this article which gives you the basic information about ESP-Basic.


tel=0
Timer 5000, [start]

wprint "<!DOCTYPE html>" 
wprint "<html> <body>"
wprint |<body style="background-color:greenyellow;">|
wprint |<H1><span style="color: red;">|
wprint " A thermometer"
wprint "</H1>"
wprint "</span>"
wprint |<H2><span 

style="color: blue;">|
wprint "Temperature is now "
textbox test

a = "background-color:greenyellow;"
a = a & "display:block;width:80px;"
a = a & "border-style: hidden;"
a = a & "font-size: 22px;"
a = a & "font-weight: bold;"
a = a & "color: fuchsia ;"
cssid htmlid(), a
wprint "</span>"
wprint "</H2>"
Wait

[start]
test = temp(0)
test = ((int(test*10))/10)
tel=tel+1
if tel = 360 then
  tel = 0
  gosub [thing]
endif
wait

[thing]
sendthing = str(test)
SENDTS("MY-API-KEY", "1", sendthing)


return

Now open the Edit page and look how I altered the Basic Program.

What I wanted to do is to have the thermometer send it's information each half hour to the thingspeak channel. Therefore I altered three things in the program.

tel=0

I inserted this line to the top of the program to initiate a new variable.

[start]
test = temp(0)
test = ((int(test*10))/10)
tel=tel+1
if tel = 360 then
  tel = 0
  gosub [thing]
endif
wait

I altered this routine so that each time the routine is called (every 5 seconds which is set by the TIMER 5000 command) 1 is added to tell. And if tell has reached the value 360 (which is in time 5 seconds * 360 = 30 minutes) the routine [thing] is called.

[thing]
sendthing = str(test)
SENDTS("MY-API-KEY", "1", sendthing)
return

So eacht time (every 30 minutes) when this routine is called the string variable sendthing is filled with the actual temperature (test). And then SENDTS("MY-API-KEY", "1", sendthing) sends the information to field "1" in my Thingspeak channel. If you have more fields you obviously alter the "1" in the field you want to write to.


In the mean time the information on the local webpage will still be updated every 5 seconds.

You will have to substitute MY-API-KEY with your own key which you can find at the API-KEY tab in your channel. Make sure you use the "Write API Key" and not the read one which is used to read information from the page, nor for putting info on it.

That's all !!

Run the Basic program and just wait.




Here you can see the temperature in my room over a period of one and a half day.

More information needed

Thingspeak is free as in free beer as long as you do not exceed 8200 messages a day or 3.000.000 (yes 3 million) messages a year. You can update the info every 15 seconds.

If you have multiple sensors connected to an ESP you can add more fields in a channel or even open more channels depending on how you want to present the data. By opening multiple channels you have to use multiple API-Keys, one for each sensor.
If you are using multiple ESP's you can have them writing to the same channel, so you can have one graph with temperatures of several chambers in your house. Or you can open multiple channels, each ESP it's own.

Just decide what is most convenient for your projects.

However keep the limits in mind. And make sure the writing of data on each filed or channel overlaps as you can update only once every 15 seconds.

Minimalistic setup.

As ESP-Basic is really awesome for rapid devellopment I will give you a minimalistic setup here.

Timer 1800000, [start]
wait

[thing]
sendthing = str(temp(0))
SENDTS("MY-API-KEY", "1", sendthing)
return

These 7 lines is all it takes to send the information to my Thingspeak channel. The setback is that there is no fancy local webpage I can access on my phone or tablet to have a look at the temperature. You can only get the information through Thingspeak.

Even better.

To access your information you can log in from any place in the world to the thingspeak. But it even gets better. You even do not need to login for getting at your info.





Just go the Thingspeak website.

And in the top tabs choose "Channels" You will be presented by a similar page as shown here.



 
Now fill in your user ID on the right side of the screen and it will give you your channels




Clicking on the name of the channel in the blue banner will direct you to the information.




Remember this part of the setup page. You filled in "Make Public"
Setting a channel as public means that you even do not have to log in to access the information.

Be carefull

As said above a channell's information is accessible for anyone if it is set to public. That really means that anyone in the world can have access to the information. So be carefull.
Do not use your real name in Public information. Give no clues about who you are, what your location is etc etc etc.

Suppose you have a public channel that displays the information in your house. Or the water usage, or the time the lights are on etc etc etc. If the information is public this is valuable info for any burglar or thieves. Read here about this privacy issue: http://lucstechblog.blogspot.nl/2017/02/burglars-invited.html

In future stories I will show you how to send info to Thingspeak with the Arduino IDE and I will show you how to get information from the Thingspeak channel to perform actions on.


What more IOT platforms are avalable ?
 

Actually there are quite a few IOT platforms available. Some of them are equally easy to use like Thingspeak. An exampleis  Dweet which I am going to discuss in an upcoming stories.

Others like Blynk and Cayenne IOT have many advantages and possibillities. However they require you to install libraries in your ESP. This will work while programming in the Arduino IDE but not (yet) in Basic. Programming is more difficult. And this article is aimed at fast results. Besides that Blynk is only free to a certain amount of channels.

Nevertheless it is something I will be checking into in future stories.

Till next time
Have fun

Luc Volders

Friday, November 17, 2017

Oh no, not another wifi thermometer.


I know. It is stupid. And at first I was not even sure why I was building it. As the internet is paved with ESP-Weatherstations and thermometers. And why on earth is the weather so interesting. Just look outside and you know what it is like. And then a reason came up. For testing all kind off IOT cloud services I needed a device that would constantly provided some data and what is easier as a thermometer to provide data.  However I had some demands.

Price.
It should be really low cost. and it is !!! I used an ESP-01 (1.57 euro) a Dallas 18b20 temperature sensor (0.98 euro) a LM317 voltage regulator (0.08 euro) , some resistors (about 0.05 euro) and a USB cable (about 1 euro). That sums up to 3,68 euro. Add some stripboard and wire and there is your complete thermometer for about 4 euro.
Naturally I printed the casing myself.

Simple.
This project should not take more as a few hours to build. I made a prototype on a breadboard and when that worked I transferred it to some stripboard. Programming was done in the unmatched easy ESP-Basic language.

Before we start.
Before we really start with this project I want to point out some basic knowledge articles I wrote that helps you understand how all fits together.
First read about the LM317T voltage regulator which allows you to provide your project with any voltage you might need. Read that story by clicking here.
 

And please read the introduction article to ESP-Basic which makes developping ESP8266 projects a piece of cake. The introduction article runs you through flashing ESP-Basic and using the web-based editor to writing your first programs.

Let's go.

Powering the project.

The ESP-01 works at a 3.3Volt power level. And the Dallas Temperature sensor fortunately also does so. I am going to power this project from a USB power source (be it a computer, mains adapter or powerbank). So the USB power, which is 5 volt has to be reduced to 3.3 volts.

As stated above I am doing this by the use of a LM317T voltage regulator. 5 Volt is supplied and reduced to 3.3 Volts.



As you can see from the schematics above we will need a resistor of 1.2K and a resistor of 2K to achieve this. Like  I said above: for more information about this read the article about the LM317T.



The breadboard shows you the setup.

The ESP side

For flashing ESP-Basic and programming I used my ESP-01 programming board which I described in detail in the story you will find by clicking here.



As you know the Dallas 18B20 needs a pull-up resistor of 4K7 to function. So I attached my programming board to a small breadboard on which I placed the resistor and connected the Dallas temperature sensor.

At first to make life easy I soldered some paperclip wire to the Dallas 18b20 wires so I could easily fit them on the breadboard. The paperclip trick is one I use often. For those of you not familiar with it click here to read the story. Later on I replaced them with dupont wires cut in half and soldered to the Dallas 18B20 wires.



 So when this all functioned I completed the setup on the breadboard.



And when all functioned as it should I put it on two left-over pieces off stripboard.

The program.

 Timer 5000, [start]  
   
 wprint "<!DOCTYPE html>"   
 wprint "<html> <body>"  
 wprint |<body style="background-color:greenyellow;">|  
 wprint |<H1><span style="color: red;">|  
 wprint " A thermometer"  
 wprint "</H1>"  
 wprint "</span>"  
 wprint |<H2><span style="color: blue;">|  
 wprint "Temperature is now "  
 textbox test  
   
 a = "background-color:greenyellow;"  
 a = a & "display:block;width:80px;"  
 a = a & "border-style: hidden;"  
 a = a & "font-size: 22px;"  
 a = a & "font-weight: bold;"  
 a = a & "color: fuchsia ;"  
 cssid htmlid(), a  
 wprint "</span>"  
 wprint "</H2>"  
 Wait  
   
 [start]  
 test = temp(0)  
 test = ((int(test*10))/10)  
 wait  


The program may look complicated but regard it closely and you will see that in reality it is not. There are some neat tricks in it though.

Let's simplify it first.

There are just 3 lines that actually are the real program core:

test = temp(0)
test = ((int(test*10))/10)


The first line reads the Dallas 18B20 temperature sensor. And the second line rounds it to 1 decimal.

textbox test

This line actually puts the temperature on the screen. Those are the three core lines. All that follows is just pimping it up.

Timer 5000, [start]

To make the program check the temperature each 5 minutes we use the Timer command as you can see in the line above.

wprint |<body style="background-color:greenyellow;">

This sets the background of the web-page in the color "greenyellow"

a = "background-color:greenyellow;"
a = a & "display:block;width:80px;"
a = a & "border-style: hidden;"
a = a & "font-size: 22px;"
a = a & "font-weight: bold;"
a = a & "color: fuchsia ;"
cssid htmlid(), a


That is an important block of CSS code.
What it actually does is to hide the contour of the textblock, give the textblock the same background as the webpage has and gives the text in the textblock a contrasting colour.
All this together hides the textblock from the screen and makes it look as if the text is printed direct on the webpage. And that is a really nice trick.


And here is the end-result.

Casing



The casing is identical to the casing I made for the PIR alarm (click here to look at that project).


 The difference is that the lid has no opening for the PIR. It is just massive


As you can see the case is far to large for such a small stripboard and therefore has one advantage: you can also power this project  with AA batteries.

That's it.

All that rests is to give you the links to the STL files so you can replicate or adapt this to your own needs.

https://github.com/Lucvolders/Wifi-Thermometer

Till next time, have fun

Luc Volders

Friday, November 10, 2017

9 volt power plug salvage

I bought this fantastic piece of equipment. it is a kind of multi-tester. Not like any ordinary multimeter, no a multitester.



Not only does it tests resistors but also capacitors, transistors (PNP and NPN) fet's, diodes etc. It can be found on all the well-known chinese web-shops for just a few dollar. But that is a different story all together. It has only one flaw: it works on 9 volt batteries. The availability of the 9 volt batteries is not such a problem as well as the cost and lifespan.

After some examining of the multiteter I realised it was powered by a 7805 5 volt regulator. Powering it with a slightly divergent power supply would therefore not lead to problems. And I had such a power supply at hand. It is a 9 volt power supply.

However my multimeter showed it supplies 11 volts when unencumbered. No sweat: the 7805 should be able to handle that.

I could cut the 9 volt plug and solder the wires direct to the multitester. But I wanted a more flexible solution that would permit me to use the power supply also for different purposes. Therefore I needed a 9 volt contra plug. And that was easily found.




There is a 9 volt plug on top of the battery. Now I have seen instructions on how to decap the battery and salvage the plug. I have never done such a thing myself and looking at pictures on the internet is not the same as doing it yourself.




I examined the battery slosely and saw that there was a juncture. So I started tweaking at the juncture and to my surprise it was the start of a label that was glued to the casing. So the label came off easily and beneath it was a plasic casing. You might not be so lucky as I know that many cases are made of metal so cutting them up might be more tedious.



Next step was to carefully saw the bottom off. And when I made a big enough cut I ripped it with some pliers.



Inside was a pack of 3 batteries soldered together with some long flat leeds.


I removed the batteries and the remains of the casing until just the plug was lying in front of me.


Then I cut the long flat leads off.


Next step was examining the battery and looking which pole was corresponding with VCC and which corresponded with GND. The small round pole is the VCC side and the large split pole is GND.


 
The only remaining step was then to solder the wires of the power supply to the poles and all was done.


A final test with my multimeter showed that everything was fine and indeed when I plugged it to my multitester it worked as expected.


This is an excellent way to save on batteries.
Just make sure that anything you plug this power supply into has to be capable of handling the supplied voltage which is in my case about 11 volts.

Till next time.
Have fun.

Luc Volders

Friday, November 3, 2017

Watch your cables

I was doing a project with a Raspberry Pi 3 when I encountered a strange problem.

I installed the Raspberry OS and wrote my software. next I tested it thoroughly until I was convinced everything worked as I planned. Next step was to move the Raspberry to its working location.




The location I planned for the raspberry had no wall power outlet. So I used a 5 meter long (16 foot) USB cable as a power source. Should be no problem as this cable powered a NodeMCU before.

But then the trouble started.

The Raspberry started as planned and then suddenly resetted. So I detached the power cable and re-attached it to reboot the Raspberry. That worked, however after a few seconds it resetted again.

I was sure I had a decent USB power supply attached: 5 Volts, 2.1 Amps. More as sufficient. And then I got an idea. I relocated the Raspberry and attached the original USB cable (1.8 meter) again. And everything worked as normal. So I replaced the 1.8 meter USB cable with the 5 meter cable and the problems started again: fault located !!!
The cable obviously had to much resistance which reduced the power.

I had used this cable with a NodeMCU before but obviously that draws less power as A Raspberry Pi 3 does.

So if you have power problems with your Raspberry Pi do not automatically suspect the power supply, but check the cables also.

Till next time,
Luc Volders