sgslrw 发表于 2024-3-21 00:42:01

有没有会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 00:42:02

本帖最后由 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-21 01:37:30

本帖最后由 woyiwu 于 2024-3-22 01:30 编辑

虽然但是,直接粘上来没有缩进的代码真的就是一坨……能不能改改缩进……
我以我一点浅薄的c++知识猜测一下,你这里的recordButtonClicks函数的第二个和第三个if会不会有点冲突,因为你要判断两次按按钮的间隔时长,但是你电位如果改变后会先改变lastDebounceTime2,会不会导致这里时间间隔永远小于debounceDelay2……
不会arduino,如果说错了求放过 @sgslrw

没药 发表于 2024-3-21 05:40:26

吓鼠了,我只有小学学历一个字都看不懂惹

白氿 发表于 2024-3-21 10:07:24

这种情况一般建议去淘宝寻找帮助,猫猫只能给出一些精神上的祝福,来自生物猫

kele123123 发表于 2024-3-21 15:21:48

感觉AI可以处理这个问题

王刘洋默默 发表于 2024-3-21 17:55:27

大二的我看不懂一点(虽然是个学代码的,但就会个py和java)

passnow 发表于 2024-3-21 18:15:04

额,不懂哎。我是进来围观的群众

ifrappuccin81 发表于 2024-3-21 20:31:47

是外企C佬,不懂、告辞。

silencedonkey 发表于 2024-3-22 12:33:57

我觉得代码问题gpt解决的都还不错,反正我用了好久

书の妖怪 发表于 2024-3-22 18:55:21

悬赏问题已解决,即将关闭帖子
页: [1]
查看完整版本: 有没有会arduino的大神帮忙看看我们的代码出了什么问题?