Arduino Uno. Танцы выходов

Проект состоит из двух МК Arduino Uno. Второй МК управляется первым. А первый управляется через USB порт. При открытии USB первый МК перезагружается. И до работы скетча на выходах МК на какое-то время время появляются паразитные сигналы, которые отрицательно влияют на второй МК. Как заглушить эти сигналы на время переходных процессов? Спасибо!

Ничего не понятно. Как управляется второй МК? Что значит паразитные сигналы? Как они отрицательно влияют? Давайте расписывайте подробно

Обьедини пины ресет

А чего тут расписывать. Первый МК должен подать логический сигнал второму МК только тогда, когда я этого хочу, а не во время перезагрузки.

Стало чуточку лучше.

добрый день! можно с вами как-то связаться насчет ваших старых часов?

Сделайте задержку delay в начале setup управляемой программы.
МК прошить HEXом, без загрузчика

Сделай внешнюю подтяжку пинам с помощью резисторов.
К «+» или к GND - это уже тебе виднее, схемы не видели.

1 лайк

Действительно, что тут расписывать? ХЗ какой логический сигнал должен быть подан ХЗ как. Тут и ответ будет такой же - а ХЗ что делать :wink:

@BOOM про подтяжку уже упомянул, других вариантов при ХЗ какой схеме и скетчах в голову и не приходит

В конце readme.md есть адрес электронки

Спасибо! Столько советов! Появилась надежда решить проблему.
Начну с ответа rkit. До его совета было 100% ошибок. То есть при перезагрузке первого (ведущего) MK, срабатывал второй. Объединил пины Reset. Из 50 проб 37 нормальных. Кроме того, на входы второго (ведомого) МК поставил защиту от дребезга (подсмотрел в FLProg). Как бы ошибки исчезли. Из 100 проб 0 ошибок. Но уверенности нет, что проблема решилась.
Дим-мычъ. delay попробую, а вот как прошить HEXом - не знаю. Я занимаюсь Arduino всего два месяца, я больше по программированию, хотя и в электронике кое чего смыслю. Но попробую поискать прошивку HEXом. Для меня HEX - это какой-то 16-ти ричный дамп, не более.
BOOM. Подтяжку попробую к GND, при старте мне нужен ноль.

Насчет ХЗ.
Для начала я напишу над чем я работаю, а затем выложу скетч ведомого контроллера.
Залита программа управления сплит-системой издалека ИК-диодом. Программа понимает такие команды:
USB->UART
Принудительно включить кондиционер на охлаждение 16 градусов.
Принудительно выключить.
Управлять включением-выключением автоматически (датчик BMP180). По умолчанию >=24 градуса включить, <= 21 - выключить. Кондиционер всегда включается на 16 градусов.
Принять новые настройки диапазона температур и режима выключить, включить или автомат.
UART->USB
Передать по запросу на телефон данные о температуре, давлении и влажности (DHT11) и состояние настроек.

Управляющая программа работает на первом МК. Она формирует команды второму МК, который управляет ИК-диодом.

Сценарий такой.
Со смартфона через интернет посылается магический пакет на включение компьютера.
Компьютер загружается. На компьютере запускается служба, которая отслеживает команды со смартфона.
С телефона подается команда связать USB компа с первым МК. И вот в этот момент и происходит фальшивое срабатывание ИК-диода: кондиционер включается. Даже если и скетч первого МК пустой.
МК перезагружается, устанавливаются настройки по умолчанию 21-24 градуса и включается автоматический режим.
Если меня эти настройки не устраивают, то посылаю свои настройки и контролирую их.
Подается сигнал на выключение компьютера. МК продолжают работать с кондиционером.
Это меня пока устраивает.
Если комп не отреагировал на выключение (пропал интернет), то на нем есть еще одна служба, которая выключит его принудительно через пять минут после включения.

Это скетч второго, ведомого МК

#include <IRremote.h>
bool K_Off;
bool K_Cold;
bool K_Heat;
bool d13;
IRsend irsend;
bool trigger;
long int time1;
const unsigned int PROGMEM ConOff[211]={8900,4400,550,1650,550,1650,550,500,550,500,550,550,550,550,550,1650,550,1650,550,1650,550,1650,550,1650,550,550,550,550,550,500,550,1650,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,500,550,500,550,1650,550,500,550,550,550,500,550,500,550,500,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,550,1650,550,550,550,1700,500,1700,550,550,500};
const unsigned int PROGMEM ConCold[211]={8900,4400,550,1650,550,1650,550,500,550,500,550,550,550,550,550,1650,550,1650,550,1650,550,1650,550,1650,550,550,550,550,550,500,550,1650,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,550,550,550,550,550,550,550,550,500,550,500,550,500,550,550,550,550,550,500,550,500,600,500,600,500,600,500,600,1600,600,500,600,500,550,500,600,500,600,500,600,450,600,500,600,500,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,1700,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,1700,550,550,500,1700,550,600,500,600,500,600,500,600,500,600,450,1750,500,1700,500,1700,500,1700,500,600,500,600,500,600,500,1750,500};
unsigned int m[211];
int cicl;
void setup()
{
    pinMode(8,INPUT);
    pinMode(9,INPUT);
    pinMode(10,INPUT);
    pinMode(13,OUTPUT);
    digitalWrite(13,0);
    trigger=0;
    time1=millis()+500;
}
void loop()
{
	K_Off= (digitalRead (8));
	K_Cold= (digitalRead (9));
	K_Heat= (digitalRead (10));
	if (millis()>=time1)
	{
		time1=millis()+500;
        	trigger=!trigger;
        	d13=trigger;
		digitalWrite(13,d13);
	}
	if (K_Off)
      {
      	for (cicl=0; cicl<=210; cicl++) m[cicl]=pgm_read_word(&ConOffcicl]);
      	irsend.sendRaw(m,211,38);
            	
	}
      if (K_Cold)
      {
      	for (cicl=0; cicl<=210; cicl++) m[cicl]=pgm_read_word(&ConCold[cicl]);
            irsend.sendRaw(m,211,38);
      }
}

Хотел написать нудную лекцию о том, что на КМОП логике активным уровнем следует ВСЕГДА проектировать низкий… но передумал :wink:

ТС! Тебе нужно сделать сигнал CS, чип енейбл. Сделать на нем активным низкий уровень и подтянуть к питанию. В программе поменять условия исполнения так:
вместо

if (K_Cold)

написать

if (K_Cold && !CS)

В ведущем контроллере CS опускать после полной загрузки и инициализации - в конце setup().

А вот “пустой” скетч ведущего МК. Как бы не должно быть срабатываний, а они есть.


#include <Wire.h>
#include <SFE_BMP180.h>
#include "DHT_NEW.h"
SFE_BMP180  _bmp085;
long _bmp085P = 0;
int _bmp085T = 0;
long _bmp085A = 0;
double BMP085_ALTITUDE;
double BMP085_SeaPressure;
DHT _dht1;
String whod;
int temperat;
unsigned long davlenie;
float vlagnost;
bool split_off;
bool split_cold;
bool split_heat;
bool d13;
bool send;
String stroka;
bool resetuart;
String mints="23";
String maxts="24";
String irlast="0";
String indicator;
bool sigsig;
bool trigger;
bool w0;
bool w1;
bool flag;
bool to_uart;
bool from_uart;
bool run_impuls;
int st;
int nomer;
float maxtf;
float mintf;
float hhh1;
float gradus;
float hhh3;
unsigned long time1;
unsigned long time2;
unsigned long cls_uart;
String tout;
String pout;
String vlaga;
bool fix_max;
bool fix_min;
bool old_max;
bool old_min;
bool prinud_on;
bool prinud_off;
bool auto_on;
bool auto_off;
bool automat;
bool signal_on;
bool signal_off;
unsigned long ttm1;
bool trg1;
int _PWDC = 0;
bool _gtv1 = 0;
int _gtv3;
unsigned long _dht1LRT = 0UL;
unsigned long _dht1Tti = 0UL;
unsigned long _bmp0851Tti = 0UL;
String _RVFU1Data;
bool _RVFU1Reset = 1;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
byte _tempVariable_byte;

// Когда привязвается порт, то в этом месте до void setup() присходит ХЗ что
// на девятом пине появляется единица с какого-то перепоя, она идет на вход K_Cold
// второго МК и кондиционер включается
// обратите внимание, что void loop() ПУСТОЙ


void setup()
{
    pinMode(13,OUTPUT);
    digitalWrite(13,0);
    pinMode(8,OUTPUT);
    digitalWrite(8,0);
    pinMode(9,OUTPUT);
    digitalWrite(9,0);
    automat=1;
    sigsig=1;
    mintf=(mints.toFloat());
    maxtf=(maxts.toFloat());
    nomer=0;
    trigger=1;
    time1=millis();
    time2=time1+1000;
    ttm1=time1+250;
    w0=1;
    w1=0;
    d13=0;
    flag=0;
    st=0;
}
void loop()
{
}

Спасибо, но непонятно. Получается, что это условие выполнится когда на K_Cold высокий уровень, а на CS - низкий (знать бы, где еще взять этот CS). Но на CS и так низкий уровень [quote=“WladDrakula, post:15, topic:14011”]
Сделать на нем активным низкий уровень
[/quote]

Не смог найти, по этому и пишу на первой попавшийся ветке, у вас там ссылки с Яндекс диска к сожалению удалены, нет доступа к библиотекам из
кода

А что ЛС разве не работают? Или там с определённого кол-ва сообщений?

А на форуме есть ЛС? Не нашёл, искал у профиле, ЛС или же эл.почту/другое другие контракты

Не?
image