Ошибка при совместной работе irsend и Serial.print
- Войдите на сайт для отправки комментариев
Добрый день!
Сделал контроллер для считывания температуры (внутри помещения и снаружи), наличия 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);
}
}
Что говорит IDE при компиляции скетча насчёт памяти? У Вас при этих посылках используются здоровенные массивы, которые сжирают более 3/4 всей памяти данных. Возможно, Вам просто памяти не хватает.
Попробовал скомпилировать у себя для Nano. После того, как удалил строку 35 из-за которой ни хрена не компилировалось, получил такой результат:
Вас тут ничего не смущает?
Спасибо! 35 строка осталась после сокращения кода для публикации, не увидел... Я подозревал, что скорее всего не хватает памяти. Смущало, что сколько раз я бы не посылал переменную IRon, всё работает нормально. Но как только я вместо этого пробую послать другую IR..., хоть один раз - начинаются ошибки в Com-порте.
Ну, просто пока Вы не пользуетесь теми двумя массивами - из компилятор (или линкер) выбрасывает и памяти хватает.
Понятно. Спасибо за помощь!
Смущало, что сколько раз я бы не посылал переменную IRon, всё работает нормально. Но как только я вместо этого пробую послать другую IR..., хоть один раз - начинаются ошибки в Com-порте.
Пока вы хотя бы раз не обратитесь к массивам IR22 или IR23 в основной программе - они не занимают места в оперативке, компилятор их просто выкидывает из кода как неиспользуемые.
Да. Всё понял. Спасибо.
Да. Всё понял. Спасибо.
Use PROGMEM, Luke.
Спасибо, попробую :-)
PROGMEM - в помощь! Спасибо за ответы. Проблема с помощью PROGMEM решена полностью.