Помощь в дописании кода для ардуино

Приветствую форумчане, есть конструктор кода ESP8266/ESP32 от WI-FI IoT. Прекрасный проект. Есть проблема надо дописать код/скетч для ардуино. Есть в конструкторе кода пункт VirtualWire 433/315, он говорит что к ESP можно поключить по радиоканалу 433/315 различные датчики по протоколу VirtualWire. У меня установлен и работает по каналу 433Мгц уличный термометр, по какому протоколу работает не известно. Поключал приемник к ESP32 температура не определяется. В пункте конструктора есть часть рабочего кода но необходимо его дописать, я в этом ничего не понимаю , прочитать код примитивно могу, могу определить к каким пинам что и как подключается.
Программный код:

#include < VirtualWire.h >
#define ID 55555
#define GPIO_TX 12 // pin для передатчика
uint8_t countsend;

void setup()
{
vw_set_tx_pin(GPIO_TX);
pinMode(GPIO_TX, OUTPUT);
vw_setup(1000);        //bit
}

void loop()
{
uint16_t t=1111;      //1  температура
int16_t h=2222;       //2  влажность
int32_t c=999999999;  //3  счетчик
int16_t a=9999;       //4  ацп
int8_t g=255;         //5  gpio

uint8_t msg[ ]={26,ID&255,ID/256,countsend++,
1,t&255,t/256,                                 // температура
2,h&255,h/256,                                   //влажность
3,c&255,c/256,(c/65536)&255, (c/(65536\*256))&255,//счетчик
4,a&255,a/256,                                   // ацп
5,g                                              // gpio
};
digitalWrite(13,1);
vw_send(msg, sizeof(msg));
vw_wait_tx();
digitalWrite(13, 0);
delay(3000);
}

Для начала

Вы, к сожалению, запостились не в тот раздел форума.

С просьбами типа:

Нужно обращаться в коммерческий раздел, где можно заказать работу тому, кто за неё возьмётся.

Могу перенести тему туда, если желаете.

Разве есп работает на частоте 433мГц? Или я опять туплю?

Oleg5672 готов оценить возьмусь я или нет, если сумма за проект 30к и более, подходит ?
я просто не для того осваивал тысячу вещей, что бы их кому то делать раз в жизни, еще и дешевле 30к…
))) естественно причин гораздо больше, но времени нет жаловаться, просто интересно послушать человека рассудительного, что скажете теперь?!)))

p.s. как я понял он про это https://wifi-iot.com/p/wiki/172/ru/
тупо скопировал код с этой странице, ни описания, что за модули, не суммы за проект(как будто это нам надо))) ) еще и группу в телеге официальную не посещал, ( но это все же не точно, вроде я там есть но мог и пропустить) еще не вникал в прошивку, а ведь она может быть частично скрыта… но может тут я путаю с другим проектом..

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

Соглашайтесь. 2кк == 2 000 000 :sweat_smile:

Вопрос решил сам , может кому нибуь понадобится.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <VirtualWire.h>
#include <SimpleTimer.h>

const int led_pin = 13;       // PB5
const int transmit_pin = 12;  // PB4
const int analogInPin = A0;   // пин ADC0 ,АЦП измерение напряжения

// const int transmit_en_pin = 11;// PB3 пин EN запуска питания передатчика
// const int receive_pin = 2;

//-----------------------------------------------------------
#define ONE_WIRE_BUS 8  // DS18B20 Pin PB0
// #define TEMPERATURE_PRECISION 12  // точность измерения DS18B20
#define timer1_Interval 2000  // время (5*1000) милисекунд многократно выполнять функцию Measure()
#define timer2_Interval 2000  // время (5*1000) милисекунд многократно выполнять функцию Send()
//-----------------------------------------------------------
float temp;
float voltage;                   // текущая температура DS18B20
unsigned int timer1, timer2;  // номера таймеров
//-----------------------------------------------------------
SimpleTimer timer;
OneWire oneWire(ONE_WIRE_BUS);   // создаём объект для работы с библиотекой OneWire
DallasTemperature ds(&oneWire);  // создадим объект для работы с библиотекой DallasTemperature
DeviceAddress ds0;
// создаём указатель массив для хранения адресов датчиков
DeviceAddress *sensorsUnique;
// количество датчиков на шине
int countSensors;

uint16_t ID;  // переменная 2 байта
uint8_t countsend;

// функция вывода адреса датчика
void printAddress(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++) {
    if (deviceAddress[i] < 16) {
      Serial.print("0");
    }
    Serial.print(deviceAddress[i], HEX);
  }
}
void setup() {
  ID = 55555;  // Присвоение начального значения
  vw_set_tx_pin(12);  // пин передачи PB4
  // vw_set_ptt_pin(transmit_en_pin); //  PB3 пин EN управления питанием
  pinMode(transmit_pin, OUTPUT);
  vw_setup(1200);  // скорость передачи данных(бит/с)
  Serial.begin(9600);
  // инициируем датчик
  ds.begin();  // старт датчика ds library DallasTemperature
  delay(50);
  // достаем адрес датчика с индесом 0
  if (!ds.getAddress(ds0, 0))
    Serial.println("Unable to find address for Device 0");
  // ожидаем открытия Serial-порта
  while (!Serial)
    ;  //
  // выполняем поиск устройств на шине
  countSensors = ds.getDeviceCount();
  Serial.print("Found sensors: ");  // Имя Found sensors в сомport
  Serial.println(countSensors);     // найден 1(один) датчик в comport
  // выделяем память в динамическом массиве под количество обнаруженных сенсоров
  sensorsUnique = new DeviceAddress[countSensors];
  // определяем в каком режиме питания подключены сенсоры
  if (ds.isParasitePowerMode()) {
    Serial.println("Mode power is Parasite");
  } else {
    Serial.println("Mode power is Normal");
  }
  // делаем запрос на получение адресов датчиков
  for (int i = 0; i < countSensors; i++) {
    ds.getAddress(sensorsUnique[i], i);
  }
  // устанавливаем разрешение всех датчиков в 12 бит
  for (int i = 0; i < countSensors; i++) {
    ds.setResolution(sensorsUnique[i], 12);
  }

  // устанавливаем разрешение 12 bit для одного датчика
  //ds.setResolution(ds0, TEMPERATURE_PRECISION);
  //  запускаем таймеры
  timer1 = timer.setInterval(timer1_Interval, Measure);  // каждые timer1_Interval выполнять функцию Measure()
  timer2 = timer.setInterval(timer2_Interval, Send);     // каждые timer2_Interval выполнять функцию Send()
}
//-----------------------------------------------------------
void Measure() {
  // считываем адреса с датчиков
  for (int i = 0; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Address: ");
    printAddress(sensorsUnique[i]);
    Serial.println();
  }
  // считываем температуру
  //  отправляем запрос на измерение температуры всех сенсоров
  ds.requestTemperatures();
  delay(50);
  temp = ds.getTempC(ds0) - 1;
  // отправляем serial
  Serial.print("Temperature DS18B20: ");
  Serial.print(temp);
  Serial.println("°C");

}
//-----------------------------------------------------------
void Send() {

  int sensorValue = analogRead(analogInPin);     // чтение иэмерение напряжения
  float voltage = sensorValue * (5.0 / 1023.0);  // расчет напряжения
  Serial.print("Voltage: ");
  Serial.print(voltage);
  Serial.println("V");

  uint16_t t = temp * 10;  // 1  температура
  //int16_t h = 2222;        // 2  влажность
  //int32_t c = 999999999;   // 3  счетчик
  int16_t a = voltage*100;        // 4  ацп
  //int8_t g = 255;          // 5  gpio

  uint8_t msg[] = {
    26, ID & 255, ID / 256, countsend++,
    1, t & 255, t / 256,  // температура
    // 2, h & 255, h / 256,                                                // влажность
    //3, c & 255, c / 256, (c / 65536) & 255, (c / (65536 * 256)) & 255,  // счетчик
    4, a & 255, a / 256                                               // ацп
    //5, g                                                                // gpio
  };
  digitalWrite(13, 1);
  vw_send(msg, sizeof(msg));
  vw_wait_tx();
  digitalWrite(13, 0);
  for (int i = 0; i < sizeof(msg); i++) {
    Serial.println(msg[i]);
  }
}
void loop() {
  timer.run();
}
// END--------------------------------------------------------

а вы уверенны что код будет работать, если монитор порта не открывать ?
в любом случае спс, приятно видеть тех кто найдя решение, поделился с другими)))

1 лайк

Расскажите,что с питанием датчика и на сколько хватает батареи.

В конце кода монитор порта прописан . Он и говорит о том что код работает так как задумано.

да, все верно , код работает как и задумано если открыт Монитор порта ( while (!Serial); ), а если закрыт ждет пока откроют и начинает хорошо работать. Для отлаженного устройства надо удалить while (!Serial);

Я так понял что после компиляции строчка ( while (!Serial) говорит компорт будет ждать пока я вручную запущу компорт, и получается в микроконтроллере основной цикл программы не начинает работать"?

Да, именно так. А Вы пробовали свой код в деле? Дело в том, что вставка (!Serial) может быть пасхалочкой от AI, указывая на происхождение этого кода. Идея вероятно в том что бы в сериале ничего не пропустить при отладке, но это избыточная перестраховка, у сериала есть буфер и даже если открыть монитор чуть позже в него вывалится все что есть в буфере сериала, как правило с самого начала. Как по мне этот костыль (!Serial) можно просто удалить без какого либо ущерба функционалу. Короче, поэкспериментируйте, потом расскажете.

Я про буфер не знаю, не скажу. Но когда сериал стартует на ПК - мк ресетится. Это да.

Вы знаете после подключения микроконтроллера к рабочему модулю ESP32 , web-страница не показала принятую температуру с датчика (ESP32 не увидела микроконтроллер). Я после этого посчитал что возможно кривая прошивка модуля ESP32. Спасибо ребят всем за подсказку , а то я совсем разочаровался. Буду заново пробовать , о результатах отпишусь.

Спасибо за уточнение, я как-то упустил этот момент. Ну что-ж век живи век учись и …)))

Нет. Это строчка, всего лишь ждёт, пока будет готов объект Serial. А открыт порт, закрыт, готов к принятию данных - его не волнует.

Чойта? Если порт “не готов”, то и объект не создастся. В этом его суть (суть этой записи).

В классике с мостом USB->COM, эта строка бесполезна.
На платах с прямым USB-подключением, таких как Leonardo или Yùn, он ожидает, пока ПК установит активное последовательное соединение (то есть пока последовательный порт не будет открыт с помощью программного обеспечения).
мне так запомнилось)

3 лайка

Что имеется ввиду под словом “порт”? UART МК будет готов, объект Serial создасться, а подключено ли к нему какое либо устройство, это мимо.