WizFi Orb Article Code
Tom Cantrell
Posts: 4
Hello Parallaxians:
I wrote an article recently about using WizNET WizFi210 Wi-Fi module with Prop BOE...
http://www.digikey.com/us/en/techzone/microcontroller/resources/articles/wi-fi-orb-sees-all.html?WT.z_sm_link=G+_microtzart_1010
...so I thought I'd post the code if anyone wants to play around.
Here's what you'll see on the terminal...
Symbol = .dji
perc = -0.35
trade_date = 20121105
trade_time = 151100
Symbol = .dji
perc = -0.29
trade_date = 20121105
trade_time = 151301
As mentioned in the article, this code assumes the WizFi210 has been provisioned with your network parameters (SSID, security, etc.) and also the WizFi210 baud rate should match the setting in the code (WizFi.start), 57.6K in this example. Thanks to the eifficiency of SPIN and high-level functions of the WizFi module (ex: DNS) it only takes about 3KB. I'm using two red and two green leds on the PropBOE to 'ambientize' the DJIA data, would like to do something more creative if I find any spare time. .
-- Tom Cantrell
I wrote an article recently about using WizNET WizFi210 Wi-Fi module with Prop BOE...
http://www.digikey.com/us/en/techzone/microcontroller/resources/articles/wi-fi-orb-sees-all.html?WT.z_sm_link=G+_microtzart_1010
...so I thought I'd post the code if anyone wants to play around.
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 OBJ debug : "Parallax Serial Terminal" WizFi : "FullDuplexSerial" CON lenipaddr = 18 'max length ip address string incl. cr/lf lenxmls = 100 'max length xml field data DAT ssid byte "your_ssid",$d,0 'replace with your wlan ssid website byte "[URL="http://www.google.com",$d,0"]www.google.com",$d,0[/URL] 'using Google get byte "GET /ig/api?stock=" 'finance data api ' symbol byte ".dji",$d,$a,0 'stock symbol ex:.dji,aapl,ibm numkeys byte 3 keys byte "perc",0,"trade_date",0,"trade_time",0 'xml keys VAR byte i,j,k,rxbyte,ipaddr[lenipaddr],xmls[lenxmls] PUB WizFiOrb 'gets xml data items from a webpage Debug.start(115_200) 'start debug terminal WizFi.start(6,7,0,57600) 'start uart connected to WizFi dira[12..15]~~ 'use two red and two green leds on BOE waitcnt((clkfreq*3) + cnt) 'some delay to enable/view PST Debug.str(string($d,"WizFi Orb",$d)) REPEAT REPEAT ' Debug.str(string($d,"trying to wakeup...")) WizFi.str(string("at",$d)) 'dummy command to wakeup WizFi REPEAT UNTIL WizFi.rx == $5B UNTIL WizFi.rx=="O" ' Debug.str(string("awake")) REPEAT ' Debug.Str(string($d,"trying to associate...")) WizFi.str(string("at+wa=")) WizFi.str(@ssid) '(re)try to associate REPEAT UNTIL WizFi.rx == $5B 'look for "[" UNTIL WizFi.rx == "O" 'retry until WizFi says "[OK]" ' Debug.Str(string("associated",$d)) WizFi.str(string("at+dnslookup=")) 'lookup website ip address WizFi.str(@website) ' Debug.str(string("looking up IP...")) REPEAT UNTIL WizFi.rx == ":" ': marks start of returned ip address REPEAT i from 0 to lenipaddr-1 ipaddr[i] := WizFi.rx 'save ip address digits ' Debug.char(ipaddr[i]) IF ipaddr[i] == $d 'and terminating carriage return quit ' Debug.str(string("creating socket...")) REPEAT WizFi.str(string("at+nauto=0,1,"))'create tcp client connection i:=0 REPEAT UNTIL ipaddr[i]==$d WizFi.tx(ipaddr[i]) 'send IP address digits i++ WizFi.str(string(",80",$d)) 'port 80 REPEAT UNTIL WizFi.rx == $5B 'look for "[" UNTIL WizFi.rx=="O" 'retry until WizFi says "[OK]" ' Debug.str(string("created",$d)) ' Debug.str(string("connecting...")) REPEAT WizFi.str(string("ata2",$d)) 'connect to website server REPEAT UNTIL WizFi.rx == $5B UNTIL WizFi.rx=="O" ' Debug.str(string("connected",$d)) WizFi.str(@get) 'send http GET request REPEAT 'skip HTTP response header i:=WizFi.rx UNTIL (i==$0a)AND(WizFi.rx==$0d) k:=0 'k is offset for each key in keys j:=0 'j is pointer to build xml string REPEAT numkeys 'for each key in keys i:=0 'i counts consecutive key char matches REPEAT 'search incoming webpage for key CASE WizFi.rx == keys[k+i] 'count consecutive key char matches TRUE : i++ 'increment if match FALSE : i := 0 'clear otherwise UNTIL keys[k+i+1] == 0 'until key matched k:=k+i+2 'point to next key REPEAT 'find opening doublequote UNTIL WizFi.rx == $22 REPEAT 'gather desired data xmls[j] := WizFi.rx j++ UNTIL xmls[j-1] == $22 'until closing doublequote xmls[j-1] := $d 'put carriage return after data k:=0 'k steps through keys j:=0 'j steps through xmls Debug.str(string($d,"Symbol = ")) Debug.str(@symbol) REPEAT numkeys 'for each key Debug.str(string(" ")) REPEAT 'display key Debug.char(keys[k]) k++ UNTIL keys[k]==0 Debug.str(string(" = ")) REPEAT 'display value Debug.char(xmls[j]) j++ UNTIL xmls[j-1]==$d IF xmls[0]=="-" 'show on leds IF xmls[1]=="0" OUTA[12..15]:=%0010 '..down < 1% = one red led ELSE OUTA[12..15]:=%0011 '..down >= 1% = two red leds ELSE IF xmls[0]=="0" OUTA[12..15]:=%0100 '..up < 1% = one green led ELSE OUTA[12..15]:=%1100 '..up >= 1% = two green leds ' Debug.str(string("command mode",$d)) REPEAT WizFi.str(string("+++")) 'request WizFi to command mode waitcnt(clkfreq + cnt) 'wait for WizFi to command mode WizFi.str(string("at",$d)) 'confirm WizFi to command mode REPEAT UNTIL WizFi.rx == $5B 'look for [ UNTIL WizFi.rx=="O" 'retry until WizFi says [OK] ' Debug.str(string("hang up",$d)) REPEAT WizFi.str(string("ath",$d)) 'hang-up i.e. disassociate REPEAT UNTIL WizFi.rx == $5B 'look for "[" UNTIL WizFi.rx=="O" 'retry until WizFi says [OK] ' Debug.str(string("sleep",$d)) WizFi.str(string("at+psdpsleep",$d)) 'put WizFi to sleep waitcnt((clkfreq*45)+cnt) 'put MCU to sleep waitcnt((clkfreq*45)+cnt) 'put MCU to sleep
Here's what you'll see on the terminal...
Symbol = .dji
perc = -0.35
trade_date = 20121105
trade_time = 151100
Symbol = .dji
perc = -0.29
trade_date = 20121105
trade_time = 151301
As mentioned in the article, this code assumes the WizFi210 has been provisioned with your network parameters (SSID, security, etc.) and also the WizFi210 baud rate should match the setting in the code (WizFi.start), 57.6K in this example. Thanks to the eifficiency of SPIN and high-level functions of the WizFi module (ex: DNS) it only takes about 3KB. I'm using two red and two green leds on the PropBOE to 'ambientize' the DJIA data, would like to do something more creative if I find any spare time. .
-- Tom Cantrell
Comments
We are most honored to have you on the forums. You're proof that there's a bunch of talent out there that doesn't frequent our forums.
The article was very clear and I hope to use the code myself at some point in the future.
I'm realizing it was 20+ years ago that this kid aptly named Chip showed up on my doorstep with his PIC-programmer gadget. And I've been a big fan of Parallax ever since! And how fortunate he had a brother Ken to help run the business with class & passion. I've tried a zillion SBCs over the years, but when I have a brainstorm and want to get something working right now I reach for Parallax. PS: Don't take my non-presence on the forums personally, I'm just kind of anti-social (media :=).
Mike G: The WizNet folks pointed me to the work you're doing with their wired Ethernet chip and it's quite impressive! So impressive I implore you not to look at my toy program or comment thereupon :=) If there's meaningful takeaway from the article it's a) 'Embedded Wi-Fi' taking off, b) 'Big Data' - where is it, who owns/guarantees it, how to use it?, c) idea of 'ambience' vs. staring at a screen.
I'm sure I'll be doing some more projects using Parallax gear Ken, I'll definitely come back and keep you posted.
-- Tom