Энергосбережение и делитель напряжения
- Войдите на сайт для отправки комментариев
Втр, 31/03/2020 - 18:27
Делаю беспроводной датчик на улицу. К ардуино подключен датчик DHT22, NRF24 и делитель напряжения для замера заряда аккумуляторов. Датчик и нрф работают нормально, но делитель показывает какое то фуфло.
Код прилагаю.
#include <avr/wdt.h> #include <avr/sleep.h> #include <SPI.h> #include <RF24.h> #include <SimpleDHT.h> int pinDHT22 = 2; SimpleDHT22 dht22(pinDHT22); RF24 radio(7, 8); const uint32_t pipe = 123456789; void setup() { pinMode(0, INPUT); radio.begin(); delay(2000); radio.setDataRate(RF24_1MBPS); radio.setCRCLength(RF24_CRC_16); radio.setPALevel(RF24_PA_MAX); radio.setChannel(81); radio.setAutoAck(false); radio.powerUp(); radio.openWritingPipe(pipe); } void loop() { //------------------------------------- ЗАМЕРЫ ------------------------------------------------ float R1 = 30180.0; float R2 = 24300.0; int value = 0; float vout = 0.0; float vin = 0.0; float temperature = 0; float humidity = 0; float data[3]; dht22.read2(&temperature, &humidity, NULL); value = analogRead(0); vout = (value * 3.362) / 1024.0; vin = vout / (R2/(R1+R2)); if (vin<0.09) { vin=0.0;} //------------------------------------- ПОДГОТОВКА И ОТПРАВКА ПАКЕТОВ ----------------------------------- data[0] = ((float)temperature); data[1] = ((float)humidity); data[2] = (vin); radio.write(&data, sizeof(data)); //-------------------------------------- СОН ------------------------------------------------------------ wdt_enable(WDTO_1S); WDTCSR |= (1 << WDIE); ADCSRA &= ~(1 << ADEN); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); } ISR (WDT_vect) { wdt_disable(); f = !f; }
В строке 45 вместо первой / поставьте *
Поставил, но стало еще сильнее занижать. Без спячек все верно дудит, но со спячкой показывает 3,5в вместо 5. Заменил на *, стало 0.57.
Ну, формула, то всё равно неправильная скорее всего. Схему Вы не приложили, так что хрен Вас знает. что там за делитель, но если Вы читаете свою vout со средней точки делителя, а пытаетесь посчитать vin в верхней точке делителя, то формула не такая.
Uв = Uср * (R1+R2) / R2
Хотя, без схемы - это пальцем в небо.
Только что Вы собрались таким образом измерить? Кто Вам сказал, что напряжение питания у Вас именно 3.362 и оно будет оставаться таким всегда, даже по мере просадки батареи? Или у Вас там стабилизатор? Опять же ... без схемы ...
Вообще-то в таких случаях люди не используют левые константы типа 3.362, а измеряют напряжение своего питания здесь и сейчас, прямо во время работы. И уже от этого измеренного напряжения считают.
Ну, а про схему ... охреневаю, когда новички научатся задавать вопросы? Ну, ведь писали же в песочнице как это правильно делать. Кому писали? :-(
но если Вы читаете свою vout со средней точки делителя, а пытаетесь посчитать vin в верхней точке делителя, то формула не такая.
Uв = Uср * (R1+R2) / R2
строка 45. с точки зрения математике - тот-же ****** но в другой руке, вот только компилятор частенько имеет иное мнение.
желательно посчитать константы отдельно и загнать результат в новую переменную и посмотреть, чего компилятор насчитал...
Напряжение делителем меряю на аккумах. С акуммов питание идет на MCP1700 3v3. Опорное меряю на ноге vin атмеги. Опять же повторюсь, без спячки все показывает верно.
как вариант (не совсем уверен): RF24 еще не проснулся и сильно гадит вам в сеть - сделайте задержку после пробуждения более 5 сек лучше 10сек, а потом смотрите на результат
Спасибо, разобрался. На делителе контакт говенний бил.
Спасибо, разобрался. На делителе контакт говенний бил.
ГЫЫЫЫЫЫ :)))))))))))))))