Jump to content
iT4iT.CLUB

All Activity

This stream auto-updates     

  1. Yesterday
  2. Last week
  3. Kitsum добрый день. Нас с коллегой заинтересовал ваш проект и мы успешно реализовали несколько станций на платформе как esp, так и на ноде. В процессе эксплуатации у нас возник перечень вопросов и пожеланий, которые хотелось бы обсудить с вами. 1. Почему при наличии свободного места на флеш, статистика датчиков: - хранится всего 1 день. - слетает после потери питания . Хотелось бы реализовать запись в энергонезависимую память данных на длительный срок. 2. Наблюдается проблема такого плана. Esp корректно отрабатывает подключение к wifi сети при обрыве питания, но в случае перезагрузки роутера, плата отказывается повторно подключаться к сети. 3. В связи с особенностью размещения некоторых датчиков встал вопрос их связи с платой посредством радиоканала. Хотелось бы предложить реализовать начинания в эту сторону. Спасибо.
  4. Earlier
  5. Насколько я понял, проблема с диапазоном 1...-1 в графиках скорее всего из-за этого: String sensors::clear(float value) { if ((int)value == 0) return "0"; else if (value - (int)value == 0) return String((int)value); else return String(value); }
  6. Приветствую. Появился такой вопрос, собрал схему с RFID все работает но когда подключаю самодельный солинойд на 12 вольт через реле, RFID перестает реагировать на открытие через 3 попытки. Откидываю соленойд, перезагружаю ардуино и опять все работает. Не могу разобраться в чем проблема. Помогите пожалуйста.
  7. приветствую а не подскажете, хотя бы направление , какие шаги нужно выполнить, чтобы можно добавить в метеостанцию работу с nrf24? как понял нужно добавить обработчик сюда void loop() { /* Обработчики */ wifi.handleEvents(); http.handleClient(); cron.handleEvents(); }
  8. передатчик потребляет в режиме сна около 3 мкА, при передаче данных раз в минуту довольно долго должен проработать
  9. в теме про метеостанцию писал про датчик с передатчиком на NRF24L01 и возможность использования с метеостанцией простой код приемника на esp // https://aterlux.ru/article/nrf24l01p #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line, для 20x4 - 0x3F //#include <SPI.h> //#include "nRF24L01.h" #include "RF24.h" int32_t data[5]; RF24 radio(99, 15); // CE, CSN, 99 - это заглушка, чтобы освободить один пин, если передача не предполлагается то можно CE просто подтянуть резистором к питанию, иначе нужно указать вывод void setup(void) { lcd.init(); lcd.backlight(); radio.begin(); radio.setAutoAck(true); // radio.setAutoAck(true); включение и ли отклучение автоподтверждения radio.setChannel(100); radio.setDataRate (RF24_2MBPS); // скорость обмена RF24_2MBPS, RF24_1MBPS, RF24_250KBPS - максимальная чувствительность на 250 кбитс, NRF24L01 без плюса 250 не умеет radio.setPALevel (RF24_PA_MAX); // уровень мощности RF24_PA_MIN -18dBm, RF24_PA_LOW -12dBm, RF24_PA_HIGH -6dBM, RF24_PA_MAX 0dBm radio.openReadingPipe(1, 0xAABBCCDD11LL); radio.startListening(); } void loop(void) { if(radio.available()){ // Если в буфере имеются принятые данные, то получаем номер трубы, по которой они пришли, по ссылке на переменную pipe radio.read( &data, sizeof(data)); } // Читаем данные в массив data и указываем сколько байт читать lcd.setCursor(0,0); lcd.print("Temp "); lcd.print(float(data[3])/100, 2); lcd.print(" "); lcd.print((char)223); lcd.print("C"); lcd.setCursor(0,1); lcd.print("Battery "); lcd.print(float(data[0])/1000,3); lcd.print(" v"); lcd.setCursor(0,2); // на некоторых 4 строчных дисплеях в 3 и 4 строке ноль сдвинут на 4 символа вправо, поэтому нулевой символ это -4 lcd.print("Packet N "); lcd.print(data[1]); delay (100); } код передатчика // тема на форуме - http://forum.ixbt.com/topic.cgi?id=48:12460&r=lYjQSTixmu#2 // библиотека для датчика BME280 - https://github.com/sergeyastakhov/BME280 (чтобы не было конфликтов с другими библиотеками, желательно ее разместить в папке скетча) // потребление всего модуля в power save - 2.0 мкА(из них NRF24 - 0.9 мкА), 1.1 мкА - atmega168 // обязательно параллельно батарейке доп емкость около 2200мкф 6.3 в - падение при передаче 10 мВ, ток утечки конденсатора после подформовки менее 100 нА, - http://forum.ixbt.com/topic.cgi?id=48:11468:3073#3073 // измерение напряжение батарейки с помощью измерения питания atmega // еще можно питать атмегу напрямую от лития и измерять ее напряжение, а NRF и BME280 питается от стабилизатора 3.3 вольта с маленькой утечкой, например mcp1700-3302, ток утечки около 1.5 мкА // I2C преобразователь уровней не нужен, главное чтобы подтягивающие резисторы I2C питались от 3.3 вольт // проблема с вотчдогом - http://arduino.ru/forum/apparatnye-voprosy/ne-mogu-vylechit-vatchdog-na-goloi-atmege328r-s-vnutr-taktirovaniem-8-mgts #include <avr/wdt.h> #include <avr/sleep.h> //#include <avr/power.h> #include "RF24.h" RF24 radio(9, 10); // CE_PIN, CSN_PIN byte count = 0; // счетчик количества просыпаний int32_t data[5]; // на данный момент используется int32_t чтобы иметь возможность получить большие числа счетчика передач, для тестирования продолжительности работы от батарейки, // потом можно обычный int // data 0 - данные АЦП или пересчитанное напряжение питания c тремя знаками(в милливольтах, на стороне приемника переменная float деленная на 1000 // data 1 - счетчик отправленных пакетов, сбрасывается при снятии питания // data 2 - P атмсомферное в мм, можно умножить на 10 если нужны десятые, тогда на стороне приемника делить на 10 и float // data 3 - Т температура умноженное на 100 на стороне приемника float делить на 100 // data 4 - H влажность умноженная на 100 #include "BME280.h" // при таком написании компилятор ищет библиотеку в первую очередь в папке скетча using namespace BME280; class CustomI2CProtocol : public I2CProtocol { public: virtual void init() { I2CProtocol::init(); Wire.setClock(400000); // частота работы I2C, 400 кГц - максимум для BME280, уже чувствительна к качеству и длине линии } // реальная частота I2C зависит от регистра и строки в wire.cpp - TWBR = ((F_CPU / frequency) - 16) / 2 и при частоте 8 МГц она ниже, около 250 кГц // https://www.avrfreaks.net/forum/twi-clock-divider?name=PNphpBB2&file=viewtopic&t=79562 }; BME280Sensor bme280 = BME280Sensor(new CustomI2CProtocol()); //BME280Sensor bme280 = BME280Sensor(new I2CProtocol()) - I2C работает на частоте по умолчанию - 100 кГц ISR (TIMER2_OVF_vect) { // из прерывания по таймеру 2 нельзя выходить слишком быстро, поэтому инкрементирование переменной расположим здесь count++; } void setup() { MCUSR = 0; // необходимо при использовании вотчдога для сброса контроллера при зависании на выпонении кода wdt_disable(); // иначе при первом сбросе вотчдогом, будет установлено минимальное время вотчдога 0.15 с, и мк зависнет на этом цикле PORTC |= (1 << PC1); // включение светодиода, для индикации запуска мк delay(10); DDRB = 0b11000001; // настраиваем неиспользуемые выводы(и порты) на выход DDRC = 0b11111111; DDRD = 0b11111111; //clock_prescale_set(clock_div_2); // деление тактовой частоты для получения 4 МГц для работы atmega168 вплоть до 1.8 вольта bme280.init(false); bme280.setHumidityMode(Over_1); // установка режима измерения влажности, остальные при запуске измерения //bme280.setMode(Forced, Over_1, Over_1, Over_1); // Forced - однократный режим измрения, все оверсемплинги(T, P, Hum) = 1 PRR = (1<<PRTIM1) | (1<<PRUSART0); // отключаем неиспользуемую периферию, (1<<PRTIM2) - работает в асинхронном режиме // (1<<PRTIM0) - так не работает передача, видимо count использует этот таймер // (1<<PRSPI), (1<<PRTWI)- не отключаем, SPI - для NRF24 и TWI(по другому I2C) - для BME280 radio.begin(); radio.setAutoAck(true); // подтверждение приема, true - включено, false - отключено radio.setRetries (2, 1); // количество попыток передачи если включен режим автоподтверждения приема, первая цифра - задержка между передачами, 1 = 250 мкс, вторая - количество попыток передачи radio.setChannel(100); // номер канала, можно перед выбором просканировать эфир чтобы выяснить менее зашумленные каналы(использовать скетч scanner из библ. RF24) radio.setDataRate (RF24_2MBPS); // скорость обмена RF24_2MBPS, RF24_1MBPS, RF24_250KBPS - максимальная чувствительность на 250 кбитс radio.setPALevel (RF24_PA_MAX); // уровень мощности RF24_PA_MIN -18dBm, RF24_PA_LOW -12dBm, RF24_PA_HIGH -6dBM, RF24_PA_MAX 0dBm radio.openWritingPipe (0xAABBCCDD11LL); // уникальный номер передатчика, на приемнике должен быть такой же ADCSRA = 0; // отключаем АЦП ACSR |= (1<<ACD); // отключаем компаратор ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // настраиваем АЦП на измерение собственного напряжения питания, опорное 1.1 вольт DIDR0 = 1; // отключаем цифровой вход выводов АЦП, он тоже немного потребляет ASSR |= (1<<AS2); // Асинхронный режим TCCR2A = (0<<WGM21)|(0<<WGM20); //режим normal TCCR2B = (1<<CS22)|(1<<CS21)|(1<<CS20); // clk/1024 TCNT2 = 0x00; // начальное значение таймера // OCR2A = 0x00; OCR2B = 0x00; TIMSK2 |= (1 << TOIE2); // разрешаем прерывание по переполнению Т2 SMCR = _BV(SM1) | _BV(SM0); // Power_Save, set_sleep_mode(SLEEP_MODE_PWR_SAVE), set_sleep_mode (SLEEP_MODE_PWR_DOWN) - выбор режима сна radio.powerDown(); PORTC &= ~_BV(PC1); // выключение светодиода } void loop() { if ( count >= 8 ) { // передавая один раз в 64 секунды = 8 radio_(); TCNT2 = 0x00; } while(ASSR&(1<<TCN2UB)){;} //wait to TCNT update!!! TCNT2 = 0x00; sleep_enable(); //SMCR |= _BV(SE); sleep_cpu (); } void radio_() { wdt_enable(WDTO_1S); radio.powerUp(); data[1]++; ADCSRA |= _BV(ADEN); // включаем АЦП Measurement measurement = bme280.readMeasurement(); // опрос датчика и расчет параметров data[2] = (measurement.getPressure32()*1000/133322); data[3] = (measurement.getTemperature()*100); data[4] = (measurement.getHumidity()*100); bme280.setMode(Forced, Over_1, Over_1); // запуск однократного измерения и установка оверсемплингов T, P, без влажности //bme280.setMode(Forced, Over_1, Over_1, Over_1); // запуск однократного измерения и установка оверсемплингов T, P, Hum ADCSRA |= _BV(ADSC); // запуск конверсии while (bit_is_set(ADCSRA,ADSC)); // измерение uint8_t low = ADCL; // сначала читаем ADCL - это расблокирует чтение ADCH uint8_t high = ADCH; int volt = (high<<8) | low; // данные АЦП data[0] = (1135494/volt); // 1135494 подобрано эксперементально и в общем случае равно 1100 милливольт опорное * 1024, но опорное не всегда 1100 мВ ADCSRA = 0; // отключаем АЦП // ******************************************** // код до этого места примерно 1700 мкс, убираем в файле RF24.cpp задержку delay(5) и добавляем перед отправкой данных // задержку в 2.3 мс, чтобы в сумме задежка получилась 4 мс, это минимальная задержка от команды powerUp() до write() // при которой стабильно работает большой модуль на RF24, smd модуль работает и при меньшей задержки, т.к. разные кварцы clock_prescale_set(clock_div_256); // на время задержки снижаем частоту контроллера до минимально возможной, для снижения энергопотребления delayMicroseconds(10); // на этой частоте для получения 2.3 миллисекунд нужно указать задержку в 256 раз меньше ~ 9 мкс // в этом режиме потребляет только atmega, которая работает на частоте 1/256 от номанальной clock_prescale_set(clock_div_1); // перед отправкой данных снова устанавливаем исходную частоту работы контроллера radio.write(&data, sizeof(data)); radio.powerDown(); count = 0; wdt_disable(); }
  10. Странно, но не работает. Попробую тестовый датчик с диапазоном в -1 ... 1
  11. BME280, BME280I2C.h. Сам датчик показывает правильно. Если присмотреться на картинке с графиком на фоне видно отрицательное значение температуры.
  12. @IvAn какой датчик температуры Вы используете и с какой библиотекой?
  13. можете выполнить разработку модуля на BME-280 для нашего манометра МО-05 почта 

    info@gidrogaz.ru

     

  14. Снимать долго. Стоит в доме на чердаке. Проще градусов 10 вычесть, но чистота эксперимента пропадет. Тестовый то датчик правильно заработал.
  15. Положите его в морозилку, результат будет доступен быстрее
  16. Тестовый программный сенсор нормально работает. Буду ждать минусовых температур. Посмотрю, повторится ли глюк, или это один раз так получилось.
  17. Доброе время суток WiFi имеет много настроек и стандартов, начиная от стандартов заканчивая каналом (частотой). Я бы посоветовал проверить настройки маршрутизатора с которым получилось установить связь и продублировать их на маршрутизаторе с которым возникли проблемы. Это весьма странно. Я взял тестовый программный сенсор и проверил на нем, воссоздать не получилось. Давайте разбираться. Добавьте следующий датчик в Ваш код. sensors.add(new knob_t(-100, 100, "1", "Test", "???"), "test", [&](){ return random(-100, 10); } , true); Дайте ему поработать, посмотрите, что будет за график. В моем случае все выглядело так.
  18. Подключил я все таки станцию к 4g интернету Билайн. Пришлось перепрошить роутер TL-WR741ND на прошивку DD-WRT, затем подключить этот роутер по WiFi в режиме "Клиент" к 4g Wifi роутеру MR150-2. В роутере WR741nd создана подсеть WiFi, к этой сети подключена погодная станция. Все заработало !!! Может, кому нибудь этот "лайфхак" поможет решить похожую проблему.
  19. У меня через 4G от билайна работает. На графиках перестали показываться отрицательные значения после последнего обновления. Где поискать?
  20. Дополнение. Подключил погодную станцию к домашнему WiFi роутеру, в который заведен проводной интернет от Билайна. Станция отлично работает, отсылает данные и на Tingspeak и на Народный мониторинг. Попробовал подключить через 4G WiFi роутер станцию к 4g интернету Tele2, станция НЕ работает. И с Билайном не работает. 4G WiFi роутеры пробовал MR 150-2, две штуки, с разными прошивками, на другие устройства интернет с роутеров раздается, станция работать не хочет. Что делать, ума не приложу (((
  21. Приветствую всех. На предыдущей прошивке погодная станция с одним детчиком BME-280 и платой esp8266 как у автора темы работала нормально через роутер TPlink WR 741, который подключен в режиме WDS (повторителя) к 4G WiFi роутеру MR-150, оператор Билайн. Без повторителя, если напрямую подключать станцию к 4G роутеру, станция в интернет выйти не могла. Прошил плату на последнюю прошивку. Прошивку брал из архива, в котором Arduino ide 1.8.10, архив скачивал по ссылке в этой теме из облака автора темы. Как точка доступа станция работает нормально. К 4g роутеру станция подключается, но в интернет не выходит и не пингуется. Все остальные устройства, подключенные к 4G роутеру, режим DHCP на 4g WiFi роутере включен (это 2 телефона на Android, медиаплеер на Android, ноутбук на Win10, все интернет видят и получают). Если станцию настроить для подключения к роутеру -повторителю, который подключен к 4G роутеру, то станция подключается к сети роутера- повторителя, пингуется один раз или вообще не пингуется и интернета не видит. Я не пойму, или провайдер поставил какие-то фильтры на траффик именно модуля esp-8266 как раз сразу в то время, как я обновил прошивку, или в прошивке ошибка? У всех на последней прошивке, которая в 2020г. обновлена, все нормально?
  22. так работает Serial.println("temp:"); Serial.println(weather.temp); Serial.println("humidity %:"); Serial.println(weather.humidity); Serial.println("pressure hPa:"); Serial.println(weather.pressure); Serial.println("pressure mmHg:"); Serial.println(weather.pressure * 0.75); Serial.println("wind's speed m/s:"); Serial.println(weather.speed); Serial.println("wind's direction:"); Serial.println(weather.deg); а так нет Serial.printf("temp: %d celsius\n", round(weather.temp)); Serial.printf("humidity: %d %\n", round(weather.humidity)); Serial.printf("pressure: %d hPa or %d mmHg\n", round(weather.pressure), round(weather.pressure * 0.75)); Serial.printf("wind's speed: %d\n", round(weather.speed)); Serial.printf("wind's direction: %d\n", round(weather.deg));
  23. добрый день! Спасибо автору за его работу! но есть вопрос. после конекта к серверу получаем ответ в строке все ок. а ниже данных нет... 20:17:03.961 -> Connecting failed, error: connection refused 20:17:09.148 -> Connecting successfully, code: 200 20:17:09.353 -> {"coord":{"lon":37.89,"lat":51.31},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"base":"model","main":{"temp":-11.22,"feels_like":-16.93,"temp_min":-11.22,"temp_max":-11.22,"pressure":1026,"humidity":83,"sea_level":1026,"grnd_level":999},"wind":{"speed":3.46,"deg":12},"clouds":{"all":9},"dt":1581182214,"sys":{"country":"RU","sunrise":1581137765,"sunset":1581172150},"timezone":10800,"id":487928,"name":"Staryy Oskol","cod":200} 20:17:09.386 -> 20:17:09.386 -> Weather 20:17:09.386 -> id: 800 20:17:09.386 -> main: Clear 20:17:09.386 -> description: clear sky 20:17:09.386 -> icon: 01n 20:17:09.386 -> temp: 0 celsius 20:17:09.386 -> humidity: 0 20:17:09.386 -> pressure: 0 hPa or 1083181056 mmHg 20:17:09.386 -> wind's direction: 0 20:17:09.386 ->
  24. Доброе время суток. @see по поводу измерения скорости ветра. Да, в Arduino IDE есть баг, точно не проверял, но вроде на версиях выше 2.5.2 прерывания могут вызывать падения программы (любой). Проверил на чистом проекте, в котором были только прерывания и вывод в Serial. Не буду ходить вокруг да около, по итогу внес небольшие правки в код. Для эксперимента используйте архив с средой разработки опубликованный на Yandex диске, ссылка в загрузках. Используйте код опубликованный в исходниках, в файле users_wspeed.h Первым делом определитесь с используемым портом, допустим это GPIO14 (D5). Укажите этот порт в users_wspeed.h #define windSpeed_Pin 14 // GPIO микроконтроллера к которому подключен чашечный анемометр В основном файле закомментируйте подключения всех пользовательских файлов кроме users_wspeed.h //#include "users_auto.h"; // Пользовательская конфигурация датчиков, именно тут описывается с какими датчиками работать //#include "users_bme280_x2.h"; // Пример для двух датчиков BME280 //#include "users_ds18.h"; // Пример для датчиков DS18B20 #include "users_wspeed.h"; // пример для самодельного анемометра В основном файле закомментируйте функцию в которой также задействован порт GPIO14 // gpio_14(); // Расхождение расчетной абсолютной влажности между показаниями с двух датчиков, например, BME280 Далее соберите проект и загрузите на микроконтроллер. Убедитесь в работоспособности кода, обновляйте страницу, делайте всяческие проверки. Только после этого вносите дополнительные правки, которые Вам нужны. Я проверил код для датчика скорости ветра на живом контроллере, все работает. К сожалению, не совсем могу понять, Вы используете другой проект? Если это так, вы пробовали связываться с его автором, есть ссылка на проект? пробовали ли Вы просто работать с этими датчиками, не интегрируя их в чужой код? Рад, что у Вас все получилось. Исправления добавлены в код.
  25. @Kitsum , приветствую Вас! Исправил по Вашей рекомендации, согласно второму пункту, все работает как надо! Моя благодарность! 🤗
  26. Добрый день. Имею в наличии ESP8266 NodeMcu V2 и V3, датчик СО2 "MH-Z19B" и датчик влажности и температуры АМ2301(2 шт.). Есть задачи 1) контролировать уровень СО2 в помещении с автоматическим включением приточного вентилятора при заданных мин и макс параметрах 2) контроль температуры и влажности как внутри помещения так и снаружи 3) получать и управлять данными с датчиков через интернет (выставления мин и макс параметров) Сам не разу не программер, помогаю дочке писать диплом, сам учусь). Из всех сборок заработала "arduino-1.8.9-esp" портативная, уж не знаю как мы вместе с ней смогли залить на устройство и хотя бы убедиться в работоспособности оборудования (без датчиков). Дальше в теории понимаю что надо скачать библиотеки для датчиков и в коде назначит пины для вывода информации. А вот что и как.....больше не могу понять, затупил совсем. Помогите разобраться пожалуйста!
  1. Load more activity
×
×
  • Create New...