Помогите выявить глюк и по возможности упразднить код

kris0007
Offline
Зарегистрирован: 28.08.2016

Подскажите, пожалуйста, что делаю не так?

Задачи:

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();

}

 

Araris
Offline
Зарегистрирован: 09.11.2012

kris0007 пишет:

Питание:

 Модуль питания 5 В, 600 мА для Arduino
VCC – VIN (ARDUINO)
GND – GND (ARDUINO)
Датчики и реле запитаны от пинов VCC и GND Модуля питания

На пин VIN рекомендуется подавать 7-12В (теоретически 6-20В).

Подключите внешний блок питания к пину +5V Ардуино. (VCC – +5V (ARDUINO)).

Нет, не сгорит.

kris0007
Offline
Зарегистрирован: 28.08.2016

Спасибо, попробовал, не помогло :-(

Araris
Offline
Зарегистрирован: 09.11.2012

Тогда хорошо бы блок питания помощнее попробовать.

MQ5 - потребляемый ток: 150 мА

MQ2 - потребляемый ток: 160 мА

kris0007
Offline
Зарегистрирован: 28.08.2016

Запитывал ту же схему от 9В 3А, результат аналогичен

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kris0007, разница с USB только в питании. Если без USB всё висит, значит БП -говно.

kris0007
Offline
Зарегистрирован: 28.08.2016

usb порт 500mA и работает... но только при подключении к ПК, а не к питанию через usb

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kris0007 пишет:

usb порт 500mA и работает...

Ну это как бы по стандарту.

Но те производители, которые соблюдали этот стандарт, огребли массу нареканий от пользователей USB HDD. Т.е. конкурентное преимущество получил тот, кто этот стандарт не соблюдал. Поэтому сейчас в большинстве случаев USB порт обеспечивает ток больше 1 Ампера.

Опять же, для USB 3.0 по стандарту уже не 0.5А, а 0.9А.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

В принципе может быть и более замысловатый вариант, -подключение к компу имеет ещё небольшой эффект шумоподавления на земляной шине. Если над платой весит борода из проводов, и о соблюдении правил разводки земли там и речи не идёт -то вот в таком случае возможен вышеописанный эффект.

kris0007
Offline
Зарегистрирован: 28.08.2016

Зеля опоясывает плату на макетке

kris0007
Offline
Зарегистрирован: 28.08.2016

В коде ошибок нет? Я как бы нуб..(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Кода без ошибок не бывает.

kris0007
Offline
Зарегистрирован: 28.08.2016

))) подскажите, какие?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kris0007 пишет:
))) подскажите, какие?

А смысл? Их от этого меньше не станет. Есть же закон Буркса: "Всякая, найдённая в программе, последняя ошибка, на самом деле является предпоследней".

kris0007
Offline
Зарегистрирован: 28.08.2016

Смысл в названии темы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kris0007 пишет:
Смысл в названии темы.

Неправда :) Название темы бессмысленно. По крайней мере в части выражения "упразднить код".

kris0007
Offline
Зарегистрирован: 28.08.2016

Пясню: сейчас 83% RAM, как сделать меньше?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kris0007 пишет:
Пясню: сейчас 83% RAM, как сделать меньше?
Ну, там много чего нужно делать.

1. Весьма заметный эффект даст отказ от использования float.

2. Ощутим будет эффект от сокращения количества шфиртов

Нет, там реально много чего можно сделать.

Только вот к выражению "упразднить код" это не имеет отношения. "Упразднить" означает выбросить совсем.

kris0007
Offline
Зарегистрирован: 28.08.2016

))) а вместо float что? А шрифты нужны... Или есть способ обойти?

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Если нужны то оставь, у тебя же 83 а не больше 100, или ты на оставшееся место будешь фильмы скачивать?

kris0007
Offline
Зарегистрирован: 28.08.2016

Хочу дум прогонять)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kris0007 пишет:
))) а вместо float что? А шрифты нужны... Или есть способ обойти?
Вместо float использовать int.

Шрифты нужны, конечно, но не в таком же количестве.

arduino328
Offline
Зарегистрирован: 01.09.2016

ЕвгенийП пишет:

kris0007 пишет:
Смысл в названии темы.

Неправда :) Название темы бессмысленно. По крайней мере в части выражения "упразднить код".

Почему бессмысленно? Придёт Клапауций и упразднит код, оставит только setup(){} и loop(){} :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

arduino328 пишет:

Почему бессмысленно? Придёт Клапауций и упразднит код, оставит только setup(){} и loop(){} :)

Тсс. Не вспоминай о нем в суе.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

kris0007 пишет:
Смысл в названии темы.

Неправда :) Название темы бессмысленно. По крайней мере в части выражения "упразднить код".

Отнюдь.

Как раз для этой части есть совершенно конкретный способ: Ctrl+A, Del.

 

kris0007,  если Вы хотите уменьшить объем используемой памяти, первое, что Вам нужно сделать, это понять, в каких местах программы и сколько конкретно Вы ее используете.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

kris0007 пишет:

usb порт 500mA и работает... но только при подключении к ПК, а не к питанию через usb

В какого цвета порт USB подключаете? (Чёрный, синий, жёлтый, красный)

kris0007
Offline
Зарегистрирован: 28.08.2016

Чёрный.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

kris0007 пишет:
Чёрный.

Обычный, до 2.0 - тогда проблема в блоке питания выходит

и памяти оставляете маловато, у меня на таких показателях (другой проект), зависало

Подкинул модулёк TINY RTC с запаянным DS18B20 дата, время, выходит на температуру и похоже подвисает

GarryC
Offline
Зарегистрирован: 08.08.2016

А на реле защита от выбросов стоит?