Передача и прием данных

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Здравствуйте! Как можно сделать что бы при передачи данных с трансмиттера, на приемнике делалось некое действие до тех пор пока не придут еще данные, все это в цикле. В моем случае нужно что бы при приеме определенной температуры, эта температура выводилась на дисплей пока не придет другая температура. Пока что температура выводится на дисплей 5 секунд после приема данных. Вроде как объяснил)

Передатчик:

#include <OneWire.h>
#include <iarduino_RF433_Transmitter.h>                   // Подключаем библиотеку для работы с передатчиком FS1000A
iarduino_RF433_Transmitter radio(12);
OneWire ds(2);
#include <avr/power.h>
#include <LowPower.h>          // библиотека сна

int sleep_count = 10;

void setup() {
   clock_prescale_set(clock_div_1);
   analogReference(EXTERNAL);
    radio.begin();                                        // Инициируем работу передатчика FS1000A (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate)
    radio.setDataRate     (i433_1KBPS);                   // Указываем скорость передачи данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек
    radio.openWritingPipe (5);
}

void loop() {
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);      // спать 8 сек. mode POWER_OFF, АЦП выкл
  sleep_count++;            // +1 к счетчику просыпаний
  if (sleep_count >= 1) {  // если время сна превысило 10 минут (75 раз по 8 секунд - подгон = 70)
    byte i;
    byte data[12];
    byte addr[8];
    float celsius;
 
    // поиск адреса датчика
    if ( !ds.search(addr)) {
        ds.reset_search();
        delay(250);
        return;
    }
 
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1); // команда на измерение температуры

    delay(1000);

    ds.reset();
    ds.select(addr); 
    ds.write(0xBE); // команда на начало чтения измеренной температуры

    // считываем показания температуры из внутренней памяти датчика
    for ( i = 0; i < 9; i++) {
        data[i] = ds.read();
    }

    int16_t raw = (data[1] << 8) | data[0];
    // датчик может быть настроен на разную точность, выясняем её 
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс
    else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс
    else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс

    // преобразование показаний датчика в градусы Цельсия 
    celsius = (float)raw / 16.0;
    int o = celsius;
    Serial.println(o);
    radio.write(&o, sizeof(1)); 
    
    delay(2000);  // рарешить выполнение расчета
    sleep_count = 0;        // обнулить счетчик
    delay(2);               // задержка для стабильности
  } 
    
}

Приемник:

#include <iarduino_RF433_Receiver.h>                      // Подключаем библиотеку для работы с приёмником MX-RM-5V
#define CLK 5
#define DIO 4
#include "GyverTM1637.h"
GyverTM1637 disp(CLK, DIO);
iarduino_RF433_Receiver radio(2);                         // Создаём объект radio для работы с библиотекой iarduino_RF433, указывая номер вывода к которому подключён приёмник (можно подключать только к выводам использующим внешние прерывания)

int                     data[2];                          // Создаём массив для приёма данных
const uint8_t           pinLED = 11;                      // Создаём константу с указанием вывода ШИМ к которому подключён светодиод
void setup() {
  pinMode(2, OUTPUT);
  digitalWrite(2, 1);
  Serial.begin(9600);
  disp.clear();  // инициализация
  disp.brightness(7);
  Serial.begin(9600);                                     // Инициируем работу LED индикатора
  radio.begin();                                        // Инициируем работу приёмника MX-RM-5V (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate)
  radio.setDataRate     (i433_1KBPS);                   // Указываем скорость приёма данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек
  radio.openReadingPipe (5);                            // Открываем 5 трубу для приема данных (если вызвать функцию без параметра, то будут открыты все трубы сразу, от 0 до 7)
  //  radio.openReadingPipe (2);                            // Открываем 2 трубу для приёма данных (таким образом можно прослушивать сразу несколько труб)
  //  radio.closeReadingPipe(2);                            // Закрываем 2 трубу от  приёма данных (если вызвать функцию без параметра, то будут закрыты все трубы сразу, от 0 до 7)
  radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
  //  radio.stopListening   ();                             // Выключаем приёмник, если потребуется

}
void loop() {

  if (radio.available()) {                              // Если в буфере имеются принятые данные
    radio.read(&data, sizeof(data));                  // Читаем данные в массив data и указываем сколько байт читать
    Serial.println(data[0]);
    int u = data[0];
    switch (u) {
      case 1:

        disp.displayByte(_empty, 0x06, 0x58, _empty);
        delay(5000);
        break;
      case 2:

        disp.displayByte(_empty, 0x5b, 0x58, _empty);
        delay(5000);
        break;
      case 3:

        disp.displayByte(_empty, 0x4f, 0x58, _empty);
        delay(5000);
        break;
      case 4:

        disp.displayByte(_empty, 0x66, 0x58, _empty);
        delay(5000);
        break;
      case 5:

        disp.displayByte(_empty, 0x6d, 0x58, _empty);
        delay(5000);
        break;
      case 6:

        disp.displayByte(_empty, 0x7d, 0x58, _empty);
        delay(5000);
        break;
      case 7:

        disp.displayByte(_empty, 0x07, 0x58, _empty);
        delay(5000);
        break;
      case 8:

        disp.displayByte(_empty, 0x7f, 0x58, _empty);
        delay(5000);
        break;
      case 9:

        disp.displayByte(_empty, 0x6f, 0x58, _empty);
        delay(5000);
        break;
      case 10:

        disp.displayByte(_empty, 0x30, 0x3f, 0x58);
        delay(5000);
        break;
      case 11:

        disp.displayByte(_empty, 0x30, 0x30, 0x58);
        delay(5000);
        break;
      case 12:

        disp.displayByte(_empty, 0x30, 0x5b, 0x58);
        delay(5000);
        break;
      case 13:

        disp.displayByte(_empty, 0x30, 0x4f, 0x58);
        delay(5000);
        break;
      case 14:

        disp.displayByte(_empty, 0x30, 0x66, 0x58);
        delay(5000);
        break;
      case 15:

        disp.displayByte(_empty, 0x30, 0x6d, 0x58);
        delay(5000);
        break;
      case 16:

        disp.displayByte(_empty, 0x30, 0x7d, 0x58);
        delay(5000);
        break;
      case 17:

        disp.displayByte(_empty, 0x30, 0x07, 0x58);
        delay(5000);
        break;
      case 18:

        disp.displayByte(_empty, 0x30, 0x7f, 0x58);
        delay(5000);
        break;
      case 19:

        disp.displayByte(_empty, 0x30, 0x6f, 0x58);
        delay(5000);
        break;
      case 20:

        disp.displayByte(_empty, 0x5b, 0x3f, 0x58);
        delay(5000);
        break;
      case 21:

        disp.displayByte(_empty, 0x5b, 0x30, 0x58);
        delay(5000);
        break;
      case 22:

        disp.displayByte(_empty, 0x5b, 0x5b, 0x58);
        delay(5000);
        break;
      case 23:

        disp.displayByte(_empty, 0x5b, 0x4f, 0x58);
        delay(5000);
        break;
      case 24:

        disp.displayByte(_empty, 0x5b, 0x66, 0x58);
        delay(5000);
        break;
      case 25:

        disp.displayByte(_empty, 0x5b, 0x6d, 0x58);
        delay(5000);
        break;
      case 26:

        disp.displayByte(_empty, 0x5b, 0x7d, 0x58);
        delay(5000);
        break;
      case 27:

        disp.displayByte(_empty, 0x5b, 0x07, 0x58);
        delay(5000);
        break;
      case 28:

        disp.displayByte(_empty, 0x5b, 0x7f, 0x58);
        delay(5000);
        break;
      case 29:

        disp.displayByte(_empty, 0x5b, 0x6f, 0x58);
        delay(5000);
        break;
      case 30:

        disp.displayByte(_empty, 0x4f, 0x3f, 0x58);
        delay(5000);
        break;
      case 31:

        disp.displayByte(_empty, 0x4f, 0x30, 0x58);
        delay(5000);
        break;
      case 32:

        disp.displayByte(_empty, 0x4f, 0x5b, 0x58);
        delay(5000);
        break;
      case 33:

        disp.displayByte(_empty, 0x4f, 0x4f, 0x58);
        delay(5000);
        break;
      case 34:

        disp.displayByte(_empty, 0x4f, 0x66, 0x58);
        delay(5000);
        break;
      case 35:

        disp.displayByte(_empty, 0x4f, 0x6d, 0x58);
        delay(5000);
        break;
      case 36:

        disp.displayByte(_empty, 0x4f, 0x7d, 0x58);
        delay(5000);
        break;
      case 37:

        disp.displayByte(_empty, 0x4f, 0x07, 0x58);
        delay(5000);
        break;
      case 38:

        disp.displayByte(_empty, 0x4f, 0x7f, 0x58);
        delay(5000);
        break;
      case 39:

        disp.displayByte(_empty, 0x4f, 0x6f, 0x58);
        delay(5000);
        break;
      case 40:

        disp.displayByte(_empty, 0x66, 0x3f, 0x58);
        delay(5000);
        break;
      case 0:

        disp.displayByte(_empty, 0x3f, 0x58, _empty);
        delay(5000);
        break;
     case -1:

        disp.displayByte(0x40, 0x06, 0x58, _empty);
        delay(5000);
        break;
      case -2:

        disp.displayByte(0x40, 0x5b, 0x58, _empty);
        delay(5000);
        break;
      case -3:

        disp.displayByte(0x40, 0x4f, 0x58, _empty);
        delay(5000);
        break;
      case -4:

        disp.displayByte(0x40, 0x66, 0x58, _empty);
        delay(5000);
        break;
      case -5:

        disp.displayByte(0x40, 0x6d, 0x58, _empty);
        delay(5000);
        break;
      case -6:

        disp.displayByte(0x40, 0x7d, 0x58, _empty);
        delay(5000);
        break;
      case -7:

        disp.displayByte(0x40, 0x07, 0x58, _empty);
        delay(5000);
        break;
      case -8:

        disp.displayByte(0x40, 0x7f, 0x58, _empty);
        delay(5000);
        break;
      case -9:

        disp.displayByte(0x40, 0x6f, 0x58, _empty);
        delay(5000);
        break;
      case -10:

        disp.displayByte(0x40, 0x30, 0x3f, 0x58);
        delay(5000);
        break;
      case -11:

        disp.displayByte(0x40, 0x30, 0x30, 0x58);
        delay(5000);
        break;
      case -12:

        disp.displayByte(0x40, 0x30, 0x5b, 0x58);
        delay(5000);
        break;
      case -13:

        disp.displayByte(0x40, 0x30, 0x4f, 0x58);
        delay(5000);
        break;
      case -14:

        disp.displayByte(0x40, 0x30, 0x66, 0x58);
        delay(5000);
        break;
      case -15:

        disp.displayByte(0x40, 0x30, 0x6d, 0x58);
        delay(5000);
        break;
      case -16:

        disp.displayByte(0x40, 0x30, 0x7d, 0x58);
        delay(5000);
        break;
      case -17:

        disp.displayByte(0x40, 0x30, 0x07, 0x58);
        delay(5000);
        break;
      case -18:

        disp.displayByte(0x40, 0x30, 0x7f, 0x58);
        delay(5000);
        break;
      case -19:

        disp.displayByte(0x40, 0x30, 0x6f, 0x58);
        delay(5000);
        break;
      case -20:

        disp.displayByte(0x40, 0x5b, 0x3f, 0x58);
        delay(5000);
        break;
      case -21:

        disp.displayByte(0x40, 0x5b, 0x30, 0x58);
        delay(5000);
        break;
      case -22:

        disp.displayByte(0x40, 0x5b, 0x5b, 0x58);
        delay(5000);
        break;
      case -23:

        disp.displayByte(0x40, 0x5b, 0x4f, 0x58);
        delay(5000);
        break;
      case -24:

        disp.displayByte(0x40, 0x5b, 0x66, 0x58);
        delay(5000);
        break;
      case -25:

        disp.displayByte(0x40, 0x5b, 0x6d, 0x58);
        delay(5000);
        break;
      case -26:

        disp.displayByte(0x40, 0x5b, 0x7d, 0x58);
        delay(5000);
        break;
      case -27:

        disp.displayByte(0x40, 0x5b, 0x07, 0x58);
        delay(5000);
        break;
      case -28:

        disp.displayByte(0x40, 0x5b, 0x7f, 0x58);
        delay(5000);
        break;
      case -29:

        disp.displayByte(0x40, 0x5b, 0x6f, 0x58);
        delay(5000);
        break;
      case -30:

        disp.displayByte(0x40, 0x4f, 0x3f, 0x58);
        delay(5000);
        break;
      case -31:

        disp.displayByte(0x40, 0x4f, 0x30, 0x58);
        delay(5000);
        break;
      case -32:

        disp.displayByte(0x40, 0x4f, 0x5b, 0x58);
        delay(5000);
        break;
      case -33:

        disp.displayByte(0x40, 0x4f, 0x4f, 0x58);
        delay(5000);
        break;
      case -34:

        disp.displayByte(0x40, 0x4f, 0x66, 0x58);
        delay(5000);
        break;
      case -35:

        disp.displayByte(0x40, 0x4f, 0x6d, 0x58);
        delay(5000);
        break;
      case -36:

        disp.displayByte(0x40, 0x4f, 0x7d, 0x58);
        delay(5000);
        break;
      case -37:

        disp.displayByte(0x40, 0x4f, 0x07, 0x58);
        delay(5000);
        break;
      case -38:

        disp.displayByte(0x40, 0x4f, 0x7f, 0x58);
        delay(5000);
        break;
      case -39:

        disp.displayByte(0x40, 0x4f, 0x6f, 0x58);
        delay(5000);
        break;
      case -40:

        disp.displayByte(0x40, 0x66, 0x3f, 0x58);
        delay(5000);
        break;

    }
   disp.clear();
   

  }

}
// Если вызвать функцию available с параметром в виде ссылки на переменную типа uint8_t, то мы получим номер трубы, по которой пришли данные (см. урок 26.5)

 

ВН
Offline
Зарегистрирован: 25.02.2016

переставить скобку из 443 строки в конец 29-той, потом разобраться с работой ифа и понять, что сделали.

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

Подумать, зачем чистить дисплей, если все его поля все одно заполняются в свиче.

Почти наверняка вывод можно сделать более компактным при дополнительном использовании disp.displayInt

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

переставить скобку из 443 строки в конец 29-той, потом разобраться с работой ифа и понять, что сделали.

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

Подумать, зачем чистить дисплей, если все его поля все одно заполняются в свиче.

Почти наверняка вывод можно сделать более компактным при дополнительном использовании disp.displayInt

Так и не понял зачем нужна перестановка скобки, хотя с работой if ознакомлен.

Изначально delay стоял перед дисп клир.

Без очистки дисплея не обновляются данные, даже не печатаются в ком порта, просто зависают на первом принятом значении.

Изначально пытался сделать через disp.displayInt, но я так понял что в библеотеке не было знака минус, поэтому все через byte

ВН
Offline
Зарегистрирован: 25.02.2016

qwerty13rus пишет:
Так и не понял зачем нужна перестановка скобки, хотя с работой if ознакомлен.

так а результат перестановки , видим - не видим?

qwerty13rus пишет:

Изначально delay стоял перед дисп клир.

Без очистки дисплея не обновляются данные, даже не печатаются в ком порта, просто зависают на первом принятом значении.

да, без делея в порт слишком шустро получится

qwerty13rus пишет:

Изначально пытался сделать через disp.displayInt, но я так понял что в библеотеке не было знака минус, поэтому все через byte

минус он вроде  печатает сам, надо просто учесть место минуса

вот потестируй вывод для положительных до 99 и отрицательных до -9

case x: disp.displayInt(Temp); disp.displayByte(0,0); disp.displayByte(1,0); break; // первые два знака погашены

 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

так а результат перестановки , видим - не видим?

после перестановки в порт и на дисплей постоянно отправляются нули, значения с передатчика не приходят

 

ВН пишет:

минус он вроде  печатает сам, надо просто учесть место минуса

Действительно, именно из за этого я и решил все сделать через свич. Вместо отрицательной температуры показывалось непонять что

ВН пишет:

вот потестируй вывод для положительных до 99 и отрицательных до -9

case x: disp.displayInt(Temp); disp.displayByte(0,0); disp.displayByte(1,0); break; // первые два знака погашены

Не понял, куда это надо?

ВН
Offline
Зарегистрирован: 25.02.2016

1. добавьте в определенние массива volatile

3. Там пример вывода, можно на его основе собрать небольшой скетч для теста.

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

1. добавьте в определенние массива volatile

Добавил, но зачем это нужно если массив у меня и так глобальный?

ВН пишет:

3. Там пример вывода, можно на его основе собрать небольшой скетч для теста.

А как это поможет в моем случае? Данные вроде и так нормально выводятся

ВН
Offline
Зарегистрирован: 25.02.2016

qwerty13rus пишет:

ВН пишет:

1. добавьте в определенние массива volatile

Добавил, но зачем это нужно если массив у меня и так глобальный?

"после перестановки в порт и на дисплей постоянно отправляются нули, значения с передатчика не приходят"

а массив глобальный

вертайте скобку взад и смотрите, будут нули или нет

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

вертайте скобку взад и смотрите, будут нули или нет

все так же, нули

ВН
Offline
Зарегистрирован: 25.02.2016

загрузите последний скетч

qwerty13rus
Offline
Зарегистрирован: 05.12.2018
#include <iarduino_RF433_Receiver.h>                      // Подключаем библиотеку для работы с приёмником MX-RM-5V
#define CLK 5
#define DIO 4
#include "GyverTM1637.h"
GyverTM1637 disp(CLK, DIO);
iarduino_RF433_Receiver radio(2);                         // Создаём объект radio для работы с библиотекой iarduino_RF433, указывая номер вывода к которому подключён приёмник (можно подключать только к выводам использующим внешние прерывания)

 volatile int                     data[2];                          // Создаём массив для приёма данных
const uint8_t           pinLED = 11;                      // Создаём константу с указанием вывода ШИМ к которому подключён светодиод
void setup() {
  pinMode(2, OUTPUT);
  digitalWrite(2, 1);
  Serial.begin(9600);
  disp.clear();  // инициализация
  disp.brightness(7);
  Serial.begin(9600);                                     // Инициируем работу LED индикатора
  radio.begin();                                        // Инициируем работу приёмника MX-RM-5V (в качестве параметра можно указать скорость ЧИСЛО бит/сек, тогда можно не вызывать функцию setDataRate)
  radio.setDataRate     (i433_1KBPS);                   // Указываем скорость приёма данных (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек
  radio.openReadingPipe (5);                            // Открываем 5 трубу для приема данных (если вызвать функцию без параметра, то будут открыты все трубы сразу, от 0 до 7)
  //  radio.openReadingPipe (2);                            // Открываем 2 трубу для приёма данных (таким образом можно прослушивать сразу несколько труб)
  //  radio.closeReadingPipe(2);                            // Закрываем 2 трубу от  приёма данных (если вызвать функцию без параметра, то будут закрыты все трубы сразу, от 0 до 7)
  radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
  //  radio.stopListening   ();                             // Выключаем приёмник, если потребуется

}
void loop() {

  if (radio.available()) {                              // Если в буфере имеются принятые данные
    radio.read(&data, sizeof(data));
  }
    Serial.println(data[0]);
    int u = data[0];
    switch (u) {
      case 1:

        disp.displayByte(_empty, 0x06, 0x58, _empty);
          
        break;
      case 2:

        disp.displayByte(_empty, 0x5b, 0x58, _empty);
          
        break;
      case 3:

        disp.displayByte(_empty, 0x4f, 0x58, _empty);
          
        break;
      case 4:

        disp.displayByte(_empty, 0x66, 0x58, _empty);
          
        break;
      case 5:

        disp.displayByte(_empty, 0x6d, 0x58, _empty);
          
        break;
      case 6:

        disp.displayByte(_empty, 0x7d, 0x58, _empty);
          
        break;
      case 7:

        disp.displayByte(_empty, 0x07, 0x58, _empty);
          
        break;
      case 8:

        disp.displayByte(_empty, 0x7f, 0x58, _empty);
          
        break;
      case 9:

        disp.displayByte(_empty, 0x6f, 0x58, _empty);
          
        break;
      case 10:

        disp.displayByte(_empty, 0x30, 0x3f, 0x58);
          
        break;
      case 11:

        disp.displayByte(_empty, 0x30, 0x30, 0x58);
          
        break;
      case 12:

        disp.displayByte(_empty, 0x30, 0x5b, 0x58);
          
        break;
      case 13:

        disp.displayByte(_empty, 0x30, 0x4f, 0x58);
          
        break;
      case 14:

        disp.displayByte(_empty, 0x30, 0x66, 0x58);
          
        break;
      case 15:

        disp.displayByte(_empty, 0x30, 0x6d, 0x58);
          
        break;
      case 16:

        disp.displayByte(_empty, 0x30, 0x7d, 0x58);
          
        break;
      case 17:

        disp.displayByte(_empty, 0x30, 0x07, 0x58);
          
        break;
      case 18:

        disp.displayByte(_empty, 0x30, 0x7f, 0x58);
          
        break;
      case 19:

        disp.displayByte(_empty, 0x30, 0x6f, 0x58);
          
        break;
      case 20:

        disp.displayByte(_empty, 0x5b, 0x3f, 0x58);
          
        break;
      case 21:

        disp.displayByte(_empty, 0x5b, 0x30, 0x58);
          
        break;
      case 22:

        disp.displayByte(_empty, 0x5b, 0x5b, 0x58);
          
        break;
      case 23:

        disp.displayByte(_empty, 0x5b, 0x4f, 0x58);
          
        break;
      case 24:

        disp.displayByte(_empty, 0x5b, 0x66, 0x58);
          
        break;
      case 25:

        disp.displayByte(_empty, 0x5b, 0x6d, 0x58);
          
        break;
      case 26:

        disp.displayByte(_empty, 0x5b, 0x7d, 0x58);
          
        break;
      case 27:

        disp.displayByte(_empty, 0x5b, 0x07, 0x58);
          
        break;
      case 28:

        disp.displayByte(_empty, 0x5b, 0x7f, 0x58);
          
        break;
      case 29:

        disp.displayByte(_empty, 0x5b, 0x6f, 0x58);
          
        break;
      case 30:

        disp.displayByte(_empty, 0x4f, 0x3f, 0x58);
          
        break;
      case 31:

        disp.displayByte(_empty, 0x4f, 0x30, 0x58);
          
        break;
      case 32:

        disp.displayByte(_empty, 0x4f, 0x5b, 0x58);
          
        break;
      case 33:

        disp.displayByte(_empty, 0x4f, 0x4f, 0x58);
          
        break;
      case 34:

        disp.displayByte(_empty, 0x4f, 0x66, 0x58);
          
        break;
      case 35:

        disp.displayByte(_empty, 0x4f, 0x6d, 0x58);
          
        break;
      case 36:

        disp.displayByte(_empty, 0x4f, 0x7d, 0x58);
          
        break;
      case 37:

        disp.displayByte(_empty, 0x4f, 0x07, 0x58);
          
        break;
      case 38:

        disp.displayByte(_empty, 0x4f, 0x7f, 0x58);
          
        break;
      case 39:

        disp.displayByte(_empty, 0x4f, 0x6f, 0x58);
          
        break;
      case 40:

        disp.displayByte(_empty, 0x66, 0x3f, 0x58);
          
        break;
      case 0:

        disp.displayByte(_empty, 0x3f, 0x58, _empty);
          
        break;
     case -1:

        disp.displayByte(0x40, 0x06, 0x58, _empty);
          
        break;
      case -2:

        disp.displayByte(0x40, 0x5b, 0x58, _empty);
          
        break;
      case -3:

        disp.displayByte(0x40, 0x4f, 0x58, _empty);
          
        break;
      case -4:

        disp.displayByte(0x40, 0x66, 0x58, _empty);
          
        break;
      case -5:

        disp.displayByte(0x40, 0x6d, 0x58, _empty);
          
        break;
      case -6:

        disp.displayByte(0x40, 0x7d, 0x58, _empty);
          
        break;
      case -7:

        disp.displayByte(0x40, 0x07, 0x58, _empty);
          
        break;
      case -8:

        disp.displayByte(0x40, 0x7f, 0x58, _empty);
          
        break;
      case -9:

        disp.displayByte(0x40, 0x6f, 0x58, _empty);
          
        break;
      case -10:

        disp.displayByte(0x40, 0x30, 0x3f, 0x58);
          
        break;
      case -11:

        disp.displayByte(0x40, 0x30, 0x30, 0x58);
          
        break;
      case -12:

        disp.displayByte(0x40, 0x30, 0x5b, 0x58);
          
        break;
      case -13:

        disp.displayByte(0x40, 0x30, 0x4f, 0x58);
          
        break;
      case -14:

        disp.displayByte(0x40, 0x30, 0x66, 0x58);
          
        break;
      case -15:

        disp.displayByte(0x40, 0x30, 0x6d, 0x58);
          
        break;
      case -16:

        disp.displayByte(0x40, 0x30, 0x7d, 0x58);
          
        break;
      case -17:

        disp.displayByte(0x40, 0x30, 0x07, 0x58);
          
        break;
      case -18:

        disp.displayByte(0x40, 0x30, 0x7f, 0x58);
          
        break;
      case -19:

        disp.displayByte(0x40, 0x30, 0x6f, 0x58);
          
        break;
      case -20:

        disp.displayByte(0x40, 0x5b, 0x3f, 0x58);
          
        break;
      case -21:

        disp.displayByte(0x40, 0x5b, 0x30, 0x58);
          
        break;
      case -22:

        disp.displayByte(0x40, 0x5b, 0x5b, 0x58);
          
        break;
      case -23:

        disp.displayByte(0x40, 0x5b, 0x4f, 0x58);
          
        break;
      case -24:

        disp.displayByte(0x40, 0x5b, 0x66, 0x58);
          
        break;
      case -25:

        disp.displayByte(0x40, 0x5b, 0x6d, 0x58);
          
        break;
      case -26:

        disp.displayByte(0x40, 0x5b, 0x7d, 0x58);
          
        break;
      case -27:

        disp.displayByte(0x40, 0x5b, 0x07, 0x58);
          
        break;
      case -28:

        disp.displayByte(0x40, 0x5b, 0x7f, 0x58);
          
        break;
      case -29:

        disp.displayByte(0x40, 0x5b, 0x6f, 0x58);
          
        break;
      case -30:

        disp.displayByte(0x40, 0x4f, 0x3f, 0x58);
          
        break;
      case -31:

        disp.displayByte(0x40, 0x4f, 0x30, 0x58);
          
        break;
      case -32:

        disp.displayByte(0x40, 0x4f, 0x5b, 0x58);
          
        break;
      case -33:

        disp.displayByte(0x40, 0x4f, 0x4f, 0x58);
          
        break;
      case -34:

        disp.displayByte(0x40, 0x4f, 0x66, 0x58);
          
        break;
      case -35:

        disp.displayByte(0x40, 0x4f, 0x6d, 0x58);
          
        break;
      case -36:

        disp.displayByte(0x40, 0x4f, 0x7d, 0x58);
          
        break;
      case -37:

        disp.displayByte(0x40, 0x4f, 0x07, 0x58);
          
        break;
      case -38:

        disp.displayByte(0x40, 0x4f, 0x7f, 0x58);
          
        break;
      case -39:

        disp.displayByte(0x40, 0x4f, 0x6f, 0x58);
          
        break;
      case -40:

        disp.displayByte(0x40, 0x66, 0x3f, 0x58);
          
        break;

    }

   disp.clear();
  } 

 

ВН
Offline
Зарегистрирован: 25.02.2016

ок, очистка тут все затирает,  

попробуйте вернуть свой делей после свича перед клер.

общее подозрение такое, что иногда с эфира принимается нужное значение и пишется, за счет задержки его было видно,  но чаще пишется ноль или еще хз что со стороны помех.

в свиче нет default:, обработки неописанной ситуации, вытащите туда что-то , чтобы было видно

и по нему смотреть ловлю помех.

от клер тут нужно избавляться, все должно работать без него.

 

 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

ок, очистка тут все затирает,  

попробуйте вернуть свой делей после свича перед клер.

общее подозрение такое, что иногда с эфира принимается нужное значение и пишется, за счет задержки его было видно,  но чаще пишется ноль или еще хз что со стороны помех.

в свиче нет default:, обработки неописанной ситуации, вытащите туда что-то , чтобы было видно

и по нему смотреть ловлю помех.

от клер тут нужно избавляться, все должно работать без него.

 

 

делей вернул, клер убрал, поставил дефолт с выводом значений на дисплей. Все также, в ком порта и на дисплей выводятся значение 0 каждые 1000 милисекунд. Вот думаю может просто сделать все на делей? Что бы значение зависало на дисплее через делей, потом делей прекращался и с передатчика поступало новое значение и все повторялось. Минус этого в том что во время принятия значения с передатчика на дисплее ничего не будет несколько секунд, но если это будет происходить раз в 1 час то нормально. Вот только нужно что бы все работало как часы, что мне кажется с делеем будет проблематично. Что думаете ?

ВН
Offline
Зарегистрирован: 25.02.2016

 

непонятно откуда там вообще нули берутся.

надо проверить сам  вывод, залочьте приемник, пропишите в дату значения при объявлении, проверить вывод.

пробовать конечно нужно все, что устраивает 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

 

непонятно откуда там вообще нули берутся.

надо проверить сам  вывод, залочьте приемник, пропишите в дату значения при объявлении, проверить вывод.

пробовать конечно нужно все, что устраивает 

Если я правильно понимаю что вы имеете ввиду то с выводом все хорошо. Скетчи в стартовом топике работали как положено, в порт и на дисплей выводилось. Убрав значение массима data перед свитч у меня началось выполнение default: Не знаю, поможет ли это как то

ВН
Offline
Зарегистрирован: 25.02.2016

qwerty13rus пишет:

 Убрав значение массима data перед свитч у меня началось выполнение default: Не знаю, поможет ли это как то

т.е. это "u" повисло в воздухе? 

я вас просил дописать в 8 строке начальные значения в массив, 7. 8 например.  и закомментировать строки обработки приема. т.е.  строки 28,29,30

тогда на выходе должно быть 7

Приемник не обрабатывется, работа только с массивом.

хотя там он там ваще непонятно зачем нужен, отправляете вы 1 значение и в массив пишете и читает одно.

А что прописано по дефолту свича?

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

т.е. это "u" повисло в воздухе? 

да, переменная "u"

ВН пишет:

тогда на выходе должно быть 7

так и получилось

ВН пишет:

хотя там он там ваще непонятно зачем нужен, отправляете вы 1 значение и в массив пишете и читает одно.

не менял его с начального образца, думал не важно

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

А что прописано по дефолту свича?

вот

 disp.displayByte(0x40, 0x40, 0x40, 0x40);

ВН
Offline
Зарегистрирован: 25.02.2016

т.е. вывод работает.

откройте строки 28, 29,30 приемника

и запустите в передатчике передачу одной  цифры 9 в цикле  с задержкой в 50мс

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Что значит открыть строки приемника?

ВН
Offline
Зарегистрирован: 25.02.2016

т.е. раскомментировать, мы же их залочили в предыдущем  тесте.

теперь открываем и должны настроить передатчик на непрерывную передачу. см. выше. 

 disp.displayByte(0x40, 0x40, 0x40, 0x40); это сколько на экране? 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

 disp.displayByte(0x40, 0x40, 0x40, 0x40); это сколько на экране? 

на экране это 4 минуса.

передатчик настроил как вы сказали, начальные значения массива убрал, но идут все равно нули. Убрал квадратную скобку if на 30 строчке и поставил в конец , данные начали приходить

ВН
Offline
Зарегистрирован: 25.02.2016

qwerty13rus пишет:
Убрал квадратную скобку if на 30 строчке и поставил в конец , данные начали приходить

т.е. все вернулось на круги своя,  практически к исходному варианту?

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

ВН пишет:

 т.е. все вернулось на круги своя,  практически к исходному варианту?

Получается так. Просто я не особо понимаю смысл наших манипуляций.

ВН
Offline
Зарегистрирован: 25.02.2016

qwerty13rus пишет:
Получается так. Просто я не особо понимаю смысл наших манипуляций.

смысл понять откуда идут нули

не нужно было убирать начальные значения массива, они должны были обновиться приемником

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Прошу прощения за мою тупость. Значения массива вернул, в порт и на дисплей выводится 7, но на это никак не влияет передатчик, что включен, что выключен, никакой разницы. А нужно ли  Убирать значение массива data перед свитч?

ВН
Offline
Зарегистрирован: 25.02.2016

вот что и странно, чем так для приемника отличается ситуация, что в одном случае он изменяет значение в массиве, а в другом нет.

Видимо нужно попросить разъяснить ситуацию кого-то компетентного в этом деле. Я пока не понимаю, как такое может быть. 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Хорошо, все равно спасибо

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

qwerty13rus пишет:

Здравствуйте! Как можно сделать что бы при передачи данных с трансмиттера, на приемнике делалось некое действие до тех пор пока не придут еще данные, все это в цикле. В моем случае нужно что бы при приеме определенной температуры, эта температура выводилась на дисплей пока не придет другая температура. Пока что температура выводится на дисплей 5 секунд после приема данных. Вроде как объяснил)

Очень легко. В коде из стартового поста уберите фигурную скобку со строки 443 и вставьте ее после строки 31. Получите ровно то что нужно.

Прежде чем редактировать код - перепишите его по нормальному. Спорим, что ваш огромный switch длиной более 400 строк я упакую в 10 линий?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

Прежде чем редактировать код - перепишите его по нормальному. Спорим, что ваш огромный switch длиной более 400 строк я упакую в 10 линий?

Что самое интересное - он при этом еще и работать станет во много раз быстрее.

 

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

b707 пишет:

Очень легко. В коде из стартового поста уберите фигурную скобку со строки 443 и вставьте ее после строки 31. Получите ровно то что нужно.

Не работает. Сначало ардуино ругалась как я понял на локальную переменную, после я сделал ее глобальной. Но на дисплее все так же приходил ноль

b707 пишет:

Прежде чем редактировать код - перепишите его по нормальному. Спорим, что ваш огромный switch длиной более 400 строк я упакую в 10 линий?

Я не совневаюсь в вашем умении программирования ардуино, сам я знаком с ней  около месяца, вообщем то как и с программированием в целом.

qwerty13rus
Offline
Зарегистрирован: 05.12.2018

Проблему решил просто используя другую библиотеку для дисплея