Объединение кода для нескольких датчиков в одной программе (Arduino)

Мне нужно одновременно использовать 2 разных датчика (газ и DHT11). Мне удалось запустить каждый из них по отдельности, и я не знаю, как манипулировать кодом, чтобы они могли работать вместе.

Вот скетчи:

Код датчика газа MQ2:

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

void setup() {
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(smokeA0, INPUT);
  Serial.begin(9600);
}

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

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

Это код DHT11:

#include <SimpleDHT.h>

int pinDHT11 = 7;
SimpleDHT11 dht11(pinDHT11);

void setup() {
    // начать работать...
  Serial.begin(9600); 
  Serial.println("Temperature and Humidity Data");
}

void loop() {

  delay (250);
  // чтение без выборок.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }
  Serial.print((int)temperature); Serial.print(" *C, "); 
  Serial.print((int)humidity); Serial.println(" H");

  // Частота дискретизации DHT11 составляет 1 Гц.
  delay(1500);
}

, 👍0


1 ответ


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

1

Вам необходимо объединить 3 основные области кода: раздел включения/объявления, в который включаются файлы, и объявляются глобальные переменные. Затем объедините функции setup(), а затем объедините функции loop(). В итоге выглядит примерно так, как показано ниже. Однако вам, возможно, придется настроить время задержки

#include <SimpleDHT.h>
int redLed = 12;
int greenLed = 11;
int buzzer = 10;
int smokeA0 = A5;
// пороговое значение
int sensorThres = 400;
int pinDHT11 = 7;
SimpleDHT11 dht11(pinDHT11);

void setup() {
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(smokeA0, INPUT);
  Serial.begin(9600);
  Serial.println("Starting");
}

void loop() {
  int analogSensor = analogRead(smokeA0);
  Serial.print("Concentration: ppm ");
  Serial.println(analogSensor);
  // Проверяем, достиг ли он порогового значения
  if (analogSensor > sensorThres)
  {
    digitalWrite(redLed, HIGH);
    digitalWrite(greenLed, LOW);
    tone(buzzer, 1000, 200);
  }
  else
  {
    digitalWrite(redLed, LOW);
    digitalWrite(greenLed, HIGH);
    noTone(buzzer);
  }
  delay(250);
  // чтение без выборок.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }
  Serial.print((int)temperature); Serial.print(" *C, "); 
  Serial.print((int)humidity); Serial.println(" H");

  // Частота дискретизации DHT11 составляет 1 Гц.
  delay(1500);
}  

Другой способ сделать это, который упрощает чтение, — переместить содержимое каждого основного цикла в отдельную функцию, а затем вызвать две функции из цикла(). Это позволяет вам легко закомментировать одну из функций, чтобы устранить неполадки, или даже позволить вам вызывать одну чаще, чем другую, в зависимости от ваших потребностей (можно посмотреть на пример мигания без задержки, чтобы узнать, как управлять синхронизацией)

#include <SimpleDHT.h>
int redLed = 12;
int greenLed = 11;
int buzzer = 10;
int smokeA0 = A5;
// пороговое значение
int sensorThres = 400;
int pinDHT11 = 7;
SimpleDHT11 dht11(pinDHT11);

    void setup() {
      pinMode(redLed, OUTPUT);
      pinMode(greenLed, OUTPUT);
      pinMode(buzzer, OUTPUT);
      pinMode(smokeA0, INPUT);
      Serial.begin(9600);
      Serial.println("Starting");
    }


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

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


void loop2(){
  delay (250);
  // чтение без выборок.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }
  Serial.print((int)temperature); Serial.print(" *C, "); 
  Serial.print((int)humidity); Serial.println(" H");

  // Частота дискретизации DHT11 составляет 1 Гц.
  delay(1500);
}


void loop() {
  loop1();
  loop2();
}  
,