Arduino - GPRS - Troyka анализатор

Тема в разделе "Arduino & Shields", создана пользователем WhiteBard, 19 авг 2016.

  1. WhiteBard

    WhiteBard Нерд

    Добрый день!
    Как и многие на этом форуме, я являюсь новичком. Пытаюсь освоить Arduino. Начал очередной более-менее "серьезный" проект, связанный с работой с датчиками. Все свои вопросы постараюсь уместить в рамках данной темы. Возможно кому-нибудь найденные с вашей, уважаемые гуру arduino, помощью решения также окажутся полезными.

    Итак, начнем. Первый вопрос возник с датчиком температуры и влажности DHT11 (Troyka-модуль) и lcd-дисплеем. Текущая задача несложная - нужно вывести значения с датчика на дисплей.
    Опираясь на wiki, подключил дисплей через стандартный breadboard. Датчик к Troyk'е, Troyk'у на Arduino Uno.
    В "тестовых заездах" на примере из wiki все прошло хорошо - в мониторе порта данные корректно отображались и изменялись при нагревании / охлаждении датчика. Далее поменял часть кода и перенаправил вывод на дисплей. И вот тут начались проблемы...
    Вначале на дисплее отображались числовые значения, но при взаимодействии с датчиком они обнулялись и "не приходили в сознание" до вкл/выкл arduin'ки. Затем стала возникать ошибка "unknown error" (см. скетч). В результате все попытки исправить ситуацию закончились тем, что на экране теперь горят два нуля. Ошибка уже не возникает, но стали съезжать буквы (заменяться на *, ), # и т.д.) после нескольких секунд работы.
    Пожалуйста, помогите разобраться.
    P.S. Провода проверил, поменял, пересоединил; шлейф на датчике менял; breadboard и дисплей менял.

    // Подключаем стандартную библиотеку LiquidCrystal
    #include <LiquidCrystal.h>
    // библиотека для работы с датчиком DHT11
    #include <TroykaDHT11.h>

    // создаём объект класса DHT11 и передаём номер пина к которому подключён датчик
    DHT11 dht(11);
    // Инициализируем объект-экран, передаём использованные для подключения контакты на Arduino в порядке:
    // RS, E, DB4, DB5, DB6, DB7
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

    #define DHT11PIN 11

    void setup()
    {
    // устанавливаем размер (количество столбцов и строк) экрана
    lcd.begin(16, 2);
    dht.begin();
    }

    void loop()
    {
    // переменная состояния датчика
    int check;
    // мониторинг ошибок
    // считывание данных с датчика DHT11
    lcd.clear();
    switch (check) {
    // всё OK
    case DHT_OK:
    break;
    // ошибка контрольной суммы
    case DHT_ERROR_CHECKSUM:
    lcd.print("Checksum error");
    delay(2000);
    return;
    // превышение времени ожидания
    case DHT_ERROR_TIMEOUT:
    lcd.print("Time out error");
    delay(2000);
    return;
    // неизвестная ошибка
    default:
    lcd.print("Unknown error");
    delay(2000);
    return;
    }
    // выводим показания влажности и температуры
    lcd.print("Temp(C)=");
    lcd.print(dht.getTemperatureC());
    lcd.setCursor(0, 1);
    lcd.print("Humidity=");
    lcd.print(dht.getHumidity());
    lcd.print("%");
    // ждём 5 секунд
    delay(5000);
    }

     
  2. WhiteBard

    WhiteBard Нерд

    Фух.... вроде разобрался...
    Заработало с другой библиотекой. И проблемы все ушли.

    #include <dht.h>
    #include <LiquidCrystal.h>

    // Инициализируем объект-экран, передаём использованные
    // для подключения контакты на Arduino в порядке:
    // RS, E, DB5, DB6, DB7, DB8
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    DHT sensor = DHT();

    void setup()
    {
    lcd.begin(16, 2);
    sensor.attach(A0);
    lcd.print("OK");
    delay(1000);
    }

    void loop()
    {
    sensor.update();
    lcd.clear();
    switch (sensor.getLastError())
    {
    case DHT_ERROR_OK:
    char msg[128];
    // данные измерений можно считать соответствующими методами
    lcd.setCursor(0, 0);
    lcd.print("Temp(C) = ");
    lcd.print(sensor.getTemperatureInt());
    lcd.setCursor(0, 1);
    lcd.print("Humidity = ");
    lcd.print(sensor.getHumidityInt());
    lcd.print(" %");
    break;
    }
    delay(5000);
    }

    Если есть замечания / предложения, с удовольствием выслушаю.
    Буду разбираться с другими датчиками. Возможно, еще обращусь за помощью / критикой ;)
     
    Tomasina нравится это.
  3. WhiteBard

    WhiteBard Нерд

    Возникла еще одна проблема.
    Соорудил бутерброд - Arduino uno, GPRS Shield, Troyka Shield, на который навешены датчики и прицеплен lcd-дисплей.
    Задача - получать данные с датчиков, выводить их на монитор и в определенных ситуациях отправлять sms.
    Проблема - gprs shield работает либо с дисплеем, но без датчиков, либо при отсутствии дисплея и наличии всего трех датчиков (на A0, A3, A4). При этом информация на дисплее не отображается.
    При попытке подключить что-либо на другие пины, gprs shield отваливается. Есть подозрение, что не все пины свободны...

    Монитор подключен по wiki-статье (4,5,10,11,12,13, 5V, GND).
    Датчики - температуры и влажности, газовые MQ2 и MQ7. Прочее - два светодиода "Пиранья", зуммер.
    Без gprs shield все работало - диоды горели, информация на дисплее была.

    Плиз, помогите разобраться и дособирать сию конструкцию.

    #include <dht.h>
    #include <LiquidCrystal.h>
    #include <TroykaMQ.h>
    #include <GPRS_Shield_Arduino.h>
    #include <SoftwareSerial.h>

    #define LED_1 9
    #define LED_2 8
    #define PIN_MQ2 A3
    #define PIN_MQ7 A4
    #define BUZZER_PIN 7
    #define PHONE_NUMBER "+79147463137"
    #define MESSAGE "System activated"

    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    DHT sensor = DHT();
    MQ2 mq2(PIN_MQ2);
    MQ7 mq7(PIN_MQ7);
    GPRS gprs;

    void setup()
    {
    pinMode(LED_1, OUTPUT);
    pinMode(LED_2, OUTPUT);
    lcd.begin(16, 2);
    sensor.attach(A0);
    mq2.calibrate();
    mq7.calibrate();
    lcd.print("OK");
    digitalWrite(LED_1, HIGH);
    delay(1000);

    gprs.powerUpDown();
    while (!gprs.init()) {
    delay(1000);
    }
    gprs.sendSMS(PHONE_NUMBER, MESSAGE);
    }

    void loop()
    {
    int val, frequency;
    // ДАТЧИК ТЕМПЕРАТУРЫ И ВЛАЖНОСТИ
    sensor.update();
    lcd.clear();
    switch (sensor.getLastError())
    {
    case DHT_ERROR_OK:
    lcd.setCursor(0, 0);
    lcd.print("Temp(C) = ");
    lcd.print(sensor.getTemperatureInt());
    lcd.setCursor(0, 1);
    lcd.print("Humidity = ");
    lcd.print(sensor.getHumidityInt());
    lcd.print(" %");
    break;
    default:
    lcd.setCursor(14, 1);
    lcd.print("Er");
    break;
    }
    delay(5000);
    lcd.clear();
    lcd.setCursor(0,0);


    // ДАТЧИК ШИРОКОГО СПЕКТРА ГАЗОВ MQ2

    // выводим значения газов в ppm
    lcd.print("LPG: ");
    lcd.print(mq2.readLPG());
    lcd.setCursor(0, 1);
    lcd.print("Methane: ");
    lcd.print(mq2.readMethane());
    delay(5000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Smoke: ");
    lcd.print(mq2.readSmoke());
    lcd.setCursor(0, 1);
    lcd.print("Hydrogen: ");
    lcd.print(mq2.readHydrogen());
    delay(5000);

    // ДАТЧИК УГАРНОГО ГАЗА MQ7
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("CarbonMonoxide: ");
    lcd.setCursor(0,1);
    lcd.print(mq7.readCarbonMonoxide());



    // СВЕТОДИОДЫ И ЗУММЕР

    val = 500;
    frequency = map(val, 0, 1023, 3500, 4500);

    // зажигаем светодиод: зеленый - ОК, красный - DANGER
    if (sensor.getTemperatureInt() > 32) {
    digitalWrite(LED_1, LOW);
    digitalWrite(LED_2, HIGH);
    tone(BUZZER_PIN, frequency, 4000);
    } else {
    digitalWrite(LED_1, HIGH);
    digitalWrite(LED_2, LOW);
    }
    delay(5000);
    }

     
  4. WhiteBard

    WhiteBard Нерд

    Методом научного тыка соединил ардуино и gprs без тройки. К gprs приконнектил дисплей по той же схеме.
    Дисплей работает, gprs - не хочет. А именно, не проходит gprs.init() в setup.
    Нужна помощь!!!