我正在使用esp8266制作一个简单的自制物联网解决方案,使用用于Web服务器路由的库构建。这些lib函数不喜欢使用带参数的函数,所以我的解决方案是使用lambdas并捕获我需要的变量。当使用pinPower setter方法更新存储引脚功率的int(1或0,是的,我知道bool会更好)时,问题是尝试对来自两个不同lambdas的对象的同一个实例进行操作时一个lambda不会出现在另一个中。
我认为这与lambda按值捕获变量有关,它创建了我的类的新实例;我已经尝试捕获outputPinArray [i]作为参考,但这只是意味着getter函数无法获得正确的值,因此无法切换值(类在内部使用getter)。使用静态变量和getter函数有效,但我希望能够使用该类的多个实例,因此不需要像这样的共享变量。我已经看到各种帖子似乎指向使用extern关键字捕获但我没有找到很多文档在lambdas中使用它并且无法弄清楚如何正确使用它。
这是我正在使用的代码:
for(int i = 0; i < 1; i++) {
server.on(path, HTTP_POST, [outputPinArray , argToCheck, i]() mutable {
// Sets pinNumber variable and turns on or off the arduino pin using outputPinArray[i].setPinPower or .togglePinPower
});
server.on(path, HTTP_GET, [outputPinArray,i](){
// Send integer value using outputPinArray[i].getPinPower()
});
}
outputPin类代码:
int OutputPin::getPinPower(){
return pinPower;
}
void OutputPin::setPinPower(int value){
if(value == HIGH || value == LOW){
pinPower = value;
digitalWrite(getPinNum(), pinPower);
}
感谢任何帮助,谢谢!
答案 0 :(得分:0)
如果我理解你的问题,你需要做的只是
server.on(path, HTTP_POST, [&outputPinArray , argToCheck, i]() {
答案 1 :(得分:0)
我失败了,数组超出了范围,而路由是esp8266webserver对象被全局声明。解决@obamator的帮助