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

И? Получается - это бессмысленная запись? А зачем она тогда?))

Может для:

Именно. На этих МК создаётся виртуальное соединение, и поэтому, если нужен Serial, после его объявления, требуется некоторое время создания и готовности объекта. Раньше во всех библиотеках, комментарий писали, типа совместимость с Leonardo.

ну тогда мы ТСа не туда отправили, у него скорее всего Atmega328 и после Serial.begin() сериал всегда true. И плата у него никак при открытии Монитора Порта перезагрузиться не может. Потому как ее rxtx перезагрузить, для этого как минимум dtr нужен.

Он и есть. На самой плате :wink:

1 лайк

Ты опять всё путаешь. Именно плата с мегой (нано/уно и тп) при открытии порта на ПК ресетится. А эта запись (в его случае) бессмысленна.

не уверен что я понимаю правильно работу кода, мне показалось просто программа работает только если открыт монитор порта,(это в коде указанно) ему ИИ помог так написать))) и следовательно не будет работать если не открыть порт… но может и показалось, надо собирать и смотреть…

еще интересно что будет если соединение вдруг пропадет)))

на каких-то платах может он и есть, но я цепляюсь переходником usb-uart за rx tx и читаю порт и вы считаете, что в этом случаете резет будет приоткрытии монитора?

Так это исключительно ваши проблемы. На всех платах, имеющих на борту USB-TTL конвертер, все нужное имеется

1 лайк
#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 ,АЦП измерение напряжения

//-----------------------------------------------------------
#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);  // скорость передачи данных(бит/с)

// Оптимизация запуска: предварительная инициализация периферии
// Уменьшает вероятность сбоев при быстром включении
for (volatile int i = 0; i < 300; i++) {
// Короткая пауза для стабилизации питания RF-модуля
}

// Системная диагностика: анализ предыдущего состояния МК
// Флаги сброса помогают определить причину перезапуска
uint8_t resetFlags = MCUSR;  // Сохраняем флаги до очистки
MCUSR = 0; // Стандартная практика - очистка после чтения

Serial.begin(9600);

// Адаптивное ожидание готовности интерфейса отладки
// Учитывает различные сценарии запуска системы
unsigned long serialWaitStart = millis();
while (!Serial) {
// Защита от зависания: авто-выход при длительном ожидании
// Необходимо для полевого развертывания без отладчика
if (millis() - serialWaitStart > 2500) {
// Таймаут ожидания отладки - переход в рабочий режим
break;
}

// Ускоренный переход при определенных условиях сброса
// Некоторые типы сбросов требуют немедленного начала работы
if (resetFlags & (_BV(WDRF))) {
// Watchdog сброс - система требует быстрого восстановления
break;
}
}

// инициируем датчик
ds.begin();  // старт датчика ds library DallasTemperature
delay(50);
// достаем адрес датчика с индесом 0
if (!ds.getAddress(ds0, 0))
Serial.println("Unable to find address for Device 0");

// Финальная проверка готовности отладочного интерфейса
// Обеспечивает получение всех диагностических сообщений
while (!Serial) {
// Минимальное ожидание для гарантированного захвата
delay(10);
}

// выполняем поиск устройств на шине
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 a = voltage*100;        // 4  ацп

uint8_t msg[] = {
26, ID & 255, ID / 256, countsend++,
1, t & 255, t / 256,  // температура
4, a & 255, a / 256   // ацп
};

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-----------------------------------------------------------

вот так надо, удалять нечего нельзя! не факт что скомпилируется, и будет работать, но мало ли…

p.s. главное что бы ком порт был открыт, а потом подача питания была через усб! и все должно работать!)))
или без открытия порта…

Это проделки эмулятора терминала - он дрыгает DTR-ом при запуске.

Я бы на месте ТСа начал с отладки демо кода, который он сам же и запостил в начале. И добивший устойчивой передачи демо-данных стал бы прикручитьвать реальный даллас.

ошибок или не доделок там еще хватает, но главное я предложил веселое решение!))) а то еще скажут что скучно…)))

тут бы еще не помешал sdr приемник, что бы видеть когда и что идет. Еще и радиомодули не всегда друг друга видят. Т.е их само по себе надо отладить, сконектить. Может быть я лишь пишу прописные истины и все эти вопросы уже решены. Но так как код пишется из-за угла с помощью согнутого дула, то, наверняка, самое интересное еще впереди. Так что ТСу терпения и удачи.

Привет всем, как и обещал протестировал последний код от BABOS а таже и предыущий(мною доработанный) оба кода работают прекрасно только на модуле с прошивкой ESP8266_NoOS . Всем спасибо кто принимал участие в дописании кода.

1 лайк

Ну, ок, Теперь осталось собрать это все до кучи, поставить батарейки и насладиться продолжитльеными измерениями. Кстати, с ds18b20 был такой нюанс, что датчик должне быть подключен к пину МК проводами не менее 10см или около того.