Зачем тогда ведомый?
Ведущим управлять ИК-диодом низяяя?
Или это “разминка для ума”?
Для управления ИК-диодом нужно 32112=1266 байт памяти. То есть три массива по 211 int.
Даже если эти массивы загнать в PROGMEM (что у меня и сделано), то без оперативного массива на 211 int не обойтись. Для оперативного массива нужно 422 байта памяти, а для ARDUINO UNO это много. Пробовал я с одним МК, этот массив с датчиками и переменными занимает 75% памяти. Красное предупреждение о некорректной работе. Уменьшил до 74%, при этом лишился некоторых бонусов. Работало. Но с зависаниями.
Я ТРИ РАЗА ПЕРЕЧИТАЛ
Код, наверно, секретный?
Нет. Вот рабочий код ведомого контроллера, который занимает 51% памяти. А чтобы сделать его ведущим, то сюда надо загнать еще код ведущего со своими переменными, датчики BMP180 и DHT11. И памяти одного МК не хватит.
И еще. Прошу прочитать комментарий в строке 59 и помочь разобраться.
[code]
#include <IRremote.h>
#include <SoftwareSerial.h>
IRsend irsend;
SoftwareSerial port(8, 9);
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] = {8830, 4470, 530, 1720, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 570, 480, 1770, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 530, 570, 530, 1720, 430, 670, 430, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 1770, 480, 1720, 480, 620, 480, 620, 480, 570, 530, 570, 480, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 480, 570, 530, 570, 530, 1720, 480, 620, 480, 570, 530, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 530, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 1770, 480, 620, 480, 620, 480, 620, 430, 670, 430, 670, 430, 620, 480, 620, 480, 620, 430, 670, 480, 620, 480, 1720, 480, 620, 480, 1720, 480, 620, 430, 670, 480, 620, 480, 620, 430, 670, 430, 670, 430, 670, 430, 620, 480, 1770, 430, 670, 430, 670, 430, 1770, 430, 670, 430};
const unsigned int PROGMEM ConHeat[211] = {8830, 4470, 480, 1720, 480, 1720, 480, 620, 530, 570, 480, 620, 480, 620, 480, 1720, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 570, 480, 620, 480, 620, 480, 1720, 530, 1720, 480, 1720, 480, 620, 480, 620, 480, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 570, 530, 570, 480, 670, 430, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 670, 430, 620, 480, 1770, 430, 1770, 430, 670, 430, 670, 430, 620, 480, 620, 480, 620, 430, 670, 480, 620, 430, 670, 430, 670, 430, 620, 480, 1770, 430, 670, 430, 1770, 430, 670, 430, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 670, 430, 1770, 430, 670, 430, 1770, 430, 670, 430, 670, 430};
unsigned int m[211];
int cicl = 0;
unsigned long time2;
bool zagruz;
bool flag;
byte st;
bool tg;
byte exercise;
bool rabota;
String stroka;
char priem;
bool persim;
char sim;
/*
String s8="OfOfOf";
String s9="ColdColdCold";
String s10="HeatHeatHeat";
*/
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
trigger = 0;
time1 = millis() + 250;
time2 = millis() + 1000;
port.begin(9600);
}
void loop()
{
if (port.available() > 0)
{
priem = port.read();
if (!persim)
{
sim = priem;
persim = 1;
}
if (priem == '\n')
{
zagruz = 0;
rabota = 1;
persim = 0;
}
else stroka += priem;
}
if (rabota)
{
// С ведущего МК на восьмой пин (RX) приходят строки-команды ведомому:
// "OfOfOf "ColdColdCold" "HeatHeatHeat"
// Здесь у меня ни фига не получается их сравнить с пришедшей строкой
/*
if ((stroka).equals(String("OfOfOf"))) exercise=8;
if ((stroka).equals(String("ColdColdCold"))) exercise=9;
if ((stroka).equals(String("HeatHeatHeat"))) exercise=10;
*/
// Поэтому приходится танцевать с первым символом пакета.
// Так работает нормально
if (sim == 'O') exercise = 8;
if (sim == 'C') exercise = 9;
if (sim == 'H') exercise = 10;
rabota = 0;
stroka = String("");
priem = '%';
}
if (exercise >= 8)
{
if (!zagruz)
{
if (exercise == 8) for (cicl = 0; cicl <= 210; cicl++) m[cicl] = pgm_read_word(&ConOff[cicl]);
if (exercise == 9) for (cicl = 0; cicl <= 210; cicl++) m[cicl] = pgm_read_word(&ConCold[cicl]);
if (exercise == 10) for (cicl = 0; cicl <= 210; cicl++) m[cicl] = pgm_read_word(&ConHeat[cicl]);
time2 = millis();
st = 0;
flag = 1;
zagruz = 1;
}
exercise = 0;
}
if (flag)
{
if (st <= 3)
{
if (millis() - time2 >= 1000)
{
tg = !tg;
if (tg)
{
irsend.sendRaw(m, 211, 38);
st++;
}
time2 = millis();
}
}
else
{
flag = 0;
zagruz = 0;
}
}
if (millis() - time1 >= 250)
{
time1 = millis();
trigger = !trigger;
digitalWrite(13, trigger);
}
}
[/code]
почему не просто
`if (stroka == "OfOfOf") exercise=8;
А не срабатывает у вас потому, что в строке скорее всего в конце идет символ CR
Я пробовал сделать так:
if (stroka == s8) exercise=8;
(s8 определялось в строке 25)
не срабатывало.
А если есть CR (скорее всего), то он будет раньше /n, так как накапливание символов в строку (строка 55) прекращается в строке 49, /n в строку не входит. И его CR надо как-то игнорировать.
Так правильно?
if ((byte) priem != 13)
{
stroka += priem;
}
вместо того чтоб гадать - взяли бы и посмотрели, что там у вас в строке stroka
и почему оно не равно s8
Благодаря МММ разобрался. В строке был символ CR.
Вот исправленная версия. В строке 64 этот символ игнорируется. И сравнение строк работает корректно.
[code]
#include <IRremote.h>
#include <SoftwareSerial.h>
IRsend irsend;
SoftwareSerial port(8, 9);
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] = {8830, 4470, 530, 1720, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 570, 480, 1770, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 530, 570, 530, 1720, 430, 670, 430, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 1770, 480, 1720, 480, 620, 480, 620, 480, 570, 530, 570, 480, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 480, 570, 530, 570, 530, 1720, 480, 620, 480, 570, 530, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 530, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 1770, 480, 620, 480, 620, 480, 620, 430, 670, 430, 670, 430, 620, 480, 620, 480, 620, 430, 670, 480, 620, 480, 1720, 480, 620, 480, 1720, 480, 620, 430, 670, 480, 620, 480, 620, 430, 670, 430, 670, 430, 670, 430, 620, 480, 1770, 430, 670, 430, 670, 430, 1770, 430, 670, 430};
const unsigned int PROGMEM ConHeat[211] = {8830, 4470, 480, 1720, 480, 1720, 480, 620, 530, 570, 480, 620, 480, 620, 480, 1720, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 570, 480, 620, 480, 620, 480, 1720, 530, 1720, 480, 1720, 480, 620, 480, 620, 480, 570, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 620, 480, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 620, 530, 570, 480, 620, 480, 620, 480, 620, 480, 620, 480, 1720, 480, 620, 480, 620, 480, 570, 530, 570, 480, 670, 430, 620, 480, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 670, 430, 620, 480, 1770, 430, 1770, 430, 670, 430, 670, 430, 620, 480, 620, 480, 620, 430, 670, 480, 620, 430, 670, 430, 670, 430, 620, 480, 1770, 430, 670, 430, 1770, 430, 670, 430, 620, 480, 620, 480, 620, 480, 620, 480, 620, 430, 670, 430, 670, 430, 1770, 430, 670, 430, 1770, 430, 670, 430, 670, 430};
unsigned int m[211];
int cicl = 0;
unsigned long time2;
bool zagruz;
bool flag;
byte st;
bool tg;
byte exercise;
bool rabota;
String stroka;
char priem;
bool persim;
char sim;
String s8 = "OfOfOf";
String s9 = "ColdColdCold";
String s10 = "HeatHeatHeat";
unsigned long period = 500;
int impuls = 500;
int pause = 500;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
trigger = 0;
time1 = millis() + 500;
time2 = millis() + 1000;
port.begin(9600);
}
void loop()
{
if (port.available() > 0)
{
priem = port.read();
if (!persim)
{
sim = priem;
persim = 1;
}
if (priem == '\n')
{
// конец пакета
zagruz = 0;
rabota = 1;
persim = 0;
}
else
{
if ((byte) priem != 13) stroka += priem;
}
}
if (rabota)
{
trigger = !trigger;
digitalWrite(13, trigger);
if (stroka == s8) exercise = 8;
if (stroka == s9) exercise = 9;
if (stroka == s10) exercise = 10;
rabota = 0;
stroka = String("");
priem = '%';
}
if (exercise >= 8)
{
if (!zagruz)
{
if (exercise == 8)
{
for (cicl = 0; cicl <= 210; cicl++) m[cicl] = pgm_read_word(&ConOff[cicl]);
impuls = 250;
pause = 250;
}
if (exercise == 9)
{
for (cicl = 0; cicl <= 210; cicl++) m[cicl] = pgm_read_word(&ConCold[cicl]);
impuls = 250;
pause = 750;
}
if (exercise == 10)
{
for (cicl = 0; cicl <= 210; cicl++) m[cicl] = pgm_read_word(&ConHeat[cicl]);
impuls = 750;
pause = 250;
}
time2 = millis();
st = 0;
flag = 1;
zagruz = 1;
}
exercise = 0;
}
if (flag)
{
if (st <= 3)
{
if (millis() - time2 >= 1000)
{
tg = !tg;
if (tg)
{
irsend.sendRaw(m, 211, 38);
st++;
}
time2 = millis();
}
}
else
{
flag = 0;
zagruz = 0;
}
}
if (millis() - time1 >= period)
{
time1 = millis();
trigger = !trigger;
if (trigger) period = impuls;
else period = pause;
digitalWrite(13, trigger);
}
}
[/code]
Да я и не гадал. Просто посмотрел, что выдает ведущий MK.
а если не одно из условий не выполнится?
и это тоже лишнее
достаточно
stroka = "";
Если нет сбоя оборудования, то stroka должна быть либо пустой, либо принимать одно из этих значений в принципе.
Спасибо.
А если будет?
Самое интересное, что для управления IR-светодиодом не только память нужна, но и миллиампер 100 тока.
Ну это не аттракцион и не какой-либо транспорт. Это всего лишь кондиционер. Но этот вопрос еще полностью не решен.
У меня вот такой набор:
https://aliexpress.ru/item/1005003804455377.html?sku_id=12000027223801982
ИК-диод подключен к МК. У пульта мощность заметно больше, но и этого хватает на 3 метра. Больше не проверял, да больше и не надо.
однако… только научившись букву “а” выговаривать. уже рветесь всем навязывать свое творчество “в образовательных целях.” ?
Вы случаем с @Марат не родственники?
Он тут получил совет и что-то не показывается больше…
Хм… почему-то всплыло в памяти …
pointer arithmetic?
Не, ну это не так элегантно, как та строчка, что я процитировал. Там тонко, а здесь грубо и вульгарно