Что-то не так в моем скетче?
Я работал над проектом, для которого нужны два датчика (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);
}
@Hamdanie Impa, 👍1
Обсуждение1 ответ
Лучший ответ:
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.
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Объяснение кода MPU6050
- Изменение адреса I2C MPU-6050
- Снять гравитацию с акселерометра MPU-6050
- Скорость передачи данных акселерометра mpu6050 в Arduino Uno и частота дискретизации mpu6050
- Как соединить L293D и MPU6050 для совместной работы?
Шина 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