分享一种不基于类库的连接物联网的Arduino联网代码-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4128|回复: 4

分享一种不基于类库的连接物联网的Arduino联网代码

[复制链接]
发表于 2016-11-13 02:57 | 显示全部楼层 |阅读模式
虽然各个物联网平台都提供了封装好的联网代码,但是有时以加载第三方类库,Arduino Nano程序内存就不够了。
所以就自己写了相关的程序。
本文实例基于Arduino Nano+EPS8266.
程序使用了虚拟串口。
[mw_shl_code=applescript,true]#include <SoftwareSerial.h>
SoftwareSerial WIFISerial(9, 8);//RX, TX
char gBuffer[250] = {0,};
[/mw_shl_code]

[mw_shl_code=applescript,true]// the setup routine runs once when you press reset:
void setup() {

  Serial.begin(9600);

  Serial.println("Little Thinking");//

  WIFISerial.begin(9600);
  // WIFISerial.println("AT+RST");//
  readAndWriteSerial();
}[/mw_shl_code]

[mw_shl_code=java,true]
void readAndWriteSerial() {
  String buf = "";
  unsigned char  iB = 0;
  unsigned char  len = -1;
  char cC [4] = {0,};

  while (WIFISerial.available() || Serial.available())
  {
    if (WIFISerial.available())
    {
      for (int i = 0; i < 3; i++)
      {
        cC = WIFISerial.read();
        delay(1);
      }

      Serial.write(cC[0]);
      Serial.write(cC[1]);
      Serial.write(cC[2]);
      if ((cC[0] == 'v') && (cC[1] == 'a') && (cC[2] == 'l')
          ||
          (cC[0] == 'a') && (cC[1] == 'l') && (cC[2] == 'u') ||
          (cC[0] == 'l') && (cC[1] == 'u') && (cC[2] == 'e')
         ) {
        iB++;
        len = 1;
      }
      if ((iB == 1) && (len >= 1) && (len < 12)) {
        buf += cC[0];
        buf += cC[1];
        buf += cC[2];
        len += 3;
      }
    }
    if (Serial.available())
    {
      char c = Serial.read();
      delay(2);
      if ('A' == c)  isSetupMode = true;
      WIFISerial.write(c);
    }
  }
#if defined XQX
  if (!buf.equals(""))
  {
    Serial.println(buf);
    int  iT1 = buf.indexOf(":");
    int iT2 = buf.indexOf("}");

    Serial.print("Read from IOT");
    Serial.println(iReader);

    String sT = buf.substring(iT1 + 1, iT2);


    int tmpInt = 0;
    if (1 == iReader) {
      gAirValPlantower[13] = sT.toInt();
      if (1 == sT.toInt())
      {
        isXQXSwitch = false;
      } else
      {
        isXQXSwitch = true;
      }
    }

    if (2 == iReader) {
      gAirValPlantower[5] = sT.toInt();
      if (isXQXSwitch)
      {
        if (sT.toInt() < 5)tmpInt = 0;
        else if (sT.toInt() < 10)tmpInt = 30;
        else if (sT.toInt() < 30)tmpInt = 50 + sT.toInt();
        else if (sT.toInt() < 70)tmpInt = 100 + sT.toInt();
        else if (sT.toInt() < 100)tmpInt = 130 + sT.toInt();
        else  tmpInt = 100 + sT.toInt() * 2;
        if (tmpInt > 255)tmpInt = 255;
        analogWrite(pPwmFan, tmpInt );
      } else
      {
        tmpInt = 1;
        analogWrite(pPwmFan, tmpInt );
      }
    }

    //
    buf = "";
  }
#endif
}[/mw_shl_code]

[mw_shl_code=applescript,true]void sendToNet()
{
  Serial.println(gBuffer);
  WIFISerial.begin(9600);
  WIFISerial.print("AT+CIPSEND=");
  WIFISerial.println(strlen(gBuffer) + 2);
  WIFISerial.println(gBuffer);
}[/mw_shl_code]
[mw_shl_code=applescript,true]void connentToNet()
{
  WIFISerial.begin(9600);
  WIFISerial.println("AT+CIPSTART=\"TCP\",\"api.XXXXXXXXX.com\",80");
}
void postOneNet(float val, const char APIKEY [], unsigned long DEVICEID , const char SENSORID[])
{
  if ( nowTime - lastTime == 17000) {
    connentToNet();
  }

  if (nowTime - lastTime == 19000) {
    char str[8];
    char str2[20];
    dtostrf(val, 6, 2, str);
    // char gBuffer[230] = {0,};
    int thisLength =   sprintf(str2, "{\"%s\":%s}\r\n\r\n", SENSORID, str);
    sprintf(gBuffer, "POST /devices/%ld/datapoints?type=3 HTTP/1.1" "\r\n"
            "api-key: %s" "\r\n"
            "Host: api.XXXXXXXXXX.com" "\r\n"
            "Content-Length: %d" "\r\n"
            "Content-Type: application/x-www-form-urlencoded" "\r\n"
            "\r\n"
            "%s"
            , DEVICEID,   APIKEY, thisLength, str2);
    sendToNet();

    iSensor++;
    if (iSensor > MaxSensorNum)iSensor = 1;
  }
}[/mw_shl_code]
发表于 2016-11-13 10:42 | 显示全部楼层
软串口更消耗内存
 楼主| 发表于 2016-11-13 03:01 | 显示全部楼层
[mw_shl_code=applescript,true]void getOneNet(const char APIKEY [], unsigned long DEVICEID , const char SENSORID[])
{
  if ( nowTime - lastTime == 1001) {
    connentToOneNet();
  }
  if (isReadNetInstant())
  {
    iReader++;
    if (iReader > MaxReaderNum)iReader = 1;
    //  char gBuffer[135] = {0,};
    sprintf(gBuffer, "GET /devices/%ld/datapoints?datastream_id=%s HTTP/1.1\r\napi-key: %s\r\nHost: api.XXXXXXX.com\r\n\r\n"
            , DEVICEID, SENSORID, APIKEY);
    sendToNet();
  }
}[/mw_shl_code]
 楼主| 发表于 2016-11-13 03:03 | 显示全部楼层
注意:EPS8266 -01模块需重新烧录为如下版本  ESP8266固件V0.9.2.3-----------------9600波特率
 楼主| 发表于 2017-3-25 19:36 | 显示全部楼层
奈何col 发表于 2016-11-13 10:42
软串口更消耗内存

软串口是没办法。毕竟arduino的物理串口只有1~2个,二传感器有3~4个呢。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:31 , Processed in 0.264336 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表