И? Получается - это бессмысленная запись? А зачем она тогда?))
Может для:
И? Получается - это бессмысленная запись? А зачем она тогда?))
Может для:
Именно. На этих МК создаётся виртуальное соединение, и поэтому, если нужен Serial, после его объявления, требуется некоторое время создания и готовности объекта. Раньше во всех библиотеках, комментарий писали, типа совместимость с Leonardo.
ну тогда мы ТСа не туда отправили, у него скорее всего Atmega328 и после Serial.begin() сериал всегда true. И плата у него никак при открытии Монитора Порта перезагрузиться не может. Потому как ее rxtx перезагрузить, для этого как минимум dtr нужен.
Ты опять всё путаешь. Именно плата с мегой (нано/уно и тп) при открытии порта на ПК ресетится. А эта запись (в его случае) бессмысленна.
не уверен что я понимаю правильно работу кода, мне показалось просто программа работает только если открыт монитор порта,(это в коде указанно) ему ИИ помог так написать))) и следовательно не будет работать если не открыть порт… но может и показалось, надо собирать и смотреть…
еще интересно что будет если соединение вдруг пропадет)))
на каких-то платах может он и есть, но я цепляюсь переходником usb-uart за rx tx и читаю порт и вы считаете, что в этом случаете резет будет приоткрытии монитора?
Так это исключительно ваши проблемы. На всех платах, имеющих на борту USB-TTL конвертер, все нужное имеется
#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 . Всем спасибо кто принимал участие в дописании кода.
Ну, ок, Теперь осталось собрать это все до кучи, поставить батарейки и насладиться продолжитльеными измерениями. Кстати, с ds18b20 был такой нюанс, что датчик должне быть подключен к пину МК проводами не менее 10см или около того.