wxws 发表于 2015-5-26 09:30:36

用Arduino平台 编译ESP8266(单芯片,不需要at指令)

本帖最后由 wxws 于 2015-5-26 09:32 编辑

ESP8266ARDUINO支持包

开了个群,专门讨论这个: 104345601

ESP8266简介,乐鑫的单芯片wifi 控制器
目前市面上有3种开发方式:
1:使用乐鑫AT 固件,使用时,单片机通过串口用AT指令来实现wifi连接、网络通迅
2:使用乐鑫SDK开发包,直接用C编程
3:使用NODEMCU固件,这是国内大能 在SDK基础上,加入了LUA语言


现在,出现了第4种开发方式,arduino直接编程,原理还是在SDK基础上开发,不过已经封装为我们熟的ARDUINO语言了。
注意已经不需要ARDUINO硬件了,只是利用arduino软件来编译8266的源码。

硬件效果=原arduino +w5500=单颗esp8266

出处:
https://github.com/sandeepmistry/esp8266-Arduino
(基于https://github.com/esp8266/Arduino,不过上面这个安装方便,另这个不会编译,有会的指点下)

百度网盘链接:http://pan.baidu.com/s/1eQxq53s 密码:64wd
内有arduino1.64 与支持包

Arduino IDE 1.6.0 or later

Installing

Create a folder named hardware in your Sketchbook folder, usually:
Linux: ~/Sketchbook
OS X: ~/Documents/Arduino
Windows: ~/My Document/Arduino
Download a release
Extract release
Place esp8266com folder in hardware folder created in step 1.
Start or restart the Arduino IDE

安装:
1:先运行一次arduino软件后关闭。
2:windows:在~/My Document/Arduino 下,建一文件夹“hardware"
3:装压缩包中的esp8266com文件夹,放入上述目录
4:启动arduino,工具菜单中选择NODEMCU即可,下载时支持自动reset.

NodeMCU与esp8266关系:
http://nodemcu.com/images/thumbnail/z1s_1.jpg_450x300.jpg

就是个普通8266模块+WCH340 USB串口,并支持自动复位,就象以前的arduino一样。
本来由国内大能将LUA语言,内置在了8266中,开发也较以前AT方便,也能单芯片,可
惜的是,8266内存不够,跑了LUA,错误百出。


当然,本支持包也直接支持8266模块,接线图:
https://raw.githubusercontent.com/Links2004/Arduino/esp8266/docs/ESP01_connect.jpg



wxws 发表于 2015-5-26 09:36:09

本帖最后由 wxws 于 2015-5-26 09:38 编辑

例子:

用ARDINO给ESP8266编程
单芯片实现 fuhomenet 客户端(支持透网,WEB,APK)

请与这个作一下比较,
arduino+w5500实现的有线网络客户端
http://www.fuhome.net/bbs/forum.php?mod=viewthread&tid=2040&extra=page%3D2/*
8266fuhome.ino:
by:wxwsqq:1103012
群:Arduino_ESP8266开发 104345601

协议:
http://www.fuhome.net/api/must/

服务器IP:115.28.93.201
         udp端口:7001

30s
心跳发送: f=1设备id密码
心跳:f=1&d=设备id&m=密码&from=sb->server
心跳收到返回:f=1&d=设备id&from=server->sb1

远程收到命令:f=a&d=设备id&n=jyzhkj&com=open&from=server->sb
命令返回:f=b设备id密码 用户名响应消息(可自定义)
返回:f=b&d=设备id&m=密码&n=jyzhkj&com=open&from=sb->server

*/


#include <ESP8266WiFi.h>
#include <WiFiUdp.h>


#define DHCP 0

WiFiUDP Udp;



char ssid[] = "jyzhkj0";//your network SSID (name)
char pass[] = "868996310";       // your network password


unsigned int localPort = 7001;      // 本地端口

IPAddress rip(115, 28, 93, 201); //fuhome的服务器ip
unsigned int rPort = 7001;      // 服务器端口

String deviceid = "00000000"; //改成你的设备ID,需先在fuhome.net上注册,并增加一个新设备,详见网站
String deviceps = "0123456789"; //设备密码

String Heart = "";
String HeartTemp = "f=1&d=%s1&m=%s2&z=%s3&from=sb->server"; //心跳包模板
String ReplyTemp = "f=b&d=%s1&m=%s2&n=%s3&com=%s4&from=sb->server";      //命令包模板
String SendValue = "f=d&d=%s1&m=%s2&num=123&c=1&a=%s3&from=sb->server";//设备附加传感器数据

String udpget = "";
String usename = "";
String command = "";
char ttc;

#define LED 16      //板载LED灯GPIO16口
int ledstate = 1;
unsigned int RemoteCount = 0;

void setup()
{
    Serial.begin(115200);
    // start the Ethernet and UDP:
    pinMode(LED, OUTPUT);
    digitalWrite(LED, 0);

    WiFi.begin(ssid, pass);

    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
    Serial.println("");

    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    Udp.begin(localPort);


    ReplyTemp.replace("%s1", deviceid);
    ReplyTemp.replace("%s2", deviceps);

    SendValue.replace("%s1", deviceid);
    SendValue.replace("%s2", deviceps);

}

void loop()
{
    // if there's data available, read a packet
    int packetSize = Udp.parsePacket();
    if (packetSize)
    {

      udpget = "";
      for (int i = 0; i < packetSize; i++)
      {
            udpget += (char)Udp.read();
      }


      Serial.print(getuptime());
      Serial.print(" R:");
      Serial.println(udpget);


      if (udpget.indexOf("f=a") >= 0)//心跳包不响应
      {

            usename = Findany("&n=");
            command = Findany("&com=");


            if (command == "open")
            {
                ledstate = 1;
                command = "完成" + command;

            }
            if (command == "close")
            {
                ledstate = 0;
                command = "完成" + command;
            }
            if (command == "flash")
            {
                ledstate = 2;
                command = "完成" + command;
            }

            udpget = ReplyTemp;
            udpget.replace("%s3", usename);
            udpget.replace("%s4", command);
            udpget.toCharArray(ttc, 100);


            Serial.print("   Send reply:");
            Serial.println(udpget);

            //Udp.beginPacket( rip,rPort );
            Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
            Udp.write(ttc);   //状态响应回复包f=b&d=设备ID&m=设备密码&n=jyzhkj&com=命令&from=sb->server
            Udp.endPacket();

            RemoteCount++;
      }
      else
      {
            // if (udpget.indexOf("f=1") >= 0)//心跳包
            //   Serial.println("Recive f=1.");
            // if (udpget.indexOf("f=b") >= 0)//回复包
            //   Serial.println("Recive f=b.");

      }
    }

    LedControl();
    UdpHeart();//心跳
    UpValue();//传感器上传
}

//灯状态切换
void LedControl()
{
    static long previousMillis = 0;
    static int currstate = 0;

    switch (ledstate)
    {
    case 0:
      currstate = 1;
      break;
    case 1:
      currstate = 0;//点亮
      break;
    case 2:
      if (millis() - previousMillis > 200)//200ms
      {
            previousMillis = millis();
            currstate = 1 - currstate;
      }
      break;
    }

    digitalWrite(LED, currstate);

}

//查找参数,下一个“&”为界
String Findany(String findstr)
{
    String ttv = "";
    int t1, t2;
    t1 = udpget.indexOf(findstr);
    if (t1 >= 0)
    {
      t2 = udpget.indexOf("&", t1 + 1);
      ttv = udpget.substring(t1 + findstr.length(), t2);
    }

    return ttv;
}

//上传 传感器值
void UpValue()
{
    static unsignedint previouscount = 999;

    if (previouscount != RemoteCount)
    {

      previouscount = RemoteCount;
      Heart = SendValue;
      Heart.replace("%s1", deviceid);//d
      Heart.replace("%s2", deviceps);//m
      Heart.replace("%s3", String(RemoteCount));//传感器值

      Serial.print(getuptime());
      Serial.print(" V:");
      Serial.println(Heart);

      Heart.toCharArray(ttc, 200);
      Udp.beginPacket(rip, rPort);
      Udp.write(ttc);   //心跳包   f=1&d=设备ID&m=设备密码&from=sb->server

      Udp.endPacket();


    }
}



//UDP心跳包
void UdpHeart()
{
    static long previousMillis = -4000;

    if (millis() - previousMillis > 30000)//30秒
    {

      previousMillis = millis();
      Heart = HeartTemp;
      Heart.replace("%s1", deviceid);//d
      Heart.replace("%s2", deviceps);//m
      Heart.replace("%s3", getuptime());//z状态

      Serial.print("ESP.getFreeHeap():");
      Serial.println(ESP.getFreeHeap());
      Serial.print(getuptime());
      Serial.print(" S:");
      Serial.println(Heart);

      Heart.toCharArray(ttc, 200);
      Udp.beginPacket(rip, rPort);
      Udp.write(ttc);   //心跳包   f=1&d=设备ID&m=设备密码&from=sb->server

      Udp.endPacket();


    }
}


Stringgetuptime() //从millis转换成 天数:小时:分:秒
{

    String tts = "";
    long days = 0;
    long hours = 0;
    long mins = 0;
    long secs = 0;
    char ccc;
    secs = millis() / 1000; //convect milliseconds to seconds
    mins = secs / 60; //convert seconds to minutes
    hours = mins / 60; //convert minutes to hours
    days = hours / 24; //convert hours to days
    secs = secs - (mins * 60); //subtract the coverted seconds to minutes in order to display 59 secs max
    mins = mins - (hours * 60); //subtract the coverted minutes to hours in order to display 59 minutes max
    hours = hours - (days * 24); //subtract the coverted hours to days in order to display 23 hours max

    sprintf(ccc, "%02d:%02d:%02d:%02d", int(days), int(hours), int(mins), int(secs));
    tts = String(ccc);
    return tts;
}

wxws 发表于 2015-5-26 09:41:06

arduino+w5500做的设备端:不断电运行12天了
http://www.fuhome.net/home/?id=40


esp8266 做的wifi设备端:
http://www.fuhome.net/home/?id=436

I-robofan 发表于 2015-5-26 10:47:52

八错,正想使用nodemcu玩玩呢,你个对arduino来说,更亲民了:lol

wxws 发表于 2015-5-27 13:02:47

最新SDK1.1 支持包
网盘地址:链接:http://pan.baidu.com/s/1bnEXNGj 密码:2lqc
已经支持ESP-12E 模块
1:安装arduino1.64
2:再将本rar中的portable目录释放至arduino目录中
注意与arduino.exe同级
SDK:1.1
更新日期2015-5-27
源头:https://github.com/esp8266/Arduino
页: [1]
查看完整版本: 用Arduino平台 编译ESP8266(单芯片,不需要at指令)