有没有会arduino的大神帮忙看看我们的代码出了什么问题?
本帖最后由 sgslrw 于 2024-3-21 02:47 编辑如题,今年刚开始学着用arduino解决问题,然后就发现编辑完后代码虽然不报错但是跑起来没反应,即使写了相关指令按按钮也不会执行。
我们的目的是制作一个短距离的温度探测器,工作流程是:开机后自动进入倒计时(3秒),在此期间每按压一下按钮(button 2)就会记录一次按压数(click count),倒计时结束后根据按压次数1/2/3分别进入3个预设的模式(3种触发温度40/50/60)
模式选定后自动进入一个循环进行的工作流程。首先探测距离,危险距离外则不报警,并重复此流程;危险距离内发出提示并开始进行温度探测;探测温度低于阈值则不报警并返回距离探测;反之报警并等待一秒,然后重复执行温度探测
这是我们的Predefined flowchart
这是我们的circuit diagram
这是我们的代码:
#include "Wire.h"
#include <Adafruit_Sensor.h>
#include "Adafruit_TMP006.h"
#define TCAADDR 0x70 void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();}
Adafruit_TMP006 sensor1;
uint16_t samples = TMP006_CFG_8SAMPLE;
// I2C address of TMP006, can be 0x40-0x47
const int speaker = A0;
// The CP microcontroller pin for the speaker
const int buttonPin1 = 4;
const int buttonPin2 = 5;
const int devicePin1 = A4;
const int devicePin2 = A5;
int temperature;
int buttonState1 = 0;
int lastButtonState1 = 0;
int buttonState2 = 0;
int lastButtonState2 = 0;
int lastDebounceTime2 = 0;
int debounceDelay2 = 50;
unsigned long countdownStart = 0;
const unsigned long countdownDuration = 3000; // 3 seconds
bool countdownFinished = false;
int clickCount = 0; // standard Arduino setup()
void setup()
{pinMode(buttonPin1, INPUT);
pinMode(devicePin1, OUTPUT);
pinMode(buttonPin2, INPUT);
pinMode(devicePin2, OUTPUT);
pinMode(speaker, OUTPUT);}
void activatePreset1()
{temperature = 40;}
void activatePreset2() {
temperature = 50;
}
void activatePreset3()
{temperature = 60;}
void executePresetProgram()
{switch (clickCount)
{
case 1: activatePreset1(); break;
case 2: activatePreset2(); break;
case 3: activatePreset3(); break;
default: break;}// bottom set up
while (!Serial);
delay(1000);
Wire.begin();
Serial.begin(115200);
Serial.println("\nTCAScanner ready!");
for (uint8_t t=0; t<8; t++) { tcaselect(t);
Serial.print("TCA Port #"); Serial.println(t);
for (uint8_t addr = 0; addr<=127; addr++) {
if (addr == TCAADDR) continue;
Wire.beginTransmission(addr);
if (!Wire.endTransmission()) {
Serial.print("Found I2C 0x");Serial.println(addr,HEX);
}
}
}
Serial.println("\ndone");
Serial.println("TMP006 Example");
sensor1.begin(TMP006_CFG_8SAMPLE);
/* Initialise the 1st sensor */tcaselect(1);if(!sensor1.begin())
{ /* There was a problem detecting the HMC5883 ... check your connections */
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while(1);}} void loop(){ int reading2 = digitalRead(buttonPin2);
if (reading2 != lastButtonState2) { lastButtonState2 = reading2;
if (reading2 == HIGH) { countdownStart = millis();
}
}
if (!countdownFinished && (millis() - countdownStart >= countdownDuration))
{ countdownFinished = true;
executePresetProgram();}
if (!countdownFinished) { recordButtonClicks();
}
}
void recordButtonClicks()
{
int reading2 = digitalRead(buttonPin2);
if (reading2 != lastButtonState2) {
lastDebounceTime2 = millis();}
if ((millis() - lastDebounceTime2) > debounceDelay2)
{
if (reading2 != buttonState2) {
buttonState2 = reading2;
if (buttonState2 == HIGH) {
clickCount++;
tone(speaker, 500, 50);
}
}
}
lastButtonState2 = reading2;//bottomfloat
object_temp = sensor1.readObjTempC();
Serial.print("Object Temperature: ");
Serial.print(object_temp); Serial.println("*C");
if(object_temp>=temperature) {
// if reading the greater than threshold temperature tone(A0, 500, 100);
// output a 1000 Hz sound for a tenth of a second}
delay(2000);
// delay 1 second for every 4 samples per reading}
本帖最后由 lzy415 于 2024-3-21 06:12 编辑
来自Gemini (google.com)
回答分享Arduino温度探测器问题 (google.com)
提问格式为复制原文内容,删去图片展示内容您的代码存在以下几个问题:
[*]缺少库文件: 您使用了 Adafruit_TMP006.h 库,但没有在代码中包含它。请在代码开头添加 #include <Adafruit_TMP006.h>。
[*]重复定义函数: 您在代码中重复定义了 tcaselect() 函数。请删除重复的定义。
[*]未使用的变量: 您定义了 object_temp 变量,但却没有使用它。请将其删除或使用它。
[*]无限循环: 在 loop() 函数中,您使用了 while (!countdownFinished) 来控制循环。但是,countdownFinished 变量在 executePresetProgram() 函数中被设置为 true,但该函数不会立即返回。因此,循环将一直执行下去。请修改代码,确保 countdownFinished 变量在循环结束后被重置为 false。
[*]按钮去抖动: 您使用了简单的去抖动方法,但效果可能不够理想。建议使用更完善的去抖动算法,例如使用 debounce() 函数。
[*]代码风格: 您的代码格式不规范,建议使用缩进和空格来提高代码的可读性。
修复上述问题后,您的代码应该能够正常工作。以下是一些修复后的代码示例:
#include <Adafruit_TMP006.h>
#define TCAADDR 0x70
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
Adafruit_TMP006 sensor1;
uint16_t samples = TMP006_CFG_8SAMPLE;
// I2C address of TMP006, can be 0x40-0x47
const int speaker = A0;
// The CP microcontroller pin for the speaker
const int buttonPin1 = 4;
const int buttonPin2 = 5;
const int devicePin1 = A4;
const int devicePin2 = A5;
int temperature;
int buttonState1 = 0;
int lastButtonState1 = 0;
int buttonState2 = 0;
int lastButtonState2 = 0;
int lastDebounceTime2 = 0;
int debounceDelay2 = 50;
unsigned long countdownStart = 0;
const unsigned long countdownDuration = 3000; // 3 seconds
bool countdownFinished = false;
int clickCount = 0;
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(devicePin1, OUTPUT);
pinMode(buttonPin2, INPUT);
pinMode(devicePin2, OUTPUT);
pinMode(speaker, OUTPUT);
Serial.begin(115200);
while (!Serial);
Wire.begin();
sensor1.begin(TMP006_CFG_8SAMPLE);
tcaselect(1);
if (!sensor1.begin()) {
Serial.println("Ooops, no TMP006 detected ... Check your wiring!");
while (1);
}
}
void loop() {
int reading2 = digitalRead(buttonPin2);
if (reading2 != lastButtonState2) {
lastButtonState2 = reading2;
if (reading2 == HIGH) {
countdownStart = millis();
}
}
if (!countdownFinished && (millis() - countdownStart >= countdownDuration)) {
countdownFinished = true;
executePresetProgram();
}
if (!countdownFinished) {
recordButtonClicks();
}
}
void recordButtonClicks() {
int reading2 = digitalRead(buttonPin2);
if (reading2 != lastButtonState2) {
lastDebounceTime2 = millis();
}
if ((millis() - lastDebounceTime2) > debounceDelay2) {
if (reading2 != buttonState2) {
buttonState2 = reading2;
if (buttonState2 == HIGH) {
clickCount++;
tone(speaker, 500, 50);
}
}
}
lastButtonState2 = reading2;
}
void executePresetProgram() {
switch (clickCount) {
case 1:
activatePreset1();
break;
case 2:
请谨慎使用代码。
本帖最后由 woyiwu 于 2024-3-22 01:30 编辑
虽然但是,直接粘上来没有缩进的代码真的就是一坨……能不能改改缩进……
我以我一点浅薄的c++知识猜测一下,你这里的recordButtonClicks函数的第二个和第三个if会不会有点冲突,因为你要判断两次按按钮的间隔时长,但是你电位如果改变后会先改变lastDebounceTime2,会不会导致这里时间间隔永远小于debounceDelay2……
不会arduino,如果说错了求放过 @sgslrw
吓鼠了,我只有小学学历一个字都看不懂惹 这种情况一般建议去淘宝寻找帮助,猫猫只能给出一些精神上的祝福,来自生物猫 感觉AI可以处理这个问题 大二的我看不懂一点(虽然是个学代码的,但就会个py和java) 额,不懂哎。我是进来围观的群众
是外企C佬,不懂、告辞。 我觉得代码问题gpt解决的都还不错,反正我用了好久 悬赏问题已解决,即将关闭帖子
页:
[1]