interrupt con virtualwire

leo72:

leo72:
Come li hai collegati esattamente?

Chiedevo i collegamenti fisici, ossia quali pin hai collegato con quali.

vcc e gnd ai relativi della batteria (4 stilo da 1,2 V)
il pin vicino a vcc, ossia pin 2 al rx.
il pin successivo, ossia il pin 1 ad un led
quando mi arriva un segnale si dovrebbe accendere il led.

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

unsigned long currentMillis;
unsigned long previousMillis=0;
unsigned long interval = 1000;

char allarme = '0';  //allarme
char statoAllarme = '0';  //stato allarme

void setup()
{ 
  pinMode(1, OUTPUT);   //led red
  vw_set_rx_pin(2);
  vw_setup(2000);
  attachInterrupt(0, wakeUpNow, RISING); 
}
void wakeUpNow() 
{ 

}
void sleepNow() 
{
  ADCSRA = 0;   // disable ADC;
  set_sleep_mode (SLEEP_MODE_PWR_DOWN); 
  sleep_enable();
  attachInterrupt(0, wakeUpNow, RISING);
  sleep_mode();

  sleep_disable();
  detachInterrupt(0); 
}
void loop()
{
  //sleepNow();
  currentMillis = millis();
  riceve();

  if ( allarme == '1' && statoAllarme == '0' )
  {
    digitalWrite(1, HIGH); //led green
   // tone(1,522);
    statoAllarme = '1';
    previousMillis = currentMillis;  
  }
if (statoAllarme == '1')
{
  if ( currentMillis - previousMillis > interval )
  {
    
    digitalWrite(1, LOW); //led green
    allarme = '0';
   // noTone(1);
  } 
}
  if ( allarme == '2' )
  {
    digitalWrite(1, LOW); //led green
    //noTone(1);
    statoAllarme = '0';
  }

} // fine loop

void riceve() 
{ 
  uint8_t buflen = 1 ;
  uint8_t buf[1];
  vw_rx_start();

  if( vw_get_message(buf, &buflen) )
  {
    allarme = (char)(buf[0]);   
  }
}

provato con arduino micro e funziona

Faster: ... Come posso controllare se effettivamente ho cambiato i fuse?

Con AVRDUDE (che è quello che di nascosto usa l'IDE) ... ... io lavoro su Mac ed ho un programma che mi fa da GUI, AVRFUSES ... ne esiste una vecchia versione per Win, ma probabilmente, su quella piattaforma, si trova qualche cosa di più aggiornato ;)

Guglielmo

Edit : Per Win prova a guardare QUI

Faster: vcc e gnd ai relativi della batteria (4 stilo da 1,2 V) il pin vicino a vcc, ossia pin 2 al rx. il pin successivo, ossia il pin 1 ad un led quando mi arriva un segnale si dovrebbe accendere il led.

Quel programmatore ha bisogno di collegare il chip via ISP, se apri lo schema : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/AVR/Tiny_Programmer_v11.pdf

prendi i pin MOSI/MISO/SCK/RST dal connettore e collegali ai corrispondenti pin del Tiny85 (nell'ordine il pin 5/6/7/1 se non ricordo male). Poi collega anche l'alimentazione (VCC e GND ai pin 8 e 4, se non ricordo male). A questo punto programmi lo sketch.

ok intanto grazie.
allora ho scaricato AVRFUSES
in Programmer (-c) posso scegliere anche usbtiny, però non mi da nessuna porta, ho provato a mettere COM5 (che è la porta USB riconosciuta quando collego arduino uno) ma:
avrdude.exe: Error: Invalid -P value: ‘COM5’
Use -P usb:bus:device

quidi per utilizzare sto usbtiny che porta devo mettere?

inoltre non ho capito:
prendi i pin MOSI/MISO/SCK/RST dal connettore e collegali ai corrispondenti pin del Tiny85 (nell’ordine il pin 5/6/7/1 se non ricordo male). Poi collega anche l’alimentazione (VCC e GND ai pin 8 e 4, se non ricordo male). A questo punto programmi lo sketch.

quale connettore? di chi?
programmo lo sketch con arduino ide? Programmatore → arduino a ISP?
cosi facendo come entra in gioco AVRFUSES?

1.jpg

Faster: ... allora ho scaricato AVRFUSES ...

Ehi ... l'immagine che hai postato riporta AVRDUDESS ... che fai "bari" ??? XD XD XD

Ti sei letto sul sito TUTTE le domande e le risposte ??? ... perché ne vedo una che dice :

"The port drop down only lists available serial ports, for non-serial ports like usb and parallel you need to manually type it in to the box."

e ci sono delle spiegazioni ;)

Guglielmo

gpb01:

Faster: ... allora ho scaricato AVRFUSES ...

Ehi ... l'immagine che hai postato riporta AVRDUDESS ... che fai "bari" ??? XD XD XD

Ti sei letto sul sito TUTTE le domande e le risposte ??? ... perché ne vedo una che dice :

"The port drop down only lists available serial ports, for non-serial ports like usb and parallel you need to manually type it in to the box."

e ci sono delle spiegazioni ;)

Guglielmo

ho letto ma non ho trovato la soluzione..... OK dovevo mettere usb come porta ora è settato a 8mhz? perchè come metto un delay non funziona

digitalWrite(3,HIGH);
    delay(400);
    digitalWrite(3,LOW);

resta sempre acceso

allora dopo altre mille prove sono giunto:
il problema è:

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

int led=0;
int sensore;
int stato = 0;
char *a="11";
char *b="10";

void setup() 
{
//  Serial.begin(9600);
  pinMode(led, OUTPUT);   // led
  pinMode(2, INPUT);     // sensore

  vw_set_tx_pin(1);    // Arduino pin to connect the receiver data pin
  vw_setup(1000);      // bps connection speed
}

void wakeUpNow() 
{ 
}

void sleepNow() 
{
  ADCSRA = 0;   // disable ADC
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();
  attachInterrupt (0, wakeUpNow, LOW); 
  sleep_mode (); 

  sleep_disable();
  detachInterrupt (0);  
}

void loop()
{   
  sleepNow();
  sensore = digitalRead(2);

  if (sensore == LOW  &&  stato == 0)
  {  
    invio(a);
    stato = 1;
    digitalWrite(led, HIGH);
    delay(400);
    digitalWrite(led, LOW);
  }

  if (sensore == HIGH  &&  stato == 1)
  {
    invio(b);
    stato = 0;
    digitalWrite(led, LOW);
    invio(b);
  }
}
void invio(char *x)
{
  vw_send((uint8_t *)x, 2);
  vw_wait_tx();
}

se scelgo vw_setup(2000) non funziona o meglio invia il messaggio ma il led resta acceso, se invece metto vw_setup(1000) tutto funziona.
ora perchè succede questo? è il micro troppo lento? è veramente settato a 8mhz?
vw_setup(1000) dovrebbe essere abbastanza veloce per trasmettere solo due cose

infine torniamo al risparmio energetico: ora va in sleep mode?
infinitamente grazie

Non conosco VirtualWire, non so che tipo di libreria è né come opera. Ma la stai usando su un Tiny85? E' compatibile al 100% con questo micro?

Riguardo al risparmio energetico, stando al codice dovrebbe mettertelo in sleep. Controlla magari mettendo un semplice led che lampeggia nel ciclo principale per verificare che effettivamente il lampeggio cessi.

leo72: Non conosco VirtualWire, non so che tipo di libreria è né come opera. Ma la stai usando su un Tiny85? E' compatibile al 100% con questo micro?

Riguardo al risparmio energetico, stando al codice dovrebbe mettertelo in sleep. Controlla magari mettendo un semplice led che lampeggia nel ciclo principale per verificare che effettivamente il lampeggio cessi.

si un attiny85, uso l'ultima versione della libreria virtualwire che dovrebbe essere conpatibile. http://www.airspayce.com/mikem/arduino/

proverò a mettere il led per confermare il risparmio

Sì, nella lib c'è il supporto ai Tiny. Forse dipende dal clock del micro. A quanto lavora?

leo72: Sì, nella lib c'è il supporto ai Tiny. Forse dipende dal clock del micro. A quanto lavora?

dovrebbe lavorare a 8 mhz, ho usato il programma che mi avete suggerito. se faccio "read from mcu" ottengo per il fuses: L: 0x62 H: 0xdf E: 0xff

8 MHz dovrebbero bastargli per gestire una trasmissione a 2000 bps. Comunque se ti funziona a 1000, lascia questo valore e pace.

il bootloader (vuoto) nei tiny serve solo a cambiare i fuse.

leo72: 8 MHz dovrebbero bastargli per gestire una trasmissione a 2000 bps. ...

... gli bastano alla grande XD

Ho un ATtiny85, clock interno a 8 MHz, che gestisce contemporaneamnete la ricezione di messaggi a 2400 baud da modulo bluetooth, il segnale da un pulsante su un ingresso digitale e comanda in PWM sequenze su array di LED ... il tutto senza problemi ... quindi ... ;)

Guglielmo

Io sui Tiny85 ho usato la seriale software a 9600 senza problemi.

Io, una volta, ho parlato con un tiny85 e lui mi ha risposto. :grin:

La sai che i Tiny sono usati dagli sciamani in alcuni riti mistici per comunicare con le divinità? Forse hai parlato con Elettra, la dea della corrente. E’ probabile. :wink:

leo72:
Io sui Tiny85 ho usato la seriale software a 9600 senza problemi.

Credo che con il clock a 8 MHz sia sconsigilato … ho letto da qualche parte che suggeriscono al massimo i 4800 :wink:

Guglielmo

No, funziona tranquillamente.
Ti passo un link utile:
http://www.wormfood.net/avrbaudcalc.php?postbitrate=9600&postclock=8

leo72: Ti passo un link utile: http://www.wormfood.net/avrbaudcalc.php?postbitrate=9600&postclock=8

Ma quello è valido per una Porta Seriale ovvero per una vera Seriale prevista nel chip ... non so se è valido anche per la SoftwareSerial che devi usare sull'ATtiny85 ... :roll_eyes:

Guglielmo