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
相关产品推荐
相关产品推荐

