#Arduino(代码记录)

设备:esp32c3


IDE:Arduino


实验:

(1)获取网络时间,b站粉丝数和b站关注数,心知天气

ArduinoJson需要从库管理下载

#include "HTTPClient.h"
#include "WiFi.h"
#include "ArduinoJson.h"
char *ssid ="Redmi K40 Gaming";
char *pswd ="87654321";

/*
 *获取b站粉丝数和关注up主数量
 *https://api.bilibili.com/x/relation/stat?vmid=1387378819
 *vmid为自己b站的uid
 *返回
 {
    "code": 0,
    "message": "0",
    "ttl": 1,
    "data": {
        "mid": 1387378819,
        "following": 139,
        "whisper": 0,
        "black": 1,
        "follower": 44
    }
}
 */
void GetFollower_Following(void)
 {
   HTTPClient http;
   http.begin("https://api.bilibili.com/x/relation/stat?vmid=1387378819");
   int httpCode=http.GET();
   DynamicJsonDocument doc(1024);
   if(httpCode==200)     //服务器响应成功
   {
    String payload=http.getString();
    deserializeJson(doc,payload);
    int follower=doc["data"]["follower"].as<int>();
    int following=doc["data"]["following"].as<int>();
    String uid=doc["data"]["mid"].as<String>();
    Serial.println("用户: "+uid);
    Serial.printf("粉丝数: %d\r\n",follower);   
    Serial.printf("关注up主数: %d\r\n",following);
   }
   http.end();
 }

void ConnectWifi(void)
{
  WiFi.mode(WIFI_MODE_STA);
  WiFi.begin(ssid,pswd);
  Serial.print("连接wifi中");
  while(WiFi.status()!= WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.print("连接成功");
}

/*
 *连接网络
 *HTTP 状态码的英文为 HTTP Status Code
 *200 - 请求成功
 *301 - 资源(网页等)被永久转移到其它URL
 *404 - 请求的资源(网页等)不存在
 *500 - 内部服务器错误

 *访问http://quan.suning.com/getSysTime.do
 *返回:
 {"sysTime2":"2024-04-09 13:56:34","sysTime1":"20240409135634"}
 
 */
void GetTime(void)
{
   HTTPClient http;
   http.begin("http://quan.suning.com/getSysTime.do");
   int httpCode=http.GET();
   DynamicJsonDocument doc(1024);
   if(httpCode==200)     //服务器响应成功
   {
    String payload=http.getString();
    deserializeJson(doc,payload);
    String time=doc["sysTime2"].as<String>();
    Serial.println("当前时间:");   //带ln后缀的,打印后换行
    Serial.println(time);
   }
   http.end();
}

/*
 *获取心知天气数据
 *访问:https://api.seniverse.com/v3/weather/now.json?key=自己的密钥&location=chongqing&language=zh-Hans&unit=c

 *返回:
{
    "results": [
        {
            "location": {
                "id": "WM7B0X53DZW2",
                "name": "重庆",
                "country": "CN",
                "path": "重庆,重庆,中国",
                "timezone": "Asia/Shanghai",
                "timezone_offset": "+08:00"
            },
            "now": {
                "text": "阴",
                "code": "9",
                "temperature": "21"
            },
            "last_update": "2024-04-09T14:26:30+08:00"
        }
    ]
}
 */
void Get_Weather(String city,String key)
{
   HTTPClient http;
   http.begin("https://api.seniverse.com/v3/weather/now.json?key="+key+"&location="+city+"&language=zh-Hans&unit=c");
   int httpCode=http.GET();
   DynamicJsonDocument doc(1024);
   if(httpCode==200)     //服务器响应成功
   {
    String payload=http.getString();
    deserializeJson(doc,payload);
    //results里面中是一个[]代表是数组,而且只有一个数组,即下标为0处中有location,now,last_update三个对象
    String city=doc["results"][0]["location"]["name"].as<String>();
    int temperature=doc["results"][0]["now"]["temperature"].as<int>();
    String weather=doc["results"][0]["now"]["text"].as<String>();
    Serial.println("所处城市: "+city);   //带ln后缀的,打印后换行
    Serial.println("天气状况: "+weather);
    Serial.printf("气温: %d ℃",temperature);
   }
   http.end();
}
void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
ConnectWifi();
GetTime();
GetFollower_Following();
Get_Weather("chongqing","私钥");
}

void loop() {
  // put your main code here, to run repeatedly:

}

(2)MQTT主题订阅发布

需要下载测试工具MQTTX (此时单片机已经下载程序运行)

 

 

#include <WiFi.h>
#include <PubSubClient.h>

#define LED 12
#define LED_CTRL 13

float shuifei=23.45;
float dianfei=33.71;

char *ssid="Redmi K40 Gaming";
char *pswd="87654321";

WiFiClient tcpclient;
PubSubClient mqttClient;  //mqtt客户端对象
const char *mqtt_broker_address="broker.mqttdashboard.com";   //服务器地址
const uint16_t mqtt_broker_port=1883;       //服务器端口号
const uint16_t mqtt_client_buff_size=4096;  //客户端缓存大小(非必须)
String mqtt_client_id="esp32c3_client";     //客户端ID
const char *mqtt_topic_pub="esp32c3_publish_topic";  //发布的主题
const char *mqtt_topic_sub="esp32c3_subscrib_topic"; //订阅的主题
char str[256];

//回调函数
void mqtt_callback(char *topic,byte *payload,unsigned int length)
{
Serial.println("********************************begin**********************************");
Serial.printf("收到主题: %s ,消息长度:%d",topic,length);
//Serial.println(payload);
String msg="";
for(int i=0;i<length;i++)
{
  msg +=(char)payload[i];
}
if(msg=="开灯")   //找到开灯的消息
   {
   digitalWrite(LED_CTRL,HIGH);
   Serial.println("开灯");
   }
else if(msg=="关灯")  //找到关灯的消息
   {
   digitalWrite(LED_CTRL,LOW);
   Serial.println("关灯");
   }

Serial.println("********************************end************************************");
}

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
pinMode(LED,OUTPUT);
pinMode(LED_CTRL,OUTPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,pswd);  
Serial.print("连接WIFI中");
while(WiFi.status()!=WL_CONNECTED)
{
  Serial.print(".");
  delay(500);
}
Serial.printf("\r\n连接成功\r\n");

mqttClient.setClient(tcpclient);
mqttClient.setServer(mqtt_broker_address,mqtt_broker_port);
mqttClient.setBufferSize(mqtt_client_buff_size);
mqttClient.setCallback(mqtt_callback);          //设置回调函数(接收到消息)
}

void loop() {
// put your main code here, to run repeatedly:
sprintf(str,"水费:%.2f,电费: %.2f",shuifei,dianfei);
if(!mqttClient.connected())   //如果断开连接
{
   if(mqttClient.connect(mqtt_client_id.c_str()))  //尝试连接服务器
     {
      Serial.println("成功连接服务器");
      mqttClient.subscribe(mqtt_topic_sub);    //订阅主题
     }
}
else if(mqttClient.connected())   //如果连接正常 发布消息
{
    mqttClient.publish(mqtt_topic_pub,str);
    digitalWrite(LED,!digitalRead(LED));
}

mqttClient.loop();  //处理网络事件和调度回调,例如接收服务器发送的消息、发送未发送的消息等
delay(1000);
}

记录:


代码:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值