Расширитель GPIO-портов

Тема в разделе "Arduino & Shields", создана пользователем Iulia, 25 июл 2018.

  1. Iulia

    Iulia Нерд

    Добрый день! Совершенно дурацкий вопрос, а вот ведь... Использую в проекте расширитель GPIO-портов (тройка), не могу сообразить, как задать пин на расширителе, к которому подключается датчик пульса? Он у меня 6. Думала так: iarduino_SensorPulse Pulse(adio.(6)); Но нет...
    Код (C++):
    #include <Wire.h>
    #include <GpioExpander.h>
    #include <iarduino_SensorPulse.h>
    #include <BaseMQ.h>
    #include <MQ9.h>
    #include <TroykaMQ.h>
    #include <SPI.h>
    #include <SD.h>
    #include <TroykaDHT.h>
    GpioExpander adio(42);
    DHT dht(4, DHT11);
     
        #define CS 8
        #define PIN_MQ9         A0
        #define PIN_MQ9_HEATER  13
        MQ9 mq9(PIN_MQ9, PIN_MQ9_HEATER);
        #define SOUND_PIN  A4
        #define SENSITIVITY_NOISE 200
        iarduino_SensorPulse Pulse(ВОТ КАК ЗДЕСЬ НАПИСАТЬ??);
       
       
        void setup() {
          Serial.begin(9600);
          dht.begin();
          mq9.cycleHeat();
          Pulse.begin();
          Wire.begin();
          adio.pinMode(8, OUTPUT);
          adio.pinMode(7, INPUT);
          adio.pinMode(6, INPUT);
       
       
          if (!SD.begin(CS)) {
            Serial.println("SD failed!");
            return;
          }
        }
       
        void loop() {
         dht.read();
       switch(dht.getState()) {
          case DHT_ERROR_CHECKSUM:
          Serial.println("Checksum error");
          break;
          case DHT_ERROR_NO_REPLY:
          Serial.println("TH not connected");
          break;
      }
    if (!mq9.isCalibrated() && mq9.atHeatCycleEnd()) {
         mq9.calibrate();
         mq9.cycleHeat();
      }
      if (mq9.isCalibrated() && mq9.atHeatCycleEnd()) {
        delay(100);
        mq9.cycleHeat();
      }
          float temperature = dht.getTemperatureC();
          float humidity = dht.getHumidity();
          int sound = analogRead(SOUND_PIN);
          float carbon = mq9.readCarbonMonoxide();
          float pulse = Pulse.check(ISP_PULSE);
          String data = String(millis() / 1000) + ";" + String(temperature) + ";" + String(humidity) + ";" + String(carbon)+ ";" + String(sound) + ";" + String(pulse);
          if (sound > SENSITIVITY_NOISE ) {
             adio.digitalWrite(8, HIGH);}
          boolean buttonIsUp = adio.digitalRead(7);
           if (!buttonIsUp ) {
             adio.digitalWrite(8, LOW);}  
         
          data.replace(".", ",");
          Serial.println(data);
          File logFile = SD.open("log.csv", FILE_WRITE);
          logFile.println(data);
          logFile.close();
         
          delay(5000);
        }
     
     
  2. Daniil

    Daniil Гуру

    никак, гпио расширитель нужен если вы хотите пином ручками управлять (без сторонних библиотек), поэтому если хотите через гпио-расширитель управлять каким-либо устройством, то описывайте процедуру управления сами, библиотеки не помогут.
    трудность в том, что вы одной процедурой управляете сразу 8-ю пинами.
     
    Iulia нравится это.
  3. Iulia

    Iulia Нерд

    Ох, жаль. Спасибо за ответ.
     
  4. Iulia

    Iulia Нерд

    Ну ладно, пульсометр повешу на родной пин. И все равно расширитель не работает у меня. Светодиод на расширителе должен загораться при превышении заданного уровня шума. Когда отдельно проверяю расширитель и диод - загорается, а в приведенной ниже проге не горит. Ткните носом, пжл.
    Код (C++):
    #include <Wire.h>
    #include <GpioExpander.h>
    #include <iarduino_SensorPulse.h>
    #include <BaseMQ.h>
    #include <MQ9.h>
    #include <TroykaMQ.h>
    #include <SPI.h>
    #include <SD.h>
    #include <TroykaDHT.h>
    GpioExpander adio(42);
    DHT dht(4, DHT11);
     
        #define CS 8
        #define PIN_MQ9         A0
        #define PIN_MQ9_HEATER  13
        MQ9 mq9(PIN_MQ9, PIN_MQ9_HEATER);
        #define SvgbffOUND_PIN  A4
        #define SENSITIVITY_NOISE 200
        #define SPEED   12
        #define SOUND_PIN  A4
         
       
        void setup() {
          Serial.begin(9600);
          dht.begin();
          mq9.cycleHeat();
          Wire.begin();
          adio.pinMode(1, OUTPUT);
          adio.pinMode(2, INPUT);
          pinMode(SPEED, OUTPUT);
       
          if (!SD.begin(CS)) {
            Serial.println("SD failed!");
            return;
          }
        }
       
        void loop() {
          dht.read();
          switch(dht.getState()) {
          case DHT_ERROR_CHECKSUM:
          Serial.println("Checksum error");
          break;
          case DHT_ERROR_NO_REPLY:
          Serial.println("TH not connected");
          break;
      }
    if (!mq9.isCalibrated() && mq9.atHeatCycleEnd()) {
         mq9.calibrate();
         mq9.cycleHeat();
      }
      if (mq9.isCalibrated() && mq9.atHeatCycleEnd()) {
        delay(100);
        mq9.cycleHeat();
      }
          boolean buttonIsUp = adio.digitalRead(7);
          float temperature = dht.getTemperatureC();
          float humidity = dht.getHumidity();
          int sound = analogRead(SOUND_PIN);
          float carbon = mq9.readCarbonMonoxide();
         
          if (sound > SENSITIVITY_NOISE ) {
             adio.digitalWrite(8, HIGH);}
         
           if (!buttonIsUp ) {
             adio.digitalWrite(8, LOW);}
               
           if (temperature > 35) {
               digitalWrite(SPEED, HIGH);
               delay(2000);
          digitalWrite(SPEED, LOW);}
          String data = String(millis() / 1000) + ";" + String(temperature) + ";" + String(humidity) + ";" + String(carbon)+ ";" + String(sound);
          data.replace(".", ",");
          Serial.println(data);
          File logFile = SD.open("log.csv", FILE_WRITE);
          logFile.println(data);
          logFile.close();
         
          if (sound > SENSITIVITY_NOISE ) {
             adio.digitalWrite(8, HIGH);}
       
           if (!buttonIsUp ) {
             adio.digitalWrite(8, LOW);}  
           if (temperature > 30) {
              digitalWrite(SPEED, HIGH);
               delay(5000);
           digitalWrite(SPEED, LOW);}
               
           
          delay(5000);
        }
     
     
  5. Daniil

    Daniil Гуру

    Расскажите подробнее, что вы делате когда проверяете отдельно (схему другую собираете, программу для теста пишете, когда тестируете кто шум мерит?)? Напряжение тестером мерите на выходе расширителя?
     
  6. Iulia

    Iulia Нерд

    Собирала схему, как в примере на амперке, шум никто не мерял))), просто проверяла, работает ли этот расширитель.

    Но Вы меня навели на правильную мысль, отработать эту систему отдельно, что я и сделала. Вывод: не работает :))
    Код (C++):
    #include <Wire.h>
    #include <GpioExpander.h>
    GpioExpander adio(42);
    #define SOUND_PIN  A1
    #define SENSITIVITY_NOISE 200

      void setup() {
          Serial.begin(9600);
          Wire.begin();
          adio.pinMode(8, OUTPUT);
          adio.pinMode(7, INPUT);
        }

      void loop() {    
          boolean buttonIsUp = adio.digitalRead(7);
          int sound = analogRead(SOUND_PIN);
         
            if (sound > SENSITIVITY_NOISE ) {
             adio.digitalWrite(8, HIGH);}
         
            if (!buttonIsUp ) {
             adio.digitalWrite(8, LOW);}

          String data = String(millis() / 1000) + ";" + String(sound);
          Serial.println(data);

             delay(5000);
        }
     
  7. Daniil

    Daniil Гуру

    А как вы мерите шум? От чего? Вы можете подать на А1 подать не шум, а сразу 5 В? Чтобы уж наверняка sound был равен 1024
     
  8. Iulia

    Iulia Нерд

    Шум меряю соответствующим тройка-модулем с микрофоном.

    Вообще я ничего не понимаю уже. :(:mad: Система себя ведет непредсказуемо. То данные не выводятся в монитор порта. Микрофон то работает, то нет. В зависимости от того, куда я его воткну. Так же и двигатель, который должен включаться при превышении температуры. Если собираю на тройка-шилде, двигатель все отрабатывает как надо, а если на макетке - крутится все время... SD карта (для регистрации данных) стабильно работает на тройка-шилде, и никогда не работает с макетки. Я думаю, у меня какой-то конфликт пинов получается, что-то я не туда тыкаю.

    Люди, помогите медицине!!! Система - модель системы жизнеобеспечения для кювеза. На фото - последний вариант. При этом не работает микрофон, не инициализируется SD карта и двигатель включается каждый раз, когда производятся измерения. :eek::eek::eek:

    SD карта:
    CS - 8
    DI - 12
    DO - 11
    SCK - 13

    Датчик температуры и влажности:
    S - 2

    Датчик шума:
    E - F2
    S - A5 (не использую)

    Датчик газов (на самом деле нужен датчик кислорода, но пока стоит MQ9):
    S - A0
    E - 7

    Н-мост:
    D - 4
    E - 5
    V2 никуда не подключен, потому что используется батарейка и джампер стоит на Р+

    Расширитель портов:
    D - SDA
    C - SCL

    Питание и земля везде подключены (5 В).

    Программу прилагаю:
    Код (C++):
    #include <Wire.h>
    #include <GpioExpander.h>
    #include <iarduino_SensorPulse.h>
    #include <BaseMQ.h>
    #include <MQ9.h>
    #include <TroykaMQ.h>
    #include <SPI.h>
    #include <SD.h>
    #include <TroykaDHT.h>
    GpioExpander adio(42);
    DHT dht(2, DHT11);
    boolean buttonWasUp = true;
    boolean ledEnabled = false;
     
        #define CS 8
        #define PIN_MQ9         A0
        #define PIN_MQ9_HEATER  7
        MQ9 mq9(PIN_MQ9, PIN_MQ9_HEATER);
        #define SENSITIVITY_NOISE 200
        #define SPEED   4
        #define SOUND_PIN  A2
       
       
       
        void setup() {
          Serial.begin(9600);
          dht.begin();
          mq9.cycleHeat();
          Wire.begin();
          adio.pinMode(1, OUTPUT);
          adio.pinMode(2, INPUT);
          pinMode(SPEED, OUTPUT);
       
          if (!SD.begin(CS)) {
            Serial.println("SD failed!");
            return;
          }
        }
       
        void loop() {
          dht.read();
          switch(dht.getState()) {
          case DHT_ERROR_CHECKSUM:
          Serial.println("Checksum error");
          break;
          case DHT_ERROR_NO_REPLY:
          Serial.println("TH not connected");
          break;
      }
    if (!mq9.isCalibrated() && mq9.atHeatCycleEnd()) {
         mq9.calibrate();
         mq9.cycleHeat();
      }
      if (mq9.isCalibrated() && mq9.atHeatCycleEnd()) {
        delay(100);
        mq9.cycleHeat();
      }
          boolean buttonIsUp = adio.digitalRead(7);
          float temperature = dht.getTemperatureC();
          float humidity = dht.getHumidity();
          int sound = analogRead(SOUND_PIN);
          float carbon = mq9.readCarbonMonoxide();
       
          if (sound > SENSITIVITY_NOISE ) {
             adio.digitalWrite(8, HIGH);}
       
          if (buttonWasUp && !buttonIsUp) {
             delay(10);
             buttonIsUp = adio.digitalRead(7);
              if (!buttonIsUp) {
                 adio.digitalWrite(8, LOW);}
        }
        buttonWasUp = buttonIsUp;
          if (temperature > 32) {
               digitalWrite(SPEED, HIGH);
               delay(2000);
          digitalWrite(SPEED, LOW);}
          String data = String(millis() / 1000) + ";" + String(temperature) + ";" + String(humidity) + ";" + String(carbon)+ ";" + String(sound);
          data.replace(".", ",");
          Serial.println(data);
          File logFile = SD.open("log.csv", FILE_WRITE);
          logFile.println(data);
          logFile.close();
           
           if (!buttonIsUp ) {
             adio.digitalWrite(8, LOW);}  
           if (temperature > 30) {
              digitalWrite(SPEED, HIGH);
               delay(5000);
           digitalWrite(SPEED, LOW);}
             
           
          delay(3000);
        }
     
  9. parovoZZ

    parovoZZ Гуру

    Ну нафиК такую медицину. Я лучше буду не болеть.
     
    Iulia нравится это.
  10. Iulia

    Iulia Нерд

    Ну всегда у нас, чуть что, так медицину нафиг! ))) Написано же: модель, для учебных целей нужно.
     
    Mitrandir нравится это.
  11. Daniil

    Daniil Гуру

    все работает в зависимости от того куда воткнёте.
    Давайте последовательно решать проблемы.
    У вас каждый датчик работает в отдельности?
    Каждый датчик должен быть соединен с конкретным пином ардуины - аналоговые/цифровые.
    Соответственно в программе тоже должен быть пин тот, к которому подключен датчик.
    Каждому датчику нужно питание проверьте, что случайно вы не подали вместо 3.3 В (если такие есть) 5В.