Что-то не так в моем скетче?

Я работал над проектом, для которого нужны два датчика (mq2 и mpu6050), каждый из скетчей я взял из Интернета, и мне удалось поработать с mq2, но с mpu6050 я до сих пор не уверен, работает ли он. Дело в том, что я хочу, чтобы два датчика работали сами по себе, но в одном скетче. Когда mq2 обнаруживает наличие газа, я хочу, чтобы светодиод и ЗУММЕР включились, и единственный способ выключить их — перезагрузить Arduino. Для MPU6050 то же самое и с mq2, при срабатывании MP6050 я хочу, чтобы загорелся другой светодиод и тот же зуммер, опять же единственный способ его выключить - это перезагрузить ардуино. Я хочу объединить эти два скетча в один. Но когда я это объединил, схема не заработала. Может ли кто-нибудь мне помочь?

Вот код, который я изменил и объединил:

#include <Wire.h>
#include <MPU6050.h>

#define minval -5
#define maxval 3

MPU6050 mpu;
/////////////////////////////////////////////////// ////////////////

//для mq2

int redLed = 12;
int greenLed = 11;
int buzzer = 10;
int smokeA0 = A5;
// Ваше пороговое значение
int sensorThres = 100;

/////////////////////////////////////////////////// //////// ////////

void setup(){
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(smokeA0, INPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  mpu.setThreshold(3); 
}

/////////////////////////////////////////////////// ////////////////

void loop(){
  // для mq2

  int analogSensor = analogRead(smokeA0);

  // Проверяем, достигло ли порогового значения
  if (analogSensor > sensorThres)
  {
    digitalWrite(redLed, HIGH);
    digitalWrite(greenLed, LOW);
    tone(buzzer, 1000);
  }
  else{
  digitalWrite(greenLed, HIGH);
  }
  // для MPU6050

  Vector rawGyro = mpu.readRawGyro();
  Vector normGyro = mpu.readNormalizeGyro();
  if (normGyro.XAxis > maxval ||
      normGyro.XAxis < minval &&
      normGyro.YAxis > maxval ||
      normGyro.YAxis  < minval &&
      normGyro.ZAxis > maxval || 
      normGyro.ZAxis  < minval)
  {
    digitalWrite(7,HIGH);
    digitalWrite(8,HIGH);
  }
  else
  {
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
  }

}

Вот код mq2:

int redLed = 12;
int greenLed = 11;
int buzzer = 10;
int smokeA0 = A5;
// Ваше пороговое значение
int sensorThres = 150;

void setup() {
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(smokeA0, INPUT);
}

void loop() {
  int analogSensor = analogRead(smokeA0);

  // Проверяем, достигло ли порогового значения
  if (analogSensor > sensorThres)
  {
    digitalWrite(redLed, HIGH);
    digitalWrite(greenLed, LOW);
    tone(buzzer, 1000);
  }
  else{
  digitalWrite(greenLed, HIGH);
  delay(100);
  }
}

Вот код MPU6050 (я удалил несколько строк, когда помещал их в объединенный скетч, потому что мне не нужен код ЖК-дисплея, не знаю, правильно ли я сделал):

#include <Wire.h>
#include <MPU6050.h>

#define minval -5
#define maxval 3

MPU6050 mpu;


void setup()
{       
  Serial.begin(115200);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);

  delay (2000);

  // Инициализируем MPU6050
  Serial.println("Initialize MPU6050");

  while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
  { 
    Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
    delay(500);
  }

  mpu.setThreshold(3); 
  // Проверка настроек
  checkSettings();
}



void checkSettings()
{
  Serial.println();
  Serial.print(" * Sleep Mode:        ");
  Serial.println(mpu.getSleepEnabled() ? "Enabled" : "Disabled");
  Serial.print(" * Clock Source:      ");
  switch(mpu.getClockSource())
  {
    case MPU6050_CLOCK_KEEP_RESET:
      Serial.println("Stops the clock and keeps the timing generator in reset"); 
      break;
    case MPU6050_CLOCK_EXTERNAL_19MHZ:
      Serial.println("PLL with external 19.2MHz reference"); 
      break;
    case MPU6050_CLOCK_EXTERNAL_32KHZ:
      Serial.println("PLL with external 32.768kHz reference");
      break;
    case MPU6050_CLOCK_PLL_ZGYRO:
      Serial.println("PLL with Z axis gyroscope reference");
      break;
    case MPU6050_CLOCK_PLL_YGYRO:
      Serial.println("PLL with Y axis gyroscope reference");
      break;
    case MPU6050_CLOCK_PLL_XGYRO:
      Serial.println("PLL with X axis gyroscope reference");
      break;
    case MPU6050_CLOCK_INTERNAL_8MHZ:
      Serial.println("Internal 8MHz oscillator"); 
      break;
  }

  Serial.print(" * Gyroscope:         ");
  switch(mpu.getScale())
  {
    case MPU6050_SCALE_2000DPS:
      Serial.println("2000 dps");
      break;
    case MPU6050_SCALE_1000DPS:
      Serial.println("1000 dps");
      break;
    case MPU6050_SCALE_500DPS:
       Serial.println("500 dps");
       break;
    case MPU6050_SCALE_250DPS:
       Serial.println("250 dps");
       break;
  }

  Serial.print(" * Gyroscope offsets: ");
  Serial.print(mpu.getGyroOffsetX());
  Serial.print(" / ");
  Serial.print(mpu.getGyroOffsetY());
  Serial.print(" / ");
  Serial.println(mpu.getGyroOffsetZ());
  Serial.println();
}

void loop()
{
  Vector rawGyro = mpu.readRawGyro();
  Vector normGyro = mpu.readNormalizeGyro();
  Serial.print(" Xraw = ");
  Serial.print(rawGyro.XAxis);
  Serial.print(" Yraw = ");
  Serial.print(rawGyro.YAxis);
  Serial.print(" Zraw = ");
  Serial.println(rawGyro.ZAxis); 

  if (normGyro.XAxis > maxval ||
      normGyro.XAxis < minval &&
      normGyro.YAxis > maxval ||
      normGyro.YAxis  < minval &&
      normGyro.ZAxis > maxval || 
      normGyro.ZAxis  < minval)
  {
    digitalWrite(7,HIGH);
    digitalWrite(8,HIGH);
    delay(300);
    digitalWrite(7,HIGH);
    digitalWrite(8,HIGH);
    delay(300);
    delay (1000);
  }
  else
  {
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
  }
  Serial.print(" Xnorm = ");
  Serial.print(normGyro.XAxis);
  Serial.print(" Ynorm = ");
  Serial.print(normGyro.YAxis);
  Serial.print(" Znorm = ");
  Serial.println(normGyro.ZAxis);
  delay(10);
}

, 👍1

Обсуждение

Шина i2c использует a4 и a5 для sda и scl. Вы по-прежнему можете использовать значения от a0 до a3 для датчика mq2. Если повезет, пока ничего не сломалось, но имейте в виду, что mpu6050 — это датчик на 3,3 В., @Jot

только вы можете решить, работает ли ваш скетч..... если он делает что-то, чего вы не хотите, то он не работает.... "не работает" - это бессмысленное описание программы поведение... если вам нужна реальная помощь, вам следует точно описать, что делает программа и что вы от нее хотите, @jsotola

ок, отредактирую свой пост, @Hamdanie Impa

@jsotola, ты можешь мне помочь?, @Hamdanie Impa

@HamdanieImpa, ты понял мой ответ? Вы также можете прочитать об используемых номерах контактов на этой странице: https://www.arduino.cc/en/Reference/Wire, @Jot

ваше описание желаемого поведения теперь очень хорошее... ваше описание наблюдаемых результатов все еще расплывчато.... вы имеете в виду, что не звучит звуковой сигнал и не загораются светодиоды? .... какая-то часть работает?, @jsotola

прочитайте первый комментарий @Jot ..... затем посмотрите на эту командную строку int SmokeA0 = A5; ..... в этом конфликт, @jsotola

@Jot, сформулируйте свой первый комментарий как ответ.... ОП должен иметь ардуино 3,3В, потому что датчик работает с отдельным скетчем, @jsotola


1 ответ


Лучший ответ:

0

Arduino Uno имеет специальные функции на фиксированных контактах.
Например, шина I2C использует контакты A4 и A5.

На справочной странице Arduino Wire представлена таблица номеров контактов плат Arduino.

>

Пыльцы «SDA» и «SCL» рядом с разъемом USB подключены к контактам «A4» и «A5» (для Arduino Uno).
Это означает, что если вы используете шину I2C, вы не можете использовать контакты «A4» и «A5» для чего-либо еще.

Подключите датчик газа MQ2 к контакту A0, A1, A2 или A3, и он должен работать.

MPU-6050 — старый датчик, есть более новые и лучшие датчики с меньшим шумом.
MPU-6050 представляет собой датчик с напряжением 3,3 В, это означает, что его питание должно составлять 3,3 В, а шина I2C должна иметь уровни 3,3 В.
Arduino Uno имеет микроконтроллер, работающий от напряжения 5 В, поэтому у него есть шина I2C с уровнями 5 В.
Сдвигатель уровня I2C можно использовать для подключения Arduino Uno к MPU-6050. Вы также можете использовать подтягивающие резисторы 4k7 от SDA до 3,3 В и от SCL до 3,3 В. Эти подтягивающие резисторы часто уже имеются в модуле MPU-6050.

MPU-6050 будет работать (в течение некоторого времени) с шиной I2C с уровнем напряжения 5 В. Он может даже работать, когда MPU-6050 подается напряжением 5 В непосредственно на чип. Это повлияет на данные, и датчик может быть поврежден. Новые сенсорные чипы с напряжением 3,3 В часто быстрее повреждаются при напряжении 5 В, но не испытывайте удачу с MPU-6050.

,