Ошибка при совместной работе irsend и Serial.print

wwserg
Offline
Зарегистрирован: 08.03.2014

Добрый день!

Сделал контроллер для считывания температуры (внутри помещения и снаружи), наличия 220 В., управления одним реле, управления устройстовом-резерватором и управления кондиционером на базе arduino nano.

Ардуина отлично справляется с опросом датчиков. Исправно посылает данные. Всё в норме. Исправно принимает через тот же com-порт данные для управления реле и резерватором. Отлично проходят команды на включение кондиционера при включении контроллера.

Но как только в конце скетча я добавляю протоколы для изменения температуры кондиционера по получению команды от com-порта, полностью нарушается посылка данных от датчиков в com-порт. Начинает идти какой-то мусор. Причём если я добавляю сколько угодно условий для протокла включения, всё в порядке. Если добавляю хоть одно условия для изменения температуры - com-порт отказывается посылать нормальные данные. Проверил протоколы для температуры - каждый в отделбности хорошо управляют кондиционером.

Как могут быть завязаны  irsend и Serial.print?

Заранее спасибо...



#include <OneWire.h>
#include <DallasTemperature.h>

#include <IRremote.h>
IRsend irsend;

#define ONE_WIRE_BUS 2 

OneWire ourWire(ONE_WIRE_BUS);

DallasTemperature sensors(&ourWire);

int P;  //переменная для индикации наличия 220 В.
int T;  //переменная для индикации температуры внутри помещения
unsigned long tm, next_flick;
unsigned int t_flick = 10000; //период опроса датчиков
char val=0; //переменная для COM порта

//температуры кондиционера
//19 градусов
unsigned int IRon[275] = {3180, 1520, 400, 1140, 420, 1140, 400, 360, 380, 380, 420, 360, 380, 1160, 400, 380, 360, 380, 380, 1140, 420, 1140, 420, 400, 380, 1120, 400, 360, 400, 360, 400, 1140, 400, 1160, 420, 360, 380, 1160, 400, 1140, 420, 340, 400, 400, 360, 1140, 400, 360, 400, 400, 380, 1160, 400, 360, 400, 340, 420, 360, 400, 380, 400, 1120, 400, 360, 400, 360, 420, 360, 400, 360, 380, 380, 420, 340, 400, 400, 360, 380, 400, 360, 380, 380, 380, 360, 400, 360, 440, 340, 420, 340, 400, 360, 420, 360, 380, 1140, 420, 360, 420, 1120, 400, 360, 400, 360, 420, 360, 380, 1140, 400, 1160, 420, 380, 360, 360, 400, 1140, 420, 1160, 400, 1120, 400, 380, 420, 1120, 400, 1160, 380, 400, 400, 340, 400, 360, 400, 360, 420, 1120, 400, 380, 400, 380, 400, 340, 400, 360, 400, 360, 420, 340, 400, 360, 400, 400, 380, 360, 380, 380, 400, 360, 420, 340, 400, 400, 360, 360, 420, 340, 400, 400, 360, 380, 400, 360, 380, 380, 400, 360, 420, 340, 400, 1140, 400, 1140, 440, 1120, 400, 1140, 400, 1160, 400, 1140, 440, 380, 360, 1140, 400, 360, 400, 1140, 420, 1140, 400, 1160, 380, 360, 400, 380, 400, 1140, 400, 1140, 420, 360, 400, 340, 400, 380, 420, 1140, 380, 360, 400, 360, 400, 1140, 400, 1160, 420, 1140, 400, 1140, 400, 360, 440, 1120, 400, 1160, 400, 1120, 420, 1140, 400, 1140, 400, 1160, 400, 1140, 420, 1140, 400, 1140, 420, 1120, 400, 1160, 420, 1120, 400, 1160, 440, 1100, 420, 1140, 420, 1120, 420, 1140, 420, 1120, 420, 1140, 400, 1140, 400, 1140, 420};

//23 градуса
unsigned int IR23[275] = {3160, 1520, 420, 1120, 440, 1140, 400, 340, 400, 360, 420, 360, 400, 1140, 400, 400, 360, 400, 380, 1120, 400, 1160, 420, 380, 400, 1120, 400, 380, 380, 360, 380, 1160, 400, 1140, 440, 380, 360, 1160, 380, 1140, 420, 360, 400, 360, 400, 1140, 400, 360, 400, 360, 420, 1140, 400, 400, 360, 400, 380, 360, 400, 360, 380, 1160, 400, 360, 400, 380, 400, 360, 400, 380, 360, 360, 420, 360, 400, 360, 400, 380, 400, 340, 400, 400, 360, 360, 400, 360, 420, 360, 400, 340, 400, 380, 400, 400, 360, 1140, 400, 360, 420, 1140, 400, 400, 360, 380, 400, 340, 400, 1140, 400, 1160, 420, 1140, 380, 400, 380, 1140, 420, 1120, 420, 1140, 420, 340, 400, 1160, 400, 1140, 380, 380, 420, 380, 380, 340, 400, 360, 420, 1140, 400, 360, 400, 340, 440, 380, 360, 360, 400, 360, 420, 340, 400, 380, 380, 360, 420, 360, 420, 340, 400, 340, 440, 340, 400, 360, 400, 360, 420, 360, 380, 380, 380, 360, 420, 360, 380, 380, 400, 340, 440, 340, 400, 1140, 400, 1160, 420, 1120, 400, 1160, 400, 1120, 420, 1160, 400, 360, 380, 1160, 420, 360, 380, 1140, 400, 1160, 420, 1120, 400, 360, 440, 380, 360, 360, 380, 1160, 420, 360, 400, 340, 400, 400, 400, 1120, 400, 360, 400, 360, 400, 1140, 400, 1160, 420, 1140, 400, 1140, 400, 400, 380, 1140, 400, 1140, 400, 1140, 420, 1140, 400, 1140, 400, 1160, 400, 1140, 420, 1120, 400, 1160, 380, 1160, 400, 1160, 420, 1120, 400, 1140, 440, 1120, 400, 1160, 400, 1140, 420, 1140, 400, 1140, 420, 1140, 400, 1140, 400, 1140, 420};
//22 градуса
unsigned int IR22[275] = {3200, 1500, 420, 1120, 440, 1120, 420, 340, 400, 360, 440, 320, 420, 1140, 420, 340, 420, 340, 420, 1120, 420, 1120, 460, 320, 420, 1120, 420, 340, 420, 340, 420, 1120, 420, 1140, 440, 340, 420, 1120, 420, 1120, 440, 320, 440, 340, 400, 1140, 420, 360, 400, 340, 440, 1120, 420, 340, 420, 360, 400, 340, 400, 360, 420, 1120, 420, 340, 420, 340, 440, 340, 420, 340, 420, 340, 440, 340, 400, 340, 420, 340, 460, 340, 400, 340, 420, 340, 400, 360, 440, 320, 420, 340, 420, 340, 440, 340, 400, 1120, 440, 340, 440, 1100, 420, 360, 420, 320, 440, 340, 420, 380, 380, 1100, 460, 1120, 400, 360, 400, 1120, 460, 1120, 420, 1120, 420, 340, 440, 1120, 420, 1100, 440, 340, 440, 360, 400, 360, 380, 340, 460, 1100, 420, 340, 420, 340, 440, 320, 400, 400, 380, 360, 420, 320, 420, 360, 420, 340, 440, 320, 420, 340, 420, 340, 440, 320, 420, 340, 420, 340, 440, 340, 400, 360, 420, 340, 440, 320, 420, 340, 420, 340, 440, 320, 420, 1140, 420, 1120, 440, 1100, 420, 1140, 400, 1140, 420, 1120, 460, 320, 420, 1120, 400, 360, 420, 1120, 440, 1120, 440, 1120, 420, 1120, 420, 340, 400, 360, 420, 1120, 460, 320, 420, 340, 420, 340, 440, 1120, 420, 320, 420, 360, 400, 1140, 400, 1140, 440, 1140, 380, 1140, 420, 360, 420, 1140, 380, 1140, 400, 1160, 400, 1160, 420, 1120, 380, 1160, 400, 1160, 400, 1140, 400, 1140, 400, 1140, 420, 1140, 420, 1140, 380, 1160, 420, 1140, 380, 1160, 400, 1140, 420, 1140, 400, 1140, 420, 1140, 400, 1140, 400, 1140, 420};


void setup() {
  
  //Включаем кондиционер
  //19 град. при включении контроллера
  irsend.sendRaw(IRon, 275, 38);
   delay (1000);
   K=1;
 
 // Настраиваем выходы GPI для резерватора
  pinMode(4, OUTPUT); //основной канал А
  pinMode(5, OUTPUT); //авто
  pinMode(6, OUTPUT); //резервный канал В
  
  pinMode(10, OUTPUT); //реле на 10 пине

  sensors.begin();
 
 Serial.begin(9600);
}

void loop()
{ 
  tm = millis();    //таймер для датчиков
  if(tm > next_flick){        
        next_flick = tm + t_flick;
            sensors.requestTemperatures(); // Команда для получения температуры
            int T=sensors.getTempCByIndex(1); //получение температуры внутри
                                
             int P = analogRead(0); // считываем данные оптопары, 
                          //подключенной к 0 аналоговому  пину
               // Наличчие 220 v. P=247 (239 min)
               // Отсутствие 220 v. P=1023 (1023 min)
  
                      
       Serial.print(sensors.getTempCByIndex(1),1); //отправляем данные
                                      //с датчика внутри с одним знаком после запятой
       Serial.print(" ");
       Serial.print(sensors.getTempCByIndex(0),1); //отправляем данные
                                      //с датчика снаружи с одним знаком после запятой
       Serial.print(" ");  
       Serial.println(P); //отправляем данные о наличии 220 v
  }  
 
  if (Serial.available() > 0){
  val = Serial.read();//Если в com-порте есть данные, то записываем их в val   
  }
 
 // Управление реле 
 if (val=='1') {
  digitalWrite(10,LOW);  //реле включено
 } 
  if (val=='0') {
  digitalWrite(10,HIGH);  //реле выключено
  }
  
 //Управление резерватором 
  if (val=='2') {
  //Включение канала А резерватора
  digitalWrite (4,HIGH);
  digitalWrite (5,LOW);
  digitalWrite (6,LOW);
  }

    if (val=='4') {
  //Включение канала В резерватора
  digitalWrite (4,LOW);
  digitalWrite (5,LOW);
  digitalWrite (6,HIGH);
  }
 delay (100); //задеркжа для режимов резерватора

 
//КОМАНДЫ НА КОНДИЦИОНЕР (ИДУТ С ОШИБКОЙ COM порта)
   if (val=='6') {
   irsend.sendRaw(IRon, 275, 38);
   delay (1000);
}

   if (val=='7') {
   irsend.sendRaw(IR23, 275, 38);
   delay (1000);
}

   if (val=='8') {
   irsend.sendRaw(IR22, 275, 38);
   delay (1000);
}

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

Что говорит IDE при компиляции скетча насчёт памяти? У Вас при этих посылках используются здоровенные массивы, которые сжирают более 3/4 всей памяти данных. Возможно, Вам просто памяти не хватает.

Попробовал скомпилировать у себя для Nano. После того, как удалил строку 35 из-за которой ни хрена не компилировалось, получил такой результат:

Глобальные переменные используют 2103 байт (102%) динамической памяти, оставляя -55 байт для локальных переменных. Максимум: 2048 байт.

Вас тут ничего не смущает?

wwserg
Offline
Зарегистрирован: 08.03.2014

Спасибо! 35 строка осталась после сокращения кода для публикации, не увидел... Я подозревал, что скорее всего не хватает памяти. Смущало, что сколько раз я бы не посылал переменную IRon, всё работает нормально. Но как только я вместо этого пробую послать другую IR..., хоть один раз - начинаются ошибки в Com-порте.

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

Ну, просто пока Вы не пользуетесь теми двумя массивами - из компилятор (или линкер) выбрасывает и памяти хватает.

wwserg
Offline
Зарегистрирован: 08.03.2014

Понятно. Спасибо за помощь!

b707
Offline
Зарегистрирован: 26.05.2017

wwserg пишет:

Смущало, что сколько раз я бы не посылал переменную IRon, всё работает нормально. Но как только я вместо этого пробую послать другую IR..., хоть один раз - начинаются ошибки в Com-порте.

Пока вы хотя бы раз не обратитесь к массивам IR22 или IR23 в основной программе - они не занимают места в оперативке, компилятор их просто выкидывает из кода как неиспользуемые.

wwserg
Offline
Зарегистрирован: 08.03.2014

Да. Всё понял. Спасибо.

sadman41
Offline
Зарегистрирован: 19.10.2016

wwserg пишет:

Да. Всё понял. Спасибо.

Use PROGMEM, Luke.

wwserg
Offline
Зарегистрирован: 08.03.2014

Спасибо, попробую :-)

wwserg
Offline
Зарегистрирован: 08.03.2014

PROGMEM - в помощь!  Спасибо за ответы. Проблема с помощью PROGMEM решена полностью.