Официальный сайт компании Arduino по адресу arduino.cc
Помогите выявить глюк и по возможности упразднить код
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Подскажите, пожалуйста, что делаю не так?
Задачи:
1. Включение вентилятора Pin8 при событии от датчика дыма или событии от датчика температры A0
2. Включение освещения при детекции движения Pin3 в темное время суток А1
3. Вывод на экран погодного состояния
Оборудование:
1. Arduino NANO V 3.0 CH340G
2. Инфракрасный датчик движения HC-SR501 Pin3
3. Экран 0.96 128X64 OLED LCD I2C
4. Фоторезистор MLG5516B (датчик освещенности) A1
5. Реле электромеханическое ДО 250V 10 А. 1- канал 5V 2 шт Pin7,8
6. Датчик температуры DS18B20 1 метр. (Герметичный) Pin2
7. Цифровой датчик температуры и влажности I2C (Trema—модуль)
8. RTC модуль реального времени на базе DS3231 i2C
9. i2C Hub
10. Модуль питания 5 В, 600 мА для Arduino
11. Датчик температуры TMP36GT9Z Аналоговый A0
12. Датчик газа MQ5 A2
13. Датчик газа MQ2 A3
14. Барометр на LPS331 i2C
Питание:
Модуль питания 5 В, 600 мА для Arduino
VCC – VIN (ARDUINO)
GND – GND (ARDUINO)
Датчики и реле запитаны от пинов VCC и GND Модуля питания
Что происходит:
При работе от usb порта компьютера, вроде, поведение адекватное, в порт пишутся реалистичные значения.
При отключении usb порта компьютера все реле в положении «включено», значение датчиков на экране приблизительно верное, но на события реле не реагируют, оставляя включенным абсолютно все.
Просто питание через usb равнозначно по поведению через блок питания.
//Подключаем все нужные библиотеки #include <Wire.h> #include <OneWire.h> #include <iarduino_AM2320.h> #include <OLED_I2C.h> #include <DallasTemperature.h> #include "Sodaq_DS3231.h" #include <TroykaMQ.h> #include <TroykaIMU.h> //Настройки говна //Дисплей OLED myOLED(SDA, SCL, 8); extern uint8_t RusFont[]; // Русский шрифт extern uint8_t MegaNumbers[]; // Подключение больших шрифтов extern uint8_t SmallFont[]; // Базовый шрифт без поддержки русскийх символов. //Часы //char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; char weekDay[][4] = {"Ce,", "Djc", "Gjy", "Dn", "Ch", "xn", "Gn" }; //Датчики //Температура (улица) #define ONE_WIRE_BUS 2 // номер пина к которому подключен DS18B20 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); #define PIN_MQ2 A3 #define PIN_MQ5 A2 MQ2 mq2(PIN_MQ2); MQ5 mq5(PIN_MQ5); Barometer barometer; //Влажность и температура в помещении iarduino_AM2320 sensor; //Движение const int movPin = 3; void setup() { //Задаем пины ввода-вывода // pinMode(13, OUTPUT); //Пин системы pinMode (8, OUTPUT); pinMode (7, OUTPUT); pinMode (6, INPUT); pinMode (5, INPUT); pinMode (3, INPUT); pinMode(movPin, INPUT); //Запуск устройств Wire.begin(); delay(500); sensor.begin(); sensors.begin(); Serial.begin(9600); digitalWrite(8, HIGH); digitalWrite(7, HIGH); //delay(10000); mq2.calibrate(); mq5.calibrate(); tone(4, 1700, 400); myOLED.begin(); rtc.begin(); } //БЛОК ЧАСОВ void RTC(){ DateTime now = rtc.now(); //get the current date-time myOLED.clrScr(); // очищаем экран myOLED.setFont(RusFont); // Устанавливаем русский шрифт myOLED.print((weekDay[now.dayOfWeek()]), CENTER, 0); // Отображение дня недели myOLED.setFont(MegaNumbers); myOLED.print(String(now.hour(), DEC), 4, 12); // Отображение часов myOLED.print("/", 51, 12); // Отображение двоеточия myOLED.print(String(now.minute(), DEC), 75, 12); // Отображение минут myOLED.setFont(SmallFont); myOLED.print(String(now.date()), 35, 57); // Отображение даты myOLED.print(String(now.month()),51, 57); // Отображение даты myOLED.print(String(now.year()), 65, 57); // Отображение даты myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); // Скрытие двоеточия myOLED.print("-", 51, 12); myOLED.update(); delay(500); } //БЛОК ДАТЧИКА ТЕМПЕРАТУРЫ void TDALLS(){ sensors.requestTemperatures(); myOLED.clrScr(); // очищаем экран myOLED.setFont(RusFont); // Устанавливаем русский шрифт myOLED.print("NTVGTHFNEHF YF EKBWT", CENTER, 0); / myOLED.setFont(MegaNumbers); myOLED.print(String(sensors.getTempCByIndex(0) , 1), CENTER, 9); myOLED.update(); delay(100); } //БЛОК ТЕМПЕРАТУРЫ И ВЛАЖНОСТИ void HDC(){ sensor.read(); float pressure = barometer.readPressureMillibars(); myOLED.clrScr(); // очищаем экран myOLED.setFont(RusFont); // Устанавливаем русский шрифт myOLED.print("NTVGTHFNEHF YF RE[YT", CENTER, 0); myOLED.setFont(MegaNumbers); myOLED.print(String(sensor.tem, 1), CENTER, 9); myOLED.update(); delay(1000); myOLED.clrScr(); // очищаем экран myOLED.setFont(RusFont); // Устанавливаем русский шрифт myOLED.print("DKF;YJCNM DJPLE[F", CENTER, 0); myOLED.setFont(MegaNumbers); myOLED.print(String(sensor.hum, 1), CENTER, 9); myOLED.update(); delay(1000); myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("LFDKTYBT ,fh", CENTER, 0); myOLED.setFont(MegaNumbers); myOLED.print(String(pressure, 0), CENTER, 9); myOLED.update(); delay(1000); } void loop() { digitalWrite(7, HIGH); digitalWrite(8, HIGH); //Измеряем температуру датчика вытяжки int VT = analogRead(A0); VT /= 1024.0; float temperatureC = (VT - 0.5) * 100 ; //исходя из 10 мВ на градус со смещением 500 мВ //Освещение + Движение int val = digitalRead(movPin); if (analogRead(A1) < 100) { if (val == 1){ digitalWrite(7, LOW); } else { digitalWrite(7, HIGH); } } else { digitalWrite(7, HIGH); } //ГАЗЫ int gas = mq5.readRatio(); int smoke = mq2.readSmoke(); int gasLPG = (mq2.readLPG()+ mq5.readLPG())/2; int methane = (mq2.readMethane() + mq5.readMethane())/2; myOLED.clrScr(); // очищаем экран myOLED.setFont(RusFont); myOLED.print("Vtnfy", CENTER, 0); myOLED.setFont(MegaNumbers); myOLED.print(String(methane), CENTER, 9); myOLED.update(); delay(1000); myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("Pflsvktyyjcnm", CENTER, 0); myOLED.setFont(MegaNumbers); myOLED.print(String(mq2.readSmoke()), CENTER, 9); myOLED.update(); delay(1000); myOLED.clrScr(); myOLED.setFont(RusFont); myOLED.print("Ghjgfy", CENTER, 0); myOLED.setFont(MegaNumbers); myOLED.print(String(gasLPG), CENTER, 9); myOLED.update(); delay(1000); if (gasLPG > 800) { tone(4, 900, 200); delay(500); tone(4, 900, 200); delay(500); tone(4, 900, 200); delay(500); tone(4, 900, 200); delay(500); } else {} //ВКЛЮЧЕНИЕ ВЫТЯЖКИ if (smoke > 800 || temperatureC > 40) { digitalWrite(8, LOW); } else { digitalWrite(8, HIGH); } // Serial.println(analogRead(A0)); // Serial.println(analogRead(A1)); // Serial.println(analogRead(A2)); // Serial.println(analogRead(A3)); RTC(); delay(1000); TDALLS(); delay(1000); HDC(); }
Питание:
Модуль питания 5 В, 600 мА для Arduino
VCC – VIN (ARDUINO)
GND – GND (ARDUINO)
Датчики и реле запитаны от пинов VCC и GND Модуля питания
На пин VIN рекомендуется подавать 7-12В (теоретически 6-20В).
Подключите внешний блок питания к пину +5V Ардуино. (VCC – +5V (ARDUINO)).
Нет, не сгорит.
Спасибо, попробовал, не помогло :-(
Тогда хорошо бы блок питания помощнее попробовать.
MQ5 - потребляемый ток: 150 мА
MQ2 - потребляемый ток: 160 мА
Запитывал ту же схему от 9В 3А, результат аналогичен
kris0007, разница с USB только в питании. Если без USB всё висит, значит БП -говно.
usb порт 500mA и работает... но только при подключении к ПК, а не к питанию через usb
usb порт 500mA и работает...
Ну это как бы по стандарту.
Но те производители, которые соблюдали этот стандарт, огребли массу нареканий от пользователей USB HDD. Т.е. конкурентное преимущество получил тот, кто этот стандарт не соблюдал. Поэтому сейчас в большинстве случаев USB порт обеспечивает ток больше 1 Ампера.
Опять же, для USB 3.0 по стандарту уже не 0.5А, а 0.9А.
В принципе может быть и более замысловатый вариант, -подключение к компу имеет ещё небольшой эффект шумоподавления на земляной шине. Если над платой весит борода из проводов, и о соблюдении правил разводки земли там и речи не идёт -то вот в таком случае возможен вышеописанный эффект.
Зеля опоясывает плату на макетке
В коде ошибок нет? Я как бы нуб..(
Кода без ошибок не бывает.
))) подскажите, какие?
А смысл? Их от этого меньше не станет. Есть же закон Буркса: "Всякая, найдённая в программе, последняя ошибка, на самом деле является предпоследней".
Смысл в названии темы.
Неправда :) Название темы бессмысленно. По крайней мере в части выражения "упразднить код".
Пясню: сейчас 83% RAM, как сделать меньше?
1. Весьма заметный эффект даст отказ от использования float.
2. Ощутим будет эффект от сокращения количества шфиртов
Нет, там реально много чего можно сделать.
Только вот к выражению "упразднить код" это не имеет отношения. "Упразднить" означает выбросить совсем.
))) а вместо float что? А шрифты нужны... Или есть способ обойти?
Если нужны то оставь, у тебя же 83 а не больше 100, или ты на оставшееся место будешь фильмы скачивать?
Хочу дум прогонять)
Шрифты нужны, конечно, но не в таком же количестве.
Неправда :) Название темы бессмысленно. По крайней мере в части выражения "упразднить код".
Почему бессмысленно? Придёт Клапауций и упразднит код, оставит только setup(){} и loop(){} :)
Почему бессмысленно? Придёт Клапауций и упразднит код, оставит только setup(){} и loop(){} :)
Тсс. Не вспоминай о нем в суе.
Неправда :) Название темы бессмысленно. По крайней мере в части выражения "упразднить код".
Отнюдь.
Как раз для этой части есть совершенно конкретный способ: Ctrl+A, Del.
kris0007, если Вы хотите уменьшить объем используемой памяти, первое, что Вам нужно сделать, это понять, в каких местах программы и сколько конкретно Вы ее используете.
usb порт 500mA и работает... но только при подключении к ПК, а не к питанию через usb
В какого цвета порт USB подключаете? (Чёрный, синий, жёлтый, красный)
Чёрный.
Обычный, до 2.0 - тогда проблема в блоке питания выходит
и памяти оставляете маловато, у меня на таких показателях (другой проект), зависало
Подкинул модулёк TINY RTC с запаянным DS18B20 дата, время, выходит на температуру и похоже подвисает
А на реле защита от выбросов стоит?