You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino自动垃圾桶项目报错:sg90(int类型)调用write成员失败

Arduino自动垃圾桶代码错误修复方案

问题根源

你错误地将舵机控制变量sg90定义成了普通整型变量(int sg90 = 8;),但Servo库的write()方法只能被Servo类对象调用,普通int变量没有这个成员方法,因此编译器报错。

修复步骤

  • 修正舵机对象定义:把int sg90 = 8;替换为Servo sg90;,创建一个Servo类实例,这样才能调用attach()和write()等舵机控制方法。
  • 修正舵机角度参数:代码里的sg90.write(LOW)是错误用法,LOW是电平宏定义(值为0),舵机需要传入0-180之间的整数角度值,比如开盖状态用sg90.write(0);。
  • 添加串口初始化:因为你用到了Serial.print(distance);,必须在setup()里加Serial.begin(9600);,否则串口监视器无法显示距离数据。

完整修正代码

#include <Servo.h> // 舵机库

int echo = 7;
int trig = 6;
Servo sg90; // 创建Servo对象,替代原int变量
int distance;
int duration;

void setup() {
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  sg90.attach(8); // 将舵机对象绑定到引脚8
  Serial.begin(9600); // 初始化串口用于输出数据
}

void loop() { 
  digitalWrite(trig, LOW);
  delay(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  duration = pulseIn(echo, HIGH);
  distance = duration / 58.2;

  if(distance < 30){
    sg90.write(0); // 舵机转到0度(开盖)
    delay(4500);
    Serial.println(distance); // 换行输出距离,方便查看
  }
  else {
    sg90.write(180); // 舵机转到180度(关盖)
    delay(50);
  }
}

额外说明

  • 如果你的舵机开盖/关盖角度不是0和180,可以根据实际硬件调整write()中的数值。
  • 当前代码用pulseIn()读取超声波数据会短暂阻塞程序,对于新手入门项目完全够用,后续优化可考虑非阻塞读取方式。

内容的提问来源于stack exchange,提问作者cheggouri mehdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:52:13