Ошибка при совместной работе 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 решена полностью.