Односторонняя передача по UART

Зачем тогда ведомый?
Ведущим управлять ИК-диодом низяяя?
Или это “разминка для ума”?

Для управления ИК-диодом нужно 32112=1266 байт памяти. То есть три массива по 211 int.
Даже если эти массивы загнать в PROGMEM (что у меня и сделано), то без оперативного массива на 211 int не обойтись. Для оперативного массива нужно 422 байта памяти, а для ARDUINO UNO это много. Пробовал я с одним МК, этот массив с датчиками и переменными занимает 75% памяти. Красное предупреждение о некорректной работе. Уменьшил до 74%, при этом лишился некоторых бонусов. Работало. Но с зависаниями.

Я ТРИ РАЗА ПЕРЕЧИТАЛ :thinking:

Код, наверно, секретный?

Нет. Вот рабочий код ведомого контроллера, который занимает 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

1 лайк

Я пробовал сделать так:
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 должна быть либо пустой, либо принимать одно из этих значений в принципе.

Спасибо.

А если будет? :wink:

Самое интересное, что для управления IR-светодиодом не только память нужна, но и миллиампер 100 тока.

Ну это не аттракцион и не какой-либо транспорт. Это всего лишь кондиционер. Но этот вопрос еще полностью не решен.

У меня вот такой набор:

https://aliexpress.ru/item/1005003804455377.html?sku_id=12000027223801982

ИК-диод подключен к МК. У пульта мощность заметно больше, но и этого хватает на 3 метра. Больше не проверял, да больше и не надо.

однако… только научившись букву “а” выговаривать. уже рветесь всем навязывать свое творчество “в образовательных целях.” ?

Вы случаем с @Марат не родственники?

Он тут получил совет и что-то не показывается больше…

Хм… почему-то всплыло в памяти …

1 лайк

pointer arithmetic?

Не, ну это не так элегантно, как та строчка, что я процитировал. Там тонко, а здесь грубо и вульгарно :slight_smile: