首页 > 其他分享 >servo_led共用pin

servo_led共用pin

时间:2024-03-31 20:23:34浏览次数:21  
标签:LED pin servo BUILTIN client led Serial

舵机和LED使用了同一个GPIO,但他们确实可以正常使用。

原因是引脚只是给出一定脉宽的信号,而舵机和LED分别对这个信号做出响应。

20ms的脉冲周期,各自脉宽的表现

  • LED在20ms时熄灭,随着脉宽减小,越来越亮。

  • 舵机在0.5ms至2.5ms之间工作,其余部分都不工作

因此只要设置LED亮度时避开舵机工作区间即可。

digitalWrite时LED只能被设置为最亮或熄灭,避开了舵机工作区间。

若使用analogWrite控制LED亮度,同理只要避开舵机区间即可。

代码见下:(110行有测试)

#include <ESP8266WiFi.h>
#include <Servo.h>
#include <PubSubClient.h>

//WiFi config
const char* ssid = "Tenda_D7BEA8";
const char* pwd = "********";

//mqtt config
const char* mqtt_broker = "192.168.0.103";
const int mqtt_port = 1883;
const char* topic = "/lock";
WiFiClient espclient;
PubSubClient client(espclient); //必须传一个client作为参数

//servo config
#define servo_pin 2     //GPIO2--D4 //和灯共用一个pin,但是控制舵机的脉宽只有一小部分。
#define servo_ON 60     //开门的角度
#define servo_OFF 150   //回位的角度
Servo servo;

//LED config
#define led_OFF 199 //200即占空比100%时不亮,占空比越低越亮
#define led_ON  100

void setup() {
  analogWriteFreq(50);
  analogWriteRange(200);  //0.1ms

  Serial.begin(115200);
  Serial.println();

  //LED
  analogWrite(LED_BUILTIN, led_ON); //注意LED_BUILTIN也是GPIO2

  //servo
  servo.attach(servo_pin, 500, 2500);
  servo.write(servo_OFF);
  delay(100);

  //wifi
  connect_wifi();

  //mqtt
  client.setServer(mqtt_broker, mqtt_port);
  client.setCallback(callback);
  connect_mqtt();
  client.subscribe(topic);
}

void loop() {
  client.loop();
}



void connect_wifi() {
  analogWrite(LED_BUILTIN, led_ON);
  Serial.printf("connecting to %s......", ssid);
  WiFi.begin(ssid, pwd);
  while (!WiFi.isConnected()) {
    delay(500);
  }
  Serial.println("connected");
  analogWrite(LED_BUILTIN, led_OFF);
}

void reconnect_wifi() {
  Serial.printf("reconnecting to %s......", ssid);
  analogWrite(LED_BUILTIN, led_ON);
  WiFi.disconnect();  //清楚连接信息,防止路由器重启后信道变化
  WiFi.begin(ssid, pwd);
  while (!WiFi.isConnected()) {
    delay(500);
  }
  Serial.println("connected");
  analogWrite(LED_BUILTIN, led_OFF);
  delay(20);
}

void connect_mqtt() {
  analogWrite(LED_BUILTIN, led_ON);
  while (!client.connected()) {
    String client_id = "esp8266-client-" + String(WiFi.macAddress());
    Serial.printf("client %s is connecting to broker %s ... ", client_id.c_str(), mqtt_broker);
    if (client.connect(client_id.c_str())) {
      Serial.println("connected");
      delay(20);
    } else {
      Serial.printf("failed with state %d\n", client.state());
      delay(2000);
    }
  }
  analogWrite(LED_BUILTIN, led_OFF);
  delay(20);
}

void callback(char *topic, uint8_t *payload, unsigned int length) {
  analogWrite(LED_BUILTIN, led_ON);
  String msg = "";
  for (unsigned int i = 0; i < length; i++) {
    msg += (char)payload[i];
  }
  Serial.printf("receive message from topic %s: %s\n", topic, msg.c_str());

  act_on_msg(msg);

  Serial.println("--------------------------");
  // delay(1000);
  // analogWrite(LED_BUILTIN, 5);  //这里本只想控制灯但是这个脉宽在舵机控制范围内,所以它被驱动
  analogWrite(LED_BUILTIN, led_OFF);
}

void act_on_msg(String msg) {
  if (msg.equals("open_door")) {
    servo.write(servo_ON);
    delay(2000);
  }
  servo.write(servo_OFF);
  delay(200);
}

标签:LED,pin,servo,BUILTIN,client,led,Serial
From: https://www.cnblogs.com/faf4r/p/18107194

相关文章

  • pink前端--小知识点汇总 练手小案例
    一 用子绝夫相定位模式:当鼠标经过时出现遮罩层1.1代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><......
  • GIS用户的Deepin V23系统使用记录
    一、系统安装:截止到2024年3月31日,Deepin最新版本为Deepinv23Beta3。在各种软件源下载系统ISO安装,个人是在清华源。1.准备一个U盘或者移动硬盘,安装好Ventoy,把Deepin的ISO放进去,这样,就制作好了系统启动盘。2.推荐为Deepin系统单独准备一块硬盘,从Ventoy启动之后,选择Deepinv23的......
  • Scheduling and Traffic Shaping 学习笔记(一)
    Time-AwareShaping  参考:https://inet.omnetpp.org/docs/showcases/tsn/trafficshaping/timeawareshaper/doc/index.html目标:时间感知整形的工作原理是将时间划分为固定的间隔或窗口,并根据帧的优先级在这些窗口内调度帧的传输。通过在单独的窗口中发送优先级较高的帧来......
  • Pintia 天梯地图 dijkstra进阶
    7-14天梯地图-SMU2024spring天梯赛3(补题)(pintia.cn)dijkstra进阶做法,包含路径记录,以及按权重统计路径条件等;不过最开始我一直将优先队列开的最大堆,但是一直过不了自己的例子,后来改成最小堆并且路径值改成负数存进去就对了,再后来我发现改成最大堆也可以,不过要把......
  • ESP8266_Servo
    Servo的使用,以SG90舵机为例舵机控制说明(Servo.h里时间单位都是微秒us,角度是°)舵机通过脉冲宽度的时间来控制(PWM),频率是50Hz的(即一个周期是20ms)。(!!!脉宽是本质)SG90舵机的控制参数范围是:0°:0.5ms,180°:2.5ms。然后对于每一度,将脉宽范围除以180°即得。servo.attach......
  • 基于瑞萨RA6M5开发板的OLED显示
            最近收到来自瑞萨的开发板,型号为R7FA6M5BF2CB6,板子引出许多IO口,使用板子的第一步当然是点亮OLED了,这是利用这块开发板完成项目的前提。        手边只有四角OLED屏幕,所以使用它来进行测试。编译环境为e2studio        起初是准备使用硬......
  • 题解 ARC175C【Jumping Through Intervals】
    先不考虑构造字典序最小的方案,只考虑求出最小的\(\sum\limits_{i=1}^{N-1}|A_{i+1}-A_i|\)。设定义域为\([L_i,R_i]\)的函数\(F_i(x)\)表示考虑后缀\([i,N]\),令\(A_i=x\)时上式最小的值。初值为\(F_N(x)=0,(x\in[L_N,R_N])\)。显然有转移方程:\[F_i(x)=\min\limits_{y......
  • atomic.SwapInt64
    atomic.SwapInt64汇编不再浪费时间去找源码了,因为atomic这部分的实现全部都依赖于底层的汇编指令​​会发现一件事情,那就是这里的实现和Store是几乎一致的,为什么呢?原因出在XCHGXCHG​XCHG​是x86架构汇编语言中的一条指令,它的全称是“ExchangeRegister/Memorywi......
  • 大电流LED驱动/数码管驱动芯片VK16K33A SOP28,适用于电饭煲,数字电表等
    产品品牌:永嘉微电/VINKA产品型号:VK16K33A封装形式:SOP28概述:VK16K33A是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、键盘扫描、LED驱动模块等电路。数据通过I2C通讯接口与MCU通信。SEG脚接LED阳极,GRID脚接LED阴极,可支持16SEGx8GRID的点阵LED......
  • 20设置永久默认网关,ping不通外网、网络不可达
    1.使用route-n查看路由route-n2.手动添加一条默认网关但是这个只是临时生效,重启会丢失routeadddefaultgw192.168.230.23.配置永久默认网关/etc/sysconfig/network在文件/etc/sysconfig/network里面,添加一条默认网关GATEWAY=192.168.230.2重启systemctlres......