Добрый день! Совершенно дурацкий вопрос, а вот ведь... Использую в проекте расширитель 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); }
никак, гпио расширитель нужен если вы хотите пином ручками управлять (без сторонних библиотек), поэтому если хотите через гпио-расширитель управлять каким-либо устройством, то описывайте процедуру управления сами, библиотеки не помогут. трудность в том, что вы одной процедурой управляете сразу 8-ю пинами.
Ну ладно, пульсометр повешу на родной пин. И все равно расширитель не работает у меня. Светодиод на расширителе должен загораться при превышении заданного уровня шума. Когда отдельно проверяю расширитель и диод - загорается, а в приведенной ниже проге не горит. Ткните носом, пжл. Код (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); }
Расскажите подробнее, что вы делате когда проверяете отдельно (схему другую собираете, программу для теста пишете, когда тестируете кто шум мерит?)? Напряжение тестером мерите на выходе расширителя?
Собирала схему, как в примере на амперке, шум никто не мерял))), просто проверяла, работает ли этот расширитель. Но Вы меня навели на правильную мысль, отработать эту систему отдельно, что я и сделала. Вывод: не работает ) Код (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); }
А как вы мерите шум? От чего? Вы можете подать на А1 подать не шум, а сразу 5 В? Чтобы уж наверняка sound был равен 1024
Шум меряю соответствующим тройка-модулем с микрофоном. Вообще я ничего не понимаю уже. Система себя ведет непредсказуемо. То данные не выводятся в монитор порта. Микрофон то работает, то нет. В зависимости от того, куда я его воткну. Так же и двигатель, который должен включаться при превышении температуры. Если собираю на тройка-шилде, двигатель все отрабатывает как надо, а если на макетке - крутится все время... SD карта (для регистрации данных) стабильно работает на тройка-шилде, и никогда не работает с макетки. Я думаю, у меня какой-то конфликт пинов получается, что-то я не туда тыкаю. Люди, помогите медицине!!! Система - модель системы жизнеобеспечения для кювеза. На фото - последний вариант. При этом не работает микрофон, не инициализируется SD карта и двигатель включается каждый раз, когда производятся измерения. 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); }
все работает в зависимости от того куда воткнёте. Давайте последовательно решать проблемы. У вас каждый датчик работает в отдельности? Каждый датчик должен быть соединен с конкретным пином ардуины - аналоговые/цифровые. Соответственно в программе тоже должен быть пин тот, к которому подключен датчик. Каждому датчику нужно питание проверьте, что случайно вы не подали вместо 3.3 В (если такие есть) 5В.