Добрый день! Как и многие на этом форуме, я являюсь новичком. Пытаюсь освоить 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); }
Фух.... вроде разобрался... Заработало с другой библиотекой. И проблемы все ушли. Спойлер: Скетч (библиотека dht): #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); } Если есть замечания / предложения, с удовольствием выслушаю. Буду разбираться с другими датчиками. Возможно, еще обращусь за помощью / критикой
Возникла еще одна проблема. Соорудил бутерброд - 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); } Спойлер: Фото Фото 1 Фото 2 Фото 3 Фото 4
Методом научного тыка соединил ардуино и gprs без тройки. К gprs приконнектил дисплей по той же схеме. Дисплей работает, gprs - не хочет. А именно, не проходит gprs.init() в setup. Нужна помощь!!!