ESP32 Wroom VSPI与MAX6675通信配置及编译错误排查求助
问题解决:ESP32与MAX6675硬件SPI通信编译错误
错误原因
编译报错的核心是变量作用域问题:你在setup()函数内部定义的MAX6675 sonde(slaveSelectPin)是局部变量,仅在setup()范围内有效,loop()函数无法访问该变量,因此编译器提示'sonde' was not declared in this scope。
修复步骤
1. 修改spi_dan.ino代码,调整变量作用域
将sonde的声明移到全局作用域,让loop()可以正常访问:
/* Name: spi_dan.ino Created: 02/02/2024 20:11:18 Author: Daniel */ #include <Arduino.h> #include <SPI.h> #include "MAX6675.h" // Définit la broche comme sélection d'esclave : const int slaveSelectPin = 5; float x; MAX6675 sonde(slaveSelectPin); // 全局声明实例 void setup() { Serial.begin(115200); // 移除setup内的局部实例声明 } void loop() { x = sonde.readTempC(); Serial.println(x); delay(1000); }
2. 补充MAX6675类的实现文件(MAX6675.cpp)
你的头文件仅声明了类结构,但未实现构造函数和成员方法,后续编译会出现未定义引用错误。需在项目目录下创建MAX6675.cpp文件并添加以下代码:
#include "MAX6675.h" #include <SPI.h> MAX6675::MAX6675(int16_t SSPin) { _SSPin = SSPin; pinMode(_SSPin, OUTPUT); digitalWrite(_SSPin, HIGH); _lastCallTime = 0; _currentTemp = 0.0; } float MAX6675::readTempC() { // 遵循MAX6675的转换周期要求 if (millis() - _lastCallTime < MAX6675_READ_PERIOD) { return _currentTemp; } _lastCallTime = millis(); digitalWrite(_SSPin, LOW); SPI.beginTransaction(MAX6675_Settings); _incomingMessage = SPI.transfer16(0x00); SPI.endTransaction(); digitalWrite(_SSPin, HIGH); // 检查热电偶开路状态 if (_incomingMessage & MAX6675_THERMOCOUPLE_OPEN_BIT) { _currentTemp = MAX6675_THERMOCOUPLE_OPEN; } else { // 转换温度值:数据位为13位,乘以0.25℃分辨率 _currentTemp = (_incomingMessage >> 3) * MAX6675_CONVERSION_RATIO; } return _currentTemp; } float MAX6675::readTempF() { // 摄氏度转华氏度 return readTempC() * 9.0 / 5.0 + 32.0; }
3. 验证编译
将MAX6675.h和MAX6675.cpp放在与spi_dan.ino相同的项目目录下,重新编译即可解决所有错误。
内容的提问来源于stack exchange,提问作者Daniel Caron
相关产品推荐
相关产品推荐

