Передачтик на 433mHz с постоянной отправкой команды ( огромный расход )...

Misha87
Offline
Зарегистрирован: 10.06.2015

Всем привет. Пишу здесь в надежде на то,что кто-то сможет помочь (посоветовать), что поправить или может быть вообще изменить скетч.... Не иду в раздел "Ищу исполнителя" потому что, во-первых мне это не прям уж так необходимо,а во-вторых,увлекаюсь этим делом и хотел бы с вашей помощью разобраться,сам уже многое смотрел и читал,но догнать никак не могу((( Короче принцип действия устройства такой -- передатчик на 433 mHz в паре с atmega8 раз в 3 сек шлет команду на включение исполнительного устройства (на другом конце приемник на 433mHz с которым проблем нет,так как питается от сети), передатчик же питается от аккумулятора телефона (3,7 v 450mA/h)....Так вот проблема вся в том,что заряда хватает только на сутки (ну может чуть больше).... Скетч брал готовый (где работал он по принципу: Нажал кнопку -- Команда отправилась),немного его изменил и стало работать как мне надо,но как и говорил раньше,очень быстро садится аккумулятор....Прошу подсказать,что  не так в коде. Может его изменить,а может и вовсе написать по новой....Буду признателен за все,критика тоже принимается))) Вот сам код скетча...



/*
SimpleSend
This sketch transmits a short text message using the VirtualWire library
connect the Transmitter data pin to Arduino pin 12
*/

#include <VirtualWire.h> //название библиотеки должно быть заключено в угловые скобки <>

int switchPin = 8;
int power = 10;

void setup()
{
pinMode(switchPin, INPUT);
pinMode(power, INPUT);

// Initialize the IO and ISR
vw_setup(2000); // Bits per sec
}


void loop(){
digitalWrite(power, HIGH);
   if (digitalRead(switchPin) == HIGH)
    {
    send("on");
    }
digitalWrite(power, LOW);
delay(3000);
}

void send (char *message)
{
vw_send((uint8_t *)message, strlen(message));
vw_wait_tx(); // Wait until the whole message is gone
}

 

Focus
Offline
Зарегистрирован: 05.04.2015

а чего на пинах 8 и 10 висит?

3 секунды там какой +- ?

А если усыплять мк и отрубать питание от передатчика (например запитав его от пина мк, сколько жрёт передатчик?) и будить по таймеру? Хватит ли времени передатчику "очухаца" при включении - хз.

Сам такое не делал, но вроде видел что так можно :)

Вобщем просто идею закинул :)

Misha87
Offline
Зарегистрирован: 10.06.2015

Изначально в коде было прописанно,что при поступлении сигнала HIGH на вход 8, отправляется команда отправить сигнал....Так вот я добавил выход 10 (ошибка в коде,вместо INPUT, должно быть OUTPUT), кторый питает передатчик.....Теперь получается так...

В цикле сперва подается питание на передатчик, потом идет проверка,что на 8 пине HIGH и если это так,то отправляется команда....Выключаетя 10 пин....Пауза в 3 сек....И снова все по кругу....

Focus
Offline
Зарегистрирован: 05.04.2015

Логичней сперва проверять кнопку и уж потом подавать питание на передатчик.

А, тоесть по нажатию на кнопку (и удерживании) на 8 пине, передатчик должен слать сигнал каждые 3 секунды? А если отпустить кнопку - то ваще ничё не делать?

 

Misha87
Offline
Зарегистрирован: 10.06.2015

в том то и дело,что кнопку проверять не вариант,потому что она всегда нажата....вот и  получается,что каждые 3 секунды, контроллер проверяет,есть ли сигнал на 8 пине (а он там всегда есть)))) и потом подает питание на 10 пин (то есть питание передатчика)...Ну и передатчик включается и отправляет команду....

Focus
Offline
Зарегистрирован: 05.04.2015

Ну тогда уводить в слип и будить периодически по таймеру.

почитайте про:

  • SLEEP_MODE_IDLE:     15 mA
  • SLEEP_MODE_ADC:     6.5 mA
  • SLEEP_MODE_PWR_SAVE: 1.62 mA
  • SLEEP_MODE_EXT_STANDBY: 1.62 mA
  • SLEEP_MODE_STANDBY :   0.84 mA
  • SLEEP_MODE_PWR_DOWN :  0.36 mA 

Ну ещё светодиод отпаять на плате МК если есть :)

А питание как подаёте? 3.7в прямо на ногу мк?

Misha87
Offline
Зарегистрирован: 10.06.2015

светодиода нет....используется голая atmega8

toc
Offline
Зарегистрирован: 09.02.2013

Misha87,
1. кладезь знаний по экономии питания на мк http://www.gammon.com.au/power
2. зачем каждые 3 секунды что-то отправлять? исполнительное устройство может само что-то делать?

Misha87
Offline
Зарегистрирован: 10.06.2015

Я не знаю в чем причина .... Сейчас вот сижу и меряю потребляемый ток. С кодом,который я здесь скинул,потребление atmega8 при питании от 5вольт составляет 5,5 мА.... Для интереса поменял в коде время с 3сек на 10сек....Ничего вообще не изменилось((( Вроде потребление маленькое,а аккумулятор сажает за сутки (вчера зарядил аккум 3,7 вольт 470 мА.ч включил устройство в 7вечера и вот сейчас уже почти 7вечера,то есть прошли сутки и аккум почти сел в ноль.....Куда копать,понятия не имею.....

Misha87
Offline
Зарегистрирован: 10.06.2015

Причем самое интересное,что такое потребление что с подключенным передатчиком,что без передатчика....Странная хрень какая-то....Что думаете на этот счет?

Focus
Offline
Зарегистрирован: 05.04.2015

замеряй без delay, пусть постоянно передаёт

Misha87
Offline
Зарегистрирован: 10.06.2015

Замерил....15мА

Misha87
Offline
Зарегистрирован: 10.06.2015

То ли у меня мультиметр врет,то ли что.....Но сейчас заново все проверил и реально пока выполнятеся delay потребление патает до 5мА, а в момент оправки подскакивает аж до 25-30мА....

Focus
Offline
Зарегистрирован: 05.04.2015

Может оно в момент включения питания жрёт, можно попробовать не отключать питание от передатчика, ну так... в целях експеремента :)

По настоящему помочь сможет только усыпление и пробуждение по таймеру

Misha87
Offline
Зарегистрирован: 10.06.2015

Сейчас попробовал по-другому....Реально потребление зависит от передатчика....То есть отключил передатчик и потребление стало 5мА и не менялось несмотря на то,что в коде есть delay, как только подключил передатчик, на момент его включения ток потребления становится 25-30мА

Misha87
Offline
Зарегистрирован: 10.06.2015

Получилось загнать мегу в режим сна, потребление мизерное.... Но как потом мегу разбудить, не могу сообразить... Внешнее пребывание мне не подходит, только по таймеру нужно, но не получатся (((

toc
Offline
Зарегистрирован: 09.02.2013

ссылку я дал выше, там "Waking from sleep with a timer"

Misha87
Offline
Зарегистрирован: 10.06.2015

Не могу разобраться,подскажи если не трудно,очень нужно

 

Misha87
Offline
Зарегистрирован: 10.06.2015

Попробовал вот этот код

#include  <avr/sleep.h>
#include  <avr/wdt.h>

const byte LED = 9;
  
// watchdog interrupt
ISR (WDT_vect) 
{
   wdt_disable();  // disable watchdog
}  // end of WDT_vect
 
void setup () { }

void loop () 
{
 
  pinMode (LED, OUTPUT);
  digitalWrite (LED, HIGH);
  delay (50);
  digitalWrite (LED, LOW);
  pinMode (LED, INPUT);
  
  // disable ADC
  ADCSRA = 0;  

  // clear various "reset" flags
  MCUSR = 0;     
  // allow changes, disable reset
  WDTCSR = bit (WDCE) | bit (WDE);
  // set interrupt mode and an interval 
  WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP1);    // set WDIE, and 1 second delay
  wdt_reset();  // pat the dog
  
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();
 
  // turn off brown-out enable in software
  MCUCR = bit (BODS) | bit (BODSE);
  MCUCR = bit (BODS); 
  sleep_cpu ();  
  
  // cancel sleep as a precaution
  sleep_disable();
  
  } // end of loop

На ардуино нано работает,на голой меге8 не хочет((((

spc
Offline
Зарегистрирован: 09.06.2015

А что именно не хочет? Не засыпает, или не компилируется? Если второе, то к примеру, когда я на подобном коде учился усыплять ATtiny85, то выяснил, что не WDTCSR, а WDTCR.

Итоговое потребление конструкции с акселерометром и вибромотором в режиме сна - около 4 мкА, в активном режиме - до 2 мА. С передатчиком, конечно, будет больше, но это просто, чтобы понимать порядок.

Пользовался вот этим:

Усыпление: http://donalmorrissey.blogspot.ru/2010/04/sleeping-arduino-part-5-wake-up-via.html

Отключение ADC: http://www.technoblogy.com/show?KX0

Misha87
Offline
Зарегистрирован: 10.06.2015

не компилится

spc
Offline
Зарегистрирован: 09.06.2015

"Сонный" код из первой ссылки (http://donalmorrissey.blogspot.ru/2010/04/sleeping-arduino-part-5-wake-up-via.html) компилируется в Arduino 1.6.5 при выборе платы Arduino NG.

Попробуйте, посмотрите, сколько будет потреблять. Если порядка 300 мкА в режиме сна, добавьте отключение ADC.

Misha87
Offline
Зарегистрирован: 10.06.2015

Попробовал...Процессор выбираешь Atmega8 и опять же не компилится

spc
Offline
Зарегистрирован: 09.06.2015

Да, моя ошибка - не заметил выбор процессора. Вот еще тогда:

http://www.surprisingedge.com/low-power-atmegatiny-with-watchdog-timer/

Misha87
Offline
Зарегистрирован: 10.06.2015

Блин,ну никак не могу разобраться.....

Misha87
Offline
Зарегистрирован: 10.06.2015
//****************************************************************
/*
 * Watchdog Sleep Example 
 * Demonstrate the Watchdog and Sleep Functions
 * Photoresistor on analog0 Piezo Speaker on pin 10
 * 
 
 * KHM 2008 / Lab3/  Martin Nawrath nawrath@khm.de
 * Kunsthochschule fuer Medien Koeln
 * Academy of Media Arts Cologne
 
 */
//****************************************************************

#include <avr/sleep.h>
#include <avr/wdt.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

int nint;
int pinLed=13;
int pinPiezoSpeaker=10;

volatile boolean f_wdt=1;

void setup(){

  Serial.begin(38400);
  pinMode(pinLed,OUTPUT);
  pinMode(pinPiezoSpeaker,OUTPUT);
  Serial.println("nightingale");

  // CPU Sleep Modes 
  // SM2 SM1 SM0 Sleep Mode
  // 0    0  0 Idle
  // 0    0  1 ADC Noise Reduction
  // 0    1  0 Power-down
  // 0    1  1 Power-save
  // 1    0  0 Reserved
  // 1    0  1 Reserved
  // 1    1  0 Standby(1)

  cbi( SMCR,SE );      // sleep enable, power down mode
  cbi( SMCR,SM0 );     // power down mode
  sbi( SMCR,SM1 );     // power down mode
  cbi( SMCR,SM2 );     // power down mode

  setup_watchdog(7);
}

byte del;
int cnt;
byte state=0;
int light=0;


//****************************************************************
//****************************************************************
//****************************************************************
void loop(){


  if (f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    f_wdt=0;       // reset flag

    light=analogRead(0);  // reading photoresistor
   
    Serial.print("light: " );
    Serial.println(light );

    switch (state){
    case 0:     // waiting for dawn
      if (light < 500) {  // light threshold
        state=1;
      }
      break;
    case 1:  // waiting for dusk
      if (light > 800)  { // light threshold
        state=0;
        whistle();
      }
      break;
    }

    nint++;
    digitalWrite(pinLed,1);  // let led blink

    Serial.print("Sleep " );
    Serial.println(nint );
    delay(2);               // wait until the last serial character is send
    digitalWrite(pinLed,0);


    pinMode(pinLed,INPUT); // set all used port to intput to save power
    pinMode(pinPiezoSpeaker,INPUT); // set all used port to intput to save power

    system_sleep();

    pinMode(pinLed,OUTPUT); // set all ports into state before sleep
    pinMode(pinPiezoSpeaker,OUTPUT); // set all ports into state before sleep


  }

}
//****************************************************************  
// put some whiste sound on piezo
void whistle() {
for (int ii = 0; ii<= 20; ii++) {  
  for (del=0; del <=254; del++) {
  digitalWrite(pinPiezoSpeaker,0);
  delayMicroseconds((ii*5)+(del * 2));
  digitalWrite(pinPiezoSpeaker,1);
  delayMicroseconds((ii*5)+(del * 2));
  }
  PORTB ^= 32;  // toggle pinLed
}
  
}

//****************************************************************  
// set system into the sleep state 
// system wakes up when wtchdog is timed out
void system_sleep() {

  cbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter OFF

  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
  sleep_enable();

  sleep_mode();                        // System sleeps here

    sleep_disable();                     // System continues execution here when watchdog timed out 
    sbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter ON

}

//****************************************************************
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {

  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;
  Serial.println(ww);


  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCSR = bb;
  WDTCSR |= _BV(WDIE);


}
//****************************************************************  
// Watchdog Interrupt Service / is executed when  watchdog timed out
ISR(WDT_vect) {
  f_wdt=1;  // set global flag
}

Вот даже такой готовый код нашел и он тоже на мегу8 не заливается

Misha87
Offline
Зарегистрирован: 10.06.2015

Изменил кое-что в коде,заработало....Правда значения на мультиметре скачут как-то странно....0.06mA(секунд 5)--->2.00mA(на секунду где-то)---->10.00mA(на секунду) и все по кругу....

Misha87
Offline
Зарегистрирован: 10.06.2015

Залил на рабочую схему, буду проверять насколько хватит аккумулятора.... Сейчас пока заряжаю))) Если все будет ок, скину изменения которые я сделал в скетче...

Misha87
Offline
Зарегистрирован: 10.06.2015

Зарядил аккумулятор 3.7в. 470мА/ч буквально за час и подключил к этой схеме. Уже вторые сутки подряд работает и заряд как был на месте, так и остался (правда не замерил напряжение на аккумуляторе, сужу просто по индикатору заряда) ....В общем походу все получилось)))) Надо будет потом еще на батарейке CR2032 попробовать, посмотреть на сколько её хватит....

usama
Offline
Зарегистрирован: 05.11.2017

Misha87 пишет:

Изменил кое-что в коде,заработало...

Привет!

А что именно изменил? Я уже который день бьюсь над этой ерундой. На 16 меге компилится, на 8:

error: 'WDTCSR' was not declared in this scope

error: 'SMCR' was not declared in this scope

error: 'WDIE' was not declared in this scope

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

Misha87 пишет:

светодиода нет....используется голая atmega8

Atmega 8 плохой выбор. Лучше Atmega 328, она меньше потребляет в разы, и напряжение можно снизить и частоты. Если используете загрузчик Arduino можно использовать режим Idle, из него микроконтроллер будет выходить сам каждую миллисекунду (таймер 1 включен всегда), можно зациклить и ждать обычным способом...