I am using PST and my PropPlug connected to the ESP8266-01.
GPIO0 to 3V3 (tie to GND to program). When nc, it failed.
CH_PD is tied to 3V3
RST is nc, GPIO2 is nc
AT<crlf>
[I]responds OK[/I]
AT+GMR<crlf>
[I]responds with fw revision - mine is 00150900 which is quite old as I have had the board for 6+ months[/I]
AT+RST<crlf>
[I]reports lots of info[/I]
AT+CWMODE=3<crlf>
AT+CWLAP<crlf>
[I]responds with a list of available access points[/I]
AT+CWJAP="..ssid..","..pswd.."<crlf>
AT+CWJAP?<crlf>
[I]responds with connected access point[/I]
AT+CIFSR<crlf>
[I]responds with allocated IP address[/I]
AT+CIPMUX=1<crlf>
[I]set single connection[/I]
AT+CIPSTART=0,"TCP","www.google.com",80<crlf>
[I]should connect and respond with OK linked[/I]
AT+CIPSEND=0,7<crlf>
[I]responds with ">" and waits for the 7 characters an no crlf[/I]
GET /
[I]responds with SEND OK, but no response from google ???[/I]
[I]To close...[/I]
AT+CIPCLOSE=0<crlf>
[I]responds with OK Unlink[/I]
AT+CWQAP<crlf>
[I]responds with OK[/I]
[I]can follow with..[/I]
AT+CWJAP="",""<crlf>
Additional Commands (not tried, but here for reference)..
AT+CWQAP<crlf>
[I]quits the access point[/I]
AT+CWJAP="",""<crlf>
[I]issue after a reset command to clear ssid/pswd[/I]
Some more code working. This is written in Spin and will connect to www.parallax.com and print out the html of the website.
You will need to change the router to your particular router and password.
Spin is working much better than Arduino C. The arduino just can't handle the speed with which the data comes back and misses blocks of the html code. In the arduino uno, if you try to store it as it comes in, it slows things down further. And if you try to store it in a huge buffer, it runs out of ram for other things.
Spin on the other hand can easily gobble up bytes at 9600, and I have no doubt, even faster.
also can upload data to xively. Next step - downloading data from xively. This might seem a bit strange but there is some method to this madness - with setting up local servers it is difficult to get the ip address to stay static. I think there is a new version of the ESP module that can do this but not any I have. So you might set it all up and it works for weeks then you reboot your router and the IP addresses all change and it stops working.
However this problem is avoided by using xively. Also xively can draw graphs of data, plus the data is global. It is password protected - if you use this then it would help to get a personal free xively account rather than using mine.
I have progressed. Today I programmed nodeMCU, then updated to the latest firmware.
Connected to my AP, connected to google.com to get the time, connected to benlo.com and received the info I sent.
I am not sure how this all works, but I have a free account at no-ip.com which covers the problem of dynamic ip addresses. I needed this when I was testing the WR703's.
I presume it maintains a lookup table for your "username" to the current IP. Of course, this relies on your router/device sending its new ip address when it changes.
I uploaded a lua-script that does read a DS1820-Sensor evey 5 seconds.
then connects to thingspeak.com sending the temperature-data then disconnects.
-- Measure temperature and post data to thingspeak.com
-- 2014 OK1CDJ
--- Tem sensor DS18B20 is conntected to GPIO0
--- 2015.01.21 sza2 temperature value concatenation bug correction
--- Stefan Ludwig: 16.03.2015 modified for use with DS1820 (which has 9bit resolution 0.5°C precisision
pin = 3
ow.setup(pin)
counter=0
lasttemp=-999
function bxor(a,b)
local r = 0
for i = 0, 31 do
if ( a % 2 + b % 2 == 1 ) then
r = r + 2^i
end
a = a / 2
b = b / 2
end
return r
end
--- Get temperature from DS18B20
function getTemp()
addr = ow.reset_search(pin)
repeat
tmr.wdclr()
if (addr ~= nil) then
crc = ow.crc8(string.sub(addr,1,7))
if (crc == addr:byte(8)) then
if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
ow.reset(pin)
ow.select(pin, addr)
ow.write(pin, 0x44, 1)
tmr.delay(1000000)
present = ow.reset(pin)
ow.select(pin, addr)
ow.write(pin,0xBE, 1)
data = nil
data = string.char(ow.read(pin))
for i = 1, 8 do
data = data .. string.char(ow.read(pin))
end
crc = ow.crc8(string.sub(data,1,8))
if (crc == data:byte(9)) then
t = (data:byte(1) + data:byte(2) * 256)
if (t > 32768) then
t = (bxor(t, 0xffff)) + 1
t = (-1) * t
end
t = t * 5
lasttemp = t
print("Last temp: " .. lasttemp)
end
tmr.wdclr()
end
end
end
addr = ow.search(pin)
until(addr == nil)
end
--- Get temp and send data to thingspeak.com
function sendData()
getTemp()
t1 = lasttemp / 10
t2 = (lasttemp >= 0 and lasttemp % 10) or (10 - lasttemp % 10)
print("Temp:"..t1 .. "."..string.format("%01d", t2).." C\n")
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com 184.106.153.149
conn:connect(80,'184.106.153.149')
--- you have to adapt the value behind key= to your own write API Key on www.thingspeak.com
conn:send("GET /update?key=MYWRITEKEY&field1="..t1.."."..string.format("%01d", t2).." HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connection")
conn:close()
end)
conn:on("disconnection", function(conn)
print("Got disconnection...")
end)
end
-- send data every X milliseconds to thing speak
tmr.alarm(0, 5000, 1, function() sendData() end )
In parallel I opened five cmd-windows where each window does endless ping'ing
ping IP.adress -t
the ping-times vary from 3ms up 900ms.
In changing order each cmd-window has timeouts when ping'ing.
I guess if the ESP8622 is busy with reading the DS1820 or busy with connecting to the the web
the pings must wait.
But the ESP8266 kept on running continously for hours and each cmd-window comes back to get his pings replied.
Next step would be to establish multiple connections TCP and/or UDP if possible
or a continous datastream over serial and over WiFi at the same time.
Got data going both ways. Now can twiddle a pot, and anywhere in the world can have it read out on a servo. Two propeller chips/boards, two ESP8266 chips and not much else really.
This is the xively code to fetch all the feeds
pub XivelyGet
' http://forums.adafruit.com/viewtopic.php?f=22&t=47126
strings.copy(string("AT+CIPSTART=0,",34,"TCP",34,",",34,"api.xively.com",34,",80",13,10),@string1)
esp8266.str(@string1)
delayOK ' will come back with OK then Linked
gobblebytes(500)
strings.copy(string("GET /v2/feeds/"),@string1) ' build the string to send
strings.plus(string("970253233"),@string1) ' add the feed id
strings.plus(string(".csv HTTP/1.0",13,10),@string1)' add the format of the data to request
strings.plus(string("Host: api.xively.com",13,10),@string1)
strings.plus(string("X-ApiKey: shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM",13,10),@string1)
strings.plus(string("Connection: close"),@string1)
strings.plus(string(13,10,13,10),@string1) ' final crlfs
commandstring1 ' send this request
gobblebytes(5000)
and this is the code to upload a feed
pub XivelySend | n
strings.copy(string("AT+CIPSTART=0,",34,"TCP",34,",",34,"api.xively.com",34,",80",13,10),@string1)
esp8266.str(@string1)
delayOK ' will come back with OK then Linked
gobblebytes(500)
strings.copy(string("Sensor1,30"),@string3) ' the sensor value to change, and the value
strings.copy(string("PUT /v2/feeds/970253233.csv HTTP/1.1",13,10),@string1) ' build the string to send
strings.plus(string("Host: api.xively.com",13,10),@string1)
strings.plus(string("X-ApiKey: shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM",13,10),@string1)
strings.plus(string("User-Agent: Arduino1",13,10),@string1) ' name of the project
strings.plus(string("Content-Length: "),@string1)
n := strings.len(@string3) ' find the length of string3 with the sensor name and value
strings.copy(strings.integertodecimal(n,3),@string2) ' get the length as a string
strings.plus(@string2,@string1) ' add the length
strings.plus(string(13,10),@string1) ' crlf
strings.plus(string("Content-Type: text/csv",13,10),@string1) ' comma sep data
strings.plus(string("Connection: close",13,10,13,10),@string1) ' close the connection after send
strings.plus(@string3,@string1) ' the actual data to send
strings.plus(string(13,10,13,10),@string1) ' final crlfs
commandstring1 ' send this command, waits 4s for a reply, closes automatically
Joining xively is free - you can upload data from vb.net or spin or other microprocessors, and also download it. xively can also display graphs which are handy. The above code and password are my site which I have made public, and if you do a read on this you might see whether I have pumps on or off and how many kilowatts of solar I am producing.
Of course, there are other places to act as a repository of data, but xively is very convenient. I think they would prefer you don't spam the site, so I guess from this I am reading maybe don't send data more than once a minute, so this means if you move a pot, it might take a minute for a servo to move. There might be faster solutions, eg virtual serial links you can set up.
But for uploading data and storing it for many months, then reading it back, this is very convenient. Sensor nodes don't need local SD card storage. Display nodes can be in a different location, so you could have a node out in the yard measuring the soil moisture, and another node in the shed that disables the sprinkler system if it has rained, and yet another node in the house displaying if the garden is a bit parched.
The propeller is just perfect for this.
Ok, next step, get the touchscreen display working with the ESP8266 modules so can walk around the yard turning sprinklers on and off, controlling a drone etc etc
Interesting Drac. I think the same can be done with the thingspeak site.
I haven't looked at how it's done. I have a few websites with their own ip addresses
Where I believe I can run cgi or other code. They are hosted in the USA and I don't
use anywhere my data limits.
Would be nice to build this into my site.
Meanwhile, I am using lua on the esp8266, and I then want to use lua commands from the prop
As lua seem quite simple to send and receive data from the remote website.
I don't know anything about lua. Can you explain this for dummies - is it run on the esp module, how does it interact with the existing esp commands etc
Somewhere along the line we have to think about passwords - joining a wifi access point needs a password, and you can either program this into the propeller, or you have to have some sort of keyboard/touchscreen/menu to type in a password. Maybe a 20x4LCD and a few pushbuttons. I'm getting around this because none of my wifi access points have passwords but I suspect most people will have passwords on their APs.
nodeMCU is programmed into your ESP8266. This then runs a lua interpreter. Lua is a simpler language to run or interface to, than the AT+ command set.
And you can setup a few lua script files stored on the ESP8266 that you can run on command. The script file "init.lua" runs on power up if it exists.
Here is the link that I used to program nodeMCU into your ESP8266 http://benlo.com/esp8266/ http://benlo.com/esp8266/esp8266QuickStart.html
The only issue I had was with the ESP8266Flasher.exe...
When you flash the latest nodeMCU, on the Config page...
* deselect the INTERNAL//xxx 0x00000
on the following lines, add in (using the locate cog-wheel icon)
* select /nodeMCU-latest.bin 0x0000
* select /esp-init-data-default.bin 0x7c000
* select /blank.bin 0x7e000
Then Flash the code.
The latest lua code is dated 18/3/2015 from here (cannot find the github link )
You need the files
nodemcu-latest.bin 18/3/2015 9:43pm
esp_init_data_default.bin 18/3/2015 10:39pm
blank.bin 18/3/2015 10:39pm They all came in the file nodemcu-firmware-master.zip
I can email this if you like. Postedit https://github.com/nodemcu/nodemcu-firmware/releases/tag/0.9.5_20150318
and download the source code zip file
The nodemcu is in the /latest directory and the default and blank are in the /bin directory.
Now you can use LuaLoader.exe to interact with your ESP8266 directly with your pc. This will show you what commands you need the propeller to reproduce.
Here is a Lua script to list wifi stations found and connect to the best open wifi station
-- choose the strongest open AP available and connect to it
-- Autoconnect to strongest AP
-- tested with NodeMcu 0.9.2 build 20141212
ConnStatus = nil
function ConnStatus(n)
status = wifi.sta.status()
uart.write(0,' '..status)
local x = n+1
if (x < 50) and ( status < 5 ) then
tmr.alarm(0,100,0,function() ConnStatus(x) end)
else
if status == 5 then
print('\nConnected as '..wifi.sta.getip())
else
print("\nConnection failed")
end
end
end
best_ssid = nil
function best_ssid(ap_db)
local min = 100
for k,v in pairs(ap_db) do
if tonumber(v) < min then
min = tonumber(v)
ssid = k
end
end
end
best = nil
function best(aplist)
ssid = nil
print("\nAvailable Open Access Points:\n")
for k,v in pairs(aplist) do print(k..' '..v) end
ap_db = nil
ap_db = {}
if nil ~= next(aplist) then
for k,v in pairs(aplist) do
if '0' == string.sub(v,1,1) then
ap_db[k] = string.match(v, '-(%d+),')
end
end
if nil ~= next(ap_db) then
best_ssid(ap_db)
end
end
if nil ~= ssid then
print("\nBest SSID: ".. ssid)
wifi.sta.config(ssid,"")
print("\nConnecting to "..ssid)
ConnStatus(0)
else
print("\nNo available open APs")
end
end
wifi.setmode(wifi.STATION)
wifi.sta.getap(function(t) best(t) end)
And here is a script (once you are connected) that will get the time from the google homepage
-- retrieve the current time from Google
-- tested on NodeMCU 0.9.5 build 20150108
conn=net.createConnection(net.TCP, 0)
conn:on("connection",function(conn, payload)
conn:send("HEAD / HTTP/1.1\r\n"..
"Host: google.com\r\n"..
"Accept: */*\r\n"..
"User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"..
"\r\n\r\n")
end)
conn:on("receive", function(conn, payload)
print('\nRetrieved in '..((tmr.now()-t)/1000)..' milliseconds.')
print('Google says it is '..string.sub(payload,string.find(payload,"Date: ")
+6,string.find(payload,"Date: ")+35))
conn:close()
end)
t = tmr.now()
conn:connect(80,'google.com')
And here is one to send some info to a website, after you are logged on
This will be similar to sending info to xively or thingspeak, etc.
-- tested on NodeMCU 0.9.5 build 20141222...20150108
-- sends connection time and heap size to http://benlo.com/esp8266/test.php
print('httpget.lua started')
Tstart = tmr.now()
conn = nil
conn=net.createConnection(net.TCP, 0)
-- show the retrieved web page
conn:on("receive", function(conn, payload)
success = true
print(payload)
end)
-- when connected, request page (send parameters to a script)
conn:on("connection", function(conn, payload)
print('\nConnected')
conn:send("GET /esp8266/test.php?"
.."T="..(tmr.now()-Tstart)
.."&heap="..node.heap()
.." HTTP/1.1\r\n"
.."Host: benlo.com\r\n"
.."Connection: close\r\n"
.."Accept: */*\r\n"
.."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n"
.."\r\n")
end)
-- when disconnected, let it be known
conn:on("disconnection", function(conn, payload) print('\nDisconnected') end)
conn:connect(80,'benlo.com')
Looks interesting - eg strongest wifi using the propeller involves some string manipulation.
Can I go back a step - I'm still a bit confused about what lua is running on. Have you reflashed the ESP module and lua replaces the code that was on the module? I'm still not up to speed with this - how you write a script, how you download it, what it is actually running on. I'll go back and reread this thread...
Yes, I reflashed the ESP module. This code then runs totally on the esp module. By running a special terminal program under windows called LuaLoader, you can either click the buttons on the PC screen to do certain things like discovering the stations. Also you can enter you own lua commands to test them. You can also download lua programs (scripts) to the esp module (programs them into flash). Then you can run these on the esp module by calling them from the PC terminal window (or dofile button).
Below is my testfile called Rays.lua
The commented lines at the end are not working correctly - still sorting this out
-- display APs
-- Autoconnect to me
wifi.setmode(wifi.STATION)
wifi.sta.getap(function(t) if t then print("\nVisible Access Points:")
for k,v in pairs(t) do l = string.format("%-10s",k) print(l.." "..v) end else print("Try again") end end)
--wifi.sta.config("Ray's iPad MR","password")
--wifi.sta.connect()
--wifi.sta.getip()
--wifi.sta.disconnect()
With the setup described here http://randomnerdtutorials.com/esp8266-web-server
using this init.lua code flashed into the esp module using lualoader.exe
rebooting connected to my internet gateway (a mobile hotspot) I received the IP details
xxx.xx.10.5 255.255.255.240 xxx.xx.10.1
I then loaded my web browser and typed in xxx.xx.10.5 (the IP of the ESP) and voila...
A webpage with buttons to turn on/off GPIO0 & GPIO2 (remember GPIO0 is the flash enable to GND for Flashing the ESP but not for programing Lua scripts, so the link should be removed!!!)
All works nicely
wifi.setmode(wifi.STATION)
wifi.sta.config("Ray's iPad MR","password")
print(wifi.sta.getip())
led1 = 3
led2 = 4
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive", function(client,request)
local buf = "";
local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
if(method == nil)then
_, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
end
local _GET = {}
if (vars ~= nil)then
for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
_GET[k] = v
end
end
buf = buf.."<h1> ESP8266 Web Server</h1>";
buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a> <a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a> <a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
local _on,_off = "",""
if(_GET.pin == "ON1")then
gpio.write(led1, gpio.HIGH);
elseif(_GET.pin == "OFF1")then
gpio.write(led1, gpio.LOW);
elseif(_GET.pin == "ON2")then
gpio.write(led2, gpio.HIGH);
elseif(_GET.pin == "OFF2")then
gpio.write(led2, gpio.LOW);
end
client:send(buf);
client:close();
collectgarbage();
end)
end)
Ok - let's jump ahead - there are two spare pins, could they be used as an I2C bus, and then you can get some digital I/O with an MCP23008 and analog inputs and outputs with a PCF8591.
Yes, Lua has an I2C driver. I don't know if all the interfaces are inbuilt, or if you have to rebuild the ROM code and reflash it.
The ESP-12 are the best modules as they have a single ADC input and a number of GPIOs. The predecessor was the ESP-03 and I have one.
But you should be able to use GPIO0 & GPIO2 to interface to an I2C device. You only need to reflash the full code, not the lua scripts, so GPIO0 only needs to be grounded for reflashing.
These are the two pins used for the LEDs.
BTW I tried my iPhone 6+ with Safari but it couldn't connect - it seems to try and lookup the IP address rather than use it directly. I am also interested to make sure it can be accessed from outside my local internet. My PC is currently logged onto the same network hotspot. Later I will set my iPhone to a hotspot too, and connect my PC to that network to try.
Lua is based on an alternative-firmware. This firmware is called nodeMCU. nodeMCU replaces the original AT-Firmware.
You have to flash the nodeMCU-firmware into the ESP8266-modules flashrom as described above.
With the nodeMCU-Firmware everything is done by Lua-scripts. The Windows-App LuaLoader.exe simplyfies things like
- setup Accesspoint to which the ESP8266-module should connect automatically after powerup
- query IP-adress given to the ESP8266 after connecting
- set or query GPIOs
- upload and start Lua-scripts into the ESP8266-flashrom
The AT-Firmware means there is a set of AT-commands you can send to the ESP. Each AT-command does a small action and responds
if the action was successfully executed or not. (with this unconsistent responds that make it hard to catch unsuccessful AT-commands)
The Lua-Firmware means there are not only small commands but a complete scripting language. This enables to write Lua-scripts which trigger bigger tasks to be executed
by a single command. With the basic set of Lua-words you can define functions to do whatever you want them to do.
I guess interfaces like I2C, SPI, onewire etc. are coded in the nodeMCU-firmware. But I don't know.
Good find this I2C-scanner. I soldered a test-PCB for a PCF8574 (8bit I2C-Port-expander). I tried this I2C-scan-code successfully.
Though I was wondering why my PCF8574 was found on adress 32 with all adress-pins tyied to ground.
Can somebody explain this to me? (guess without the scanning code I would have never get my runlight-code to work)
So after that I wrote a small demoscript for a "running-light" light Knightrider KIT's Eye
There is a code line inside a wait-loop
tmr.wdclr() -- call this to pat the (watch)dog!
which I found in some other Lua-code.
I thought i would be better to insert this.
heres the LUA-script
-- example-code how to connect the ESP8266 to a PCF8574 I2C-device
-- switching ON/OFF each port of the PCF8574 in a knight-rider kit-style
id = 0 -- need this to identify (software) IC2 bus?
SDA_Pin = 3
SCL_Pin = 4
I2C_Adress = 32
function WriteToPCF8574(IO_Byte)
-- the PCF8574 has opencollector-outputs so the anode of the LEDs must by tied to Vdd permanently
-- switching LEDs ON means to set PCF8574-OutPut to LOW to make a significant current flow
-- if you are tying LEDs kathodes-to ground and trying to switch on LEDs through setting Output high
-- the inner circuitry of the PCF8574 limits the current to 0,1mA.
-- example LED of Port-Bit 1 should be switched on. So only Bit 1 is LOW all other bits Bit0, Bit2..Bit7 are HIGH
-- %11111101 decimal 253. Bit 1 is decimal 2. 255 - 2 = 253 = %11111101
Byte = 255 - IO_Byte
i2c.start(id)
i2c.address(id, I2C_Adress ,i2c.TRANSMITTER)
print ("Write "..IO_Byte.." to PCF8574")
i2c.write(id,Byte)
i2c.stop(id)
end
print("Check for ACK of PCF8574")
i2c.setup(id,SDA_Pin,SCL_Pin,i2c.SLOW) -- initialize i2c with our id and current pins in slow mode :-)
c = i2c.address(id, I2C_Adress ,i2c.TRANSMITTER)
if c == true then
print("PCF8574 found at adress "..I2C_Adress)
else
print("PCF8574 NOT found at adress "..I2C_Adress)
end
delay = 1000
for j = 0,10 do
for n = 0,7 do
Byte = 2^n
for i = 1,delay do
tmr.wdclr() -- call this to pat the (watch)dog!
end
WriteToPCF8574(Byte)
end
for n = 6,1,-1 do
Byte = 2^n
for i = 1,delay do
tmr.wdclr() -- call this to pat the (watch)dog!
end
WriteToPCF8574(Byte)
end
end
I made an quite extensive comment about how to switch on/off-LEDs with a PCF8574. My opinion about commenting is:
if it takes me just 10 minutes to write a comment that will help newbies to understand why the code does it that way
I do it. (It's a piece of learning something extra just by reading at the same playce instead of going on tour to gobble up
this information criss-cross half the internet.=
I am experiencing an issue with many of the commands/modes where the documentation is very clear as to what the options are but completely devoid of what those options do or how they function.
Example: wifi.setmode(mode)
mode: value should be: wifi.STATION, wifi.SOFTAP or wifi.STATIONAP
Ok, fine so far but what is the difference between those modes and when should they be used? I am new to Lau and never liked C (or any flavor of it) and maybe those mode constants are 2nd nature to programmers using those languages.
I searched many different sites without finding out what the modes types mean. All I got was the same list of valid modes. Many of the descriptions are like this.
Sort of like how MS would always use the term you were looking for in their help description of that term.
Problem is, being an old fuddy duddy who has never bought anything on ebay I go searching for such things and see a bunch of possible sellers. Despite their ratings they all look decidedly dodgy to me.
OK, I guess given the cost of this thing I should not worry to much about it.
I clicked once again on the button "Set AP" in LuaLoader.exe
the response is:
> wifi.setmode(wifi.STATION)
> wifi.sta.config("MyAPs Name","MyPassword")
so mode STATION means connect as a client to an accesspoint
SOFTAP means the ESP itself acts as an accesspoint (accesspoint realised in software)
Ouch, price plus shipping gets us to very nearly 40 Euros. Seems a bit excessive seeing as a USB/WIFI dongle is about 10 Euro in the stores around here. Almost as much as buying a Raspberry Pi off the shelf.
- go for a seller with over 99% positive feedback. Only go below (to 98.x%) if there's no choice
- if there is a choice between China and Hong Kong and the price difference isn't too big, go for Hong Kong
- otherwise go for the lowest price (sort on price+shipping lowest)
- if prices are in the same range, de-select the shop which sells clothing and trinkets as their main product (and not electronics)
- avoid ordering several different items at the same time, unless you are familiar with the seller and know that they can manage (oh yes)
- buy from different sellers at the same time if you want to be sure.. usually it will all eventually arrive, but the time can vary drastically. I needed some ZIF sockets and ordered from two sellers. One (well, a pair) arrived today, super-fast. The other probably in a couple of weeks or three from now (that's more common)
- if it doesn't arrive in time (ebay limits), contact the seller *and* raise it with ebay, even if the seller offers a resend or refund - otherwise the time limit will pass. You can always refund the refund if the part eventually arrives (I've done that several times)
Remarkably everything I ever ordered actually arrived.. although one item arrived only this January, after being ordered the previous April. And the seller had ceased all communication. That's the 98% positive category. Avoid those.
All of mine are the -01 model. I'm using them as Wifi senors with an Arduino Mini-Pro.It transmits various environmental data to a UDP server every 5 minutes, sleep and repeat.
Next Project will be a little more complicated so I will probably use a Propeller
The ready-to-go is an auction and not buy it now, so the price may end up higher.. but another seller with nearly the same name, probably the same outfit, has it for $9.42 buy-it-now.
Comments
I am using PST and my PropPlug connected to the ESP8266-01.
GPIO0 to 3V3 (tie to GND to program). When nc, it failed.
CH_PD is tied to 3V3
RST is nc, GPIO2 is nc
Additional Commands (not tried, but here for reference)..
You will need to change the router to your particular router and password.
Spin is working much better than Arduino C. The arduino just can't handle the speed with which the data comes back and misses blocks of the html code. In the arduino uno, if you try to store it as it comes in, it slows things down further. And if you try to store it in a huge buffer, it runs out of ram for other things.
Spin on the other hand can easily gobble up bytes at 9600, and I have no doubt, even faster.
Attached code to send an html request to www.parallax.com
also can upload data to xively. Next step - downloading data from xively. This might seem a bit strange but there is some method to this madness - with setting up local servers it is difficult to get the ip address to stay static. I think there is a new version of the ESP module that can do this but not any I have. So you might set it all up and it works for weeks then you reboot your router and the IP addresses all change and it stops working.
However this problem is avoided by using xively. Also xively can draw graphs of data, plus the data is global. It is password protected - if you use this then it would help to get a personal free xively account rather than using mine.
This is all working very well
I have progressed. Today I programmed nodeMCU, then updated to the latest firmware.
Connected to my AP, connected to google.com to get the time, connected to benlo.com and received the info I sent.
I am not sure how this all works, but I have a free account at no-ip.com which covers the problem of dynamic ip addresses. I needed this when I was testing the WR703's.
I presume it maintains a lookup table for your "username" to the current IP. Of course, this relies on your router/device sending its new ip address when it changes.
I will lookup xively and see if this is similar.
I uploaded a lua-script that does read a DS1820-Sensor evey 5 seconds.
then connects to thingspeak.com sending the temperature-data then disconnects.
In parallel I opened five cmd-windows where each window does endless ping'ing
the ping-times vary from 3ms up 900ms.
In changing order each cmd-window has timeouts when ping'ing.
I guess if the ESP8622 is busy with reading the DS1820 or busy with connecting to the the web
the pings must wait.
But the ESP8266 kept on running continously for hours and each cmd-window comes back to get his pings replied.
Next step would be to establish multiple connections TCP and/or UDP if possible
or a continous datastream over serial and over WiFi at the same time.
best regards
Stefan
That's a pretty good stress test.
I signed up for a thingspeak.com free account last night.
Now to try a few tests and see what I can do. Still running the ESP8266 standalone.
Once that works nicely, I think it will be time to add a Prop to the mix (with Lua)
Got data going both ways. Now can twiddle a pot, and anywhere in the world can have it read out on a servo. Two propeller chips/boards, two ESP8266 chips and not much else really.
This is the xively code to fetch all the feeds
and this is the code to upload a feed
Joining xively is free - you can upload data from vb.net or spin or other microprocessors, and also download it. xively can also display graphs which are handy. The above code and password are my site which I have made public, and if you do a read on this you might see whether I have pumps on or off and how many kilowatts of solar I am producing.
Of course, there are other places to act as a repository of data, but xively is very convenient. I think they would prefer you don't spam the site, so I guess from this I am reading maybe don't send data more than once a minute, so this means if you move a pot, it might take a minute for a servo to move. There might be faster solutions, eg virtual serial links you can set up.
But for uploading data and storing it for many months, then reading it back, this is very convenient. Sensor nodes don't need local SD card storage. Display nodes can be in a different location, so you could have a node out in the yard measuring the soil moisture, and another node in the shed that disables the sprinkler system if it has rained, and yet another node in the house displaying if the garden is a bit parched.
The propeller is just perfect for this.
Ok, next step, get the touchscreen display working with the ESP8266 modules so can walk around the yard turning sprinklers on and off, controlling a drone etc etc
I haven't looked at how it's done. I have a few websites with their own ip addresses
Where I believe I can run cgi or other code. They are hosted in the USA and I don't
use anywhere my data limits.
Would be nice to build this into my site.
Meanwhile, I am using lua on the esp8266, and I then want to use lua commands from the prop
As lua seem quite simple to send and receive data from the remote website.
Your thoughts???
Thingspeak looks simpler than xively eg http://electronut.in/an-iot-project-with-esp8266/
I don't know anything about lua. Can you explain this for dummies - is it run on the esp module, how does it interact with the existing esp commands etc
Somewhere along the line we have to think about passwords - joining a wifi access point needs a password, and you can either program this into the propeller, or you have to have some sort of keyboard/touchscreen/menu to type in a password. Maybe a 20x4LCD and a few pushbuttons. I'm getting around this because none of my wifi access points have passwords but I suspect most people will have passwords on their APs.
nodeMCU is programmed into your ESP8266. This then runs a lua interpreter. Lua is a simpler language to run or interface to, than the AT+ command set.
And you can setup a few lua script files stored on the ESP8266 that you can run on command. The script file "init.lua" runs on power up if it exists.
Here is the link that I used to program nodeMCU into your ESP8266
http://benlo.com/esp8266/
http://benlo.com/esp8266/esp8266QuickStart.html
The only issue I had was with the ESP8266Flasher.exe...
When you flash the latest nodeMCU, on the Config page...
* deselect the INTERNAL//xxx 0x00000
on the following lines, add in (using the locate cog-wheel icon)
* select /nodeMCU-latest.bin 0x0000
* select /esp-init-data-default.bin 0x7c000
* select /blank.bin 0x7e000
Then Flash the code.
The latest lua code is dated 18/3/2015 from here (cannot find the github link )
You need the files
nodemcu-latest.bin 18/3/2015 9:43pm
esp_init_data_default.bin 18/3/2015 10:39pm
blank.bin 18/3/2015 10:39pm
They all came in the file nodemcu-firmware-master.zip
I can email this if you like.
Postedit
https://github.com/nodemcu/nodemcu-firmware/releases/tag/0.9.5_20150318
and download the source code zip file
The nodemcu is in the /latest directory and the default and blank are in the /bin directory.
Here is another lua writeup with examles
https://github.com/nodemcu/nodemcu-firmware
Now you can use LuaLoader.exe to interact with your ESP8266 directly with your pc. This will show you what commands you need the propeller to reproduce.
And here is a script (once you are connected) that will get the time from the google homepage And here is one to send some info to a website, after you are logged on
This will be similar to sending info to xively or thingspeak, etc.
Looks interesting - eg strongest wifi using the propeller involves some string manipulation.
Can I go back a step - I'm still a bit confused about what lua is running on. Have you reflashed the ESP module and lua replaces the code that was on the module? I'm still not up to speed with this - how you write a script, how you download it, what it is actually running on. I'll go back and reread this thread...
Below is my testfile called Rays.lua
The commented lines at the end are not working correctly - still sorting this out
http://randomnerdtutorials.com/esp8266-web-server
using this init.lua code flashed into the esp module using lualoader.exe
rebooting connected to my internet gateway (a mobile hotspot) I received the IP details
xxx.xx.10.5 255.255.255.240 xxx.xx.10.1
I then loaded my web browser and typed in xxx.xx.10.5 (the IP of the ESP) and voila...
A webpage with buttons to turn on/off GPIO0 & GPIO2 (remember GPIO0 is the flash enable to GND for Flashing the ESP but not for programing Lua scripts, so the link should be removed!!!)
All works nicely
Ok - let's jump ahead - there are two spare pins, could they be used as an I2C bus, and then you can get some digital I/O with an MCP23008 and analog inputs and outputs with a PCF8591.
I think lua can talk I2C - eg http://www.esp8266.com/viewtopic.php?f=19&t=1049
The ESP-12 are the best modules as they have a single ADC input and a number of GPIOs. The predecessor was the ESP-03 and I have one.
But you should be able to use GPIO0 & GPIO2 to interface to an I2C device. You only need to reflash the full code, not the lua scripts, so GPIO0 only needs to be grounded for reflashing.
These are the two pins used for the LEDs.
BTW I tried my iPhone 6+ with Safari but it couldn't connect - it seems to try and lookup the IP address rather than use it directly. I am also interested to make sure it can be accessed from outside my local internet. My PC is currently logged onto the same network hotspot. Later I will set my iPhone to a hotspot too, and connect my PC to that network to try.
Here is a nice lua api list
https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#wifisetmode
Lua is based on an alternative-firmware. This firmware is called nodeMCU. nodeMCU replaces the original AT-Firmware.
You have to flash the nodeMCU-firmware into the ESP8266-modules flashrom as described above.
With the nodeMCU-Firmware everything is done by Lua-scripts. The Windows-App LuaLoader.exe simplyfies things like
- setup Accesspoint to which the ESP8266-module should connect automatically after powerup
- query IP-adress given to the ESP8266 after connecting
- set or query GPIOs
- upload and start Lua-scripts into the ESP8266-flashrom
The AT-Firmware means there is a set of AT-commands you can send to the ESP. Each AT-command does a small action and responds
if the action was successfully executed or not. (with this unconsistent responds that make it hard to catch unsuccessful AT-commands)
The Lua-Firmware means there are not only small commands but a complete scripting language. This enables to write Lua-scripts which trigger bigger tasks to be executed
by a single command. With the basic set of Lua-words you can define functions to do whatever you want them to do.
I guess interfaces like I2C, SPI, onewire etc. are coded in the nodeMCU-firmware. But I don't know.
Good find this I2C-scanner. I soldered a test-PCB for a PCF8574 (8bit I2C-Port-expander). I tried this I2C-scan-code successfully.
Though I was wondering why my PCF8574 was found on adress 32 with all adress-pins tyied to ground.
Can somebody explain this to me? (guess without the scanning code I would have never get my runlight-code to work)
So after that I wrote a small demoscript for a "running-light" light Knightrider KIT's Eye
There is a code line inside a wait-loop which I found in some other Lua-code.
I thought i would be better to insert this.
heres the LUA-script
I made an quite extensive comment about how to switch on/off-LEDs with a PCF8574. My opinion about commenting is:
if it takes me just 10 minutes to write a comment that will help newbies to understand why the code does it that way
I do it. (It's a piece of learning something extra just by reading at the same playce instead of going on tour to gobble up
this information criss-cross half the internet.=
best regards
Stefan
Example: wifi.setmode(mode)
mode: value should be: wifi.STATION, wifi.SOFTAP or wifi.STATIONAP
Ok, fine so far but what is the difference between those modes and when should they be used? I am new to Lau and never liked C (or any flavor of it) and maybe those mode constants are 2nd nature to programmers using those languages.
I searched many different sites without finding out what the modes types mean. All I got was the same list of valid modes. Many of the descriptions are like this.
Sort of like how MS would always use the term you were looking for in their help description of that term.
put ESP8266 in the search box
Problem is, being an old fuddy duddy who has never bought anything on ebay I go searching for such things and see a bunch of possible sellers. Despite their ratings they all look decidedly dodgy to me.
OK, I guess given the cost of this thing I should not worry to much about it.
in varying a common sentence: "ebay is your friend:" http://www.ebay.com/sch/i.html?_from=R40&_trksid=p2050601.m570.l1313.TR0.TRC0.H0.Xesp8266+07.TRS0&_nkw=esp8266+07&ghostText=&_sacat=0
the "07" module has all GPIO accessible and has a connector for external antenna
though it's not 0,1 inch spacing it's 2mm spacing
Olimex has a module too. Don't now if olimex is shipping to you
https://www.olimex.com/Products/IoT/MOD-WIFI-ESP8266-DEV/
adafruit has one
http://www.adafruit.com/products/2282
I clicked once again on the button "Set AP" in LuaLoader.exe
the response is:
> wifi.setmode(wifi.STATION)
> wifi.sta.config("MyAPs Name","MyPassword")
so mode STATION means connect as a client to an accesspoint
SOFTAP means the ESP itself acts as an accesspoint (accesspoint realised in software)
best regards
Stefan
http://www.ebay.com/itm/2-69-each-ESP8266-ESP-01-5x-Simple-Serial-WIFIArrive-1-10-BizDays-/281470224472?pt=LH_DefaultDomain_0&hash=item4188eec858
if your going to do the nodeMCU-firmware then I would get the -07 or-12, more I/O on those.
Lots of info at esp8266.com, there's even a build environment for Linux so you can make changes to the default AT-Command load, if you desire.
Ouch, price plus shipping gets us to very nearly 40 Euros. Seems a bit excessive seeing as a USB/WIFI dongle is about 10 Euro in the stores around here. Almost as much as buying a Raspberry Pi off the shelf.
I might have to give this a miss.
http://www.ebay.com/itm/Hot-Selling-Lua-Nodemcu-WIFI-Network-Development-Board-Based-ESP8266-/171731458650?pt=LH_DefaultDomain_0&hash=item27fbfe1a5a
What to do?
- if there is a choice between China and Hong Kong and the price difference isn't too big, go for Hong Kong
- otherwise go for the lowest price (sort on price+shipping lowest)
- if prices are in the same range, de-select the shop which sells clothing and trinkets as their main product (and not electronics)
- avoid ordering several different items at the same time, unless you are familiar with the seller and know that they can manage (oh yes)
- buy from different sellers at the same time if you want to be sure.. usually it will all eventually arrive, but the time can vary drastically. I needed some ZIF sockets and ordered from two sellers. One (well, a pair) arrived today, super-fast. The other probably in a couple of weeks or three from now (that's more common)
- if it doesn't arrive in time (ebay limits), contact the seller *and* raise it with ebay, even if the seller offers a resend or refund - otherwise the time limit will pass. You can always refund the refund if the part eventually arrives (I've done that several times)
Remarkably everything I ever ordered actually arrived.. although one item arrived only this January, after being ordered the previous April. And the seller had ceased all communication. That's the 98% positive category. Avoid those.
-Tor
That looks to be ready to use.
All of mine are the -01 model. I'm using them as Wifi senors with an Arduino Mini-Pro.It transmits various environmental data to a UDP server every 5 minutes, sleep and repeat.
Next Project will be a little more complicated so I will probably use a Propeller
I'm curious to mess with the Lua thing. And there seem to be a bunch of vendors with that same unit.
Unless someone here has a better idea.