Cambio frequenza PWM blocca il programma
Ciao, vorrei controllare delle ventole da 2 pin con arduino e ho notato che variando la velocità tramite PWM emettono un fastidioso ronzio. Ho trovato su internet un modo per variare la frequenza del PWM e portarla a 31kHz così che non facciano più rumore. Sul setup del codice ho inserito:
che mi varia il timer 1 sui pin 9 e 10.
La ventola non emette più nessun ronzio ma appena viene dato il comando di accensione (che sia tramite pulsante o sensore di temperatura) la ventola parte come dichiarato ma il codice si blocca non eseguendo più nessun'altra funzione.
Se elimino la riga il tutto torna a funzionare come dovrebbe. Come mai questo comportamento?
Allego tutto il codice:
- Codice: Seleziona tutto
TCCR1B = (TCCR1B & 0b11111000) | 0X01;
che mi varia il timer 1 sui pin 9 e 10.
La ventola non emette più nessun ronzio ma appena viene dato il comando di accensione (che sia tramite pulsante o sensore di temperatura) la ventola parte come dichiarato ma il codice si blocca non eseguendo più nessun'altra funzione.
Se elimino la riga il tutto torna a funzionare come dovrebbe. Come mai questo comportamento?
Allego tutto il codice:
- Codice: Seleziona tutto
#include <Time.h>
#include <TimeAlarms.h>
#include <DS3231.h>
#include <DS3232RTC.h>
#include <Wire.h>
#include <IRremote.h>
#include <LEDFader.h>
DS3231 rtc(SDA, SCL);
Time t;
//DEFINISCO RICEVITORE E TRASMETTITORE IR
int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
//DEFINISCO I PIN UTILIZZATI
#define router A0 //RELE' 1
#define voip A1 //RELE' 2
#define wii A3 //RELE' 3
// 3 //TRASMETTITORE IR
#define PC 4 //RELE' 4
#define led_sopra 11 //TRANSISTOR GRANDE
#define led_tv 6 //TRANSISTOR GRANDE
#define stereo 7 //RELE' 5
#define giradischi 8 //RELE' 6
// #define led_stato 5 //TRANSISTOR PICCOLO
#define ventola_alimentatore 10 //TRANSISTOR GRANDE
// 11 //RICEVITORE IR
#define lampada 12 //RELE' 7
#define ventola_generale 9 //TRANSISTOR GRANDE
#define amp_giradischi A2
//#define SVILUPPI FUTURI //RELE' 8, NON UTILIZZATO
#define pulsante A5
#define interr_3luci 2
//FADE LED
LEDFader led_stato = LEDFader(5);
//COSTANTI VOIP E ROUTER
unsigned long time;
unsigned long tempoCorrente_Router_Voip;
unsigned long tempo_Router_Voip=0;
int stato_Router_Voip = 0;
int Avvio_Router_Voip = 1;
int Riavvio_Router_Voip = 0;
//FUNZIONE LED
int stato_led_fade = 0;
int contatore_led_fade = 0;
int numero_fade = 0;
int stato_led_blink = 0;
int contatore_led_blink = 0;
int numero_blink = 0;
//INTERRUTTORE E PULSANTE
int lettura_interruttore_3luci;
//PULSANTI IR
#define ritardo_pulsante 500
int stato_wii = 0;
int lettura_pulsante_wii;
int valore_precedente_pulsante_wii = LOW;
unsigned long tempo_wii = 0;
unsigned long tempoCorrente_wii;
int stato_pc = 0;
int lettura_pulsante_pc;
int valore_precedente_pulsante_pc = LOW;
unsigned long tempo_pc = 0;
unsigned long tempoCorrente_pc;
int stato_stereo = 0;
int lettura_pulsante_stereo;
int valore_precedente_pulsante_stereo = LOW;
unsigned long tempo_stereo = 0;
unsigned long tempoCorrente_stereo;
unsigned long tempo_ir_stereo;
int stato_giradischi = 1;
int lettura_pulsante_giradischi;
int valore_precedente_pulsante_giradischi = LOW;
unsigned long tempo_giradischi = 0;
unsigned long tempoCorrente_giradischi;
int stato_riavvio_router_voip = 1;
int lettura_pulsante_riavvio_router_voip;
int lettura_pulsante_conferma_azione;
int valore_precedente_pulsante_conferma_azione = LOW;
unsigned long tempo_riavvio_router_voip = 0;
unsigned long tempoCorrente_riavvio_router_voip;
int stato_router = 0;
int stato_pulsante_modem = 1;
int lettura_pulsante_modem;
unsigned long tempo_riavvio_modem = 0;
unsigned long tempoCorrente_riavvio_modem;
int stato_voip = 0;
int stato_pulsante_voip = 1;
int lettura_pulsante_voip;
unsigned long tempo_riavvio_voip = 0;
unsigned long tempoCorrente_riavvio_voip;
int stato_riavvio = 1;
int lettura_pulsante_riavvio;
unsigned long tempo_riavvio= 0;
unsigned long tempoCorrente_riavvio;
int stato_led_sopra = 0;
int lettura_pulsante_led_sopra;
int valore_precedente_pulsante_led_sopra=LOW;
unsigned long tempo_led_sopra = 0;
unsigned long tempoCorrente_led_sopra;
int luminosita=0;
//FUNZIONE PER RIAVVIARE ARDUINO
void(* Riavvia)(void) = 0;
//--------------------------------------------------------------------------------------------------SETUP-------------------------------------------------------------------------------------------
void setup(){
TCCR1B = (TCCR1B & 0b11111000) | 0X01;
//AVVIO IR
irrecv.enableIRIn();
//IMPOSTAZIONE LE VARIABILI TEMPO
rtc.begin();
tempoCorrente_Router_Voip=millis();
tempoCorrente_wii=millis();
tempoCorrente_pc=millis();
tempoCorrente_stereo=millis();
tempoCorrente_giradischi=millis();
//IMPOSTAZIONE INGRESSI E USCITE
pinMode(router, OUTPUT);
pinMode(voip, OUTPUT);
pinMode(wii, OUTPUT);
pinMode(PC, OUTPUT);
pinMode(led_sopra, OUTPUT);
pinMode(led_tv, OUTPUT);
pinMode(stereo, OUTPUT);
pinMode(giradischi, OUTPUT);
pinMode(ventola_alimentatore, OUTPUT);
//pinMode(led_stato, OUTPUT);
pinMode(lampada, OUTPUT);
pinMode(ventola_generale, OUTPUT);
pinMode(amp_giradischi, OUTPUT);
pinMode(pulsante, INPUT);
pinMode(interr_3luci, INPUT);
//IMPOSTAZIONE DEI PIN ALL'AVVIO
digitalWrite(router, LOW ); //RELE' 1 -------- LOW
digitalWrite(voip, LOW ); //RELE' 2 -------- LOW
digitalWrite(wii, LOW ); //RELE' 3 -------- LOW
digitalWrite(PC, LOW ); //RELE' 4 -------- LOW
analogWrite(led_sopra, 0 );
analogWrite(led_tv, 0 );
digitalWrite(stereo, LOW ); //RELE' 5 -------- LOW
digitalWrite(giradischi, HIGH ); //RELE' 6 -------- HIGH
//analogWrite(led_stato, LOW );
analogWrite(ventola_alimentatore, LOW );
digitalWrite(lampada, HIGH ); //RELE' 7 -------- HIGH
analogWrite(ventola_generale, LOW );
//digitalWrite(SVILUPPI FUTURI, HIGH ); //RELE' 8 -------- HIGH
digitalWrite(amp_giradischi, LOW );
digitalWrite(2, INPUT_PULLUP);
digitalWrite(A5, INPUT_PULLUP);
}
void loop() {
//AVVIO RECEZIONE CODICI IR
{if (irrecv.decode(&results)) {Serial.println(results.value, HEX); irrecv.resume();}}
//AVVIO DEI PROGRAMMI
Router_Voip();
Fade_led();
Blink_led();
Wii();
Giradischi();
PC();
Stereo();
Pulsante_riavvio_router_voip();
Pulsante_modem();
Pulsante_voip();
Pulsante_riavvio();
// Led_sopra();
//PROGRAMMA RIAVVIO E SPEGNIMENTO DISPOSITIVI
t = rtc.getTime();
if (t.date == 1 && t.hour == 05 && t.min == 00 && t.sec == 00) {Riavvia();} //Riavvia arduino il 1 alle 05:00:00
if (t.date == 06 && t.hour == 13 && t.min == 33 && t.sec == 00) {Riavvio_Router_Voip = 1;} //Riavvia router e voip il 15 alle 05:00:00
if (t.date == 06 && t.hour == 13 && t.min == 32 && t.sec == 00) {stato_led_blink=1;numero_blink=1000;}
if (t.hour == 05 && t.min == 30 && t.sec == 00) {digitalWrite(PC, LOW ); digitalWrite(stereo, LOW ); digitalWrite(wii, LOW ); digitalWrite(giradischi, LOW );} //Spegne alle 05:30:00
//VENTOLA GENERALE
if (rtc.getTemp()<30) {analogWrite(ventola_generale, 0);}
if (rtc.getTemp()>30) {analogWrite(ventola_generale, 250);}
//VENTOLA ALIMENTATORE
if (stato_wii==0 & stato_giradischi==1){analogWrite(ventola_alimentatore, 0);}
if (stato_wii==1 & stato_giradischi==1){analogWrite(ventola_alimentatore, 200);}
if (stato_wii==0 & stato_giradischi==0){analogWrite(ventola_alimentatore, 150);}
if (stato_wii==1 & stato_giradischi==0){analogWrite(ventola_alimentatore, 250);}
//PULSANTI
lettura_interruttore_3luci = analogRead (interr_3luci);
lettura_pulsante_giradischi = results.value == 0xFF22DD;
lettura_pulsante_wii = results.value == 0xFFE21D;
lettura_pulsante_pc = results.value == 0xFF629D;
lettura_pulsante_stereo = results.value == 0xFFA25D;
lettura_pulsante_conferma_azione = results.value == 0xFF38C7;
lettura_pulsante_riavvio_router_voip = results.value == 0xFF906F;
lettura_pulsante_led_sopra = results.value == 0xFF4AB5;
// lettura_pulsante_DIMINUISCE_led_sopra = results.value == 0xFF4AB5;FF6897
lettura_pulsante_modem = results.value == 0xFFE01F;
lettura_pulsante_voip = results.value == 0xFFA857;
lettura_pulsante_riavvio = results.value == 0xFFC23D;
}
//---------------------------------------------------------------------------------------------------ALTRI PROGRAMMI---------------------------------------------------------------------------------------------
//PROGRAMMA AVVIO ROUTER E VOIP
void Router_Voip()
{if((Avvio_Router_Voip==1)||(Riavvio_Router_Voip==1)) {stato_Router_Voip=1; Avvio_Router_Voip=0; Riavvio_Router_Voip = 0; digitalWrite(router,LOW); digitalWrite(voip,LOW); stato_router = 0; stato_voip = 0; stato_led_fade=1;numero_fade=5;}
tempoCorrente_Router_Voip=millis();
if((tempoCorrente_Router_Voip-tempo_Router_Voip>=5000)&&stato_Router_Voip==1) {digitalWrite(router,HIGH); stato_router = 1; stato_Router_Voip=2; tempo_Router_Voip=millis();}
else if (stato_Router_Voip==2) {if(tempoCorrente_Router_Voip-tempo_Router_Voip>=2000) {digitalWrite(voip,HIGH); stato_voip = 1; stato_Router_Voip=0;}}}
//PROGRAMMA FADE LED DI STATO
void Fade_led()
{led_stato.update();
if ((led_stato.is_fading() == false)&&(stato_led_fade == 1))
{if (led_stato.get_value() == 255) {led_stato.fade(0, 1000);contatore_led_fade++;}
else {led_stato.fade(255, 1000);}}
if (contatore_led_fade == numero_fade){stato_led_fade = 0; contatore_led_fade = 0;}}
void Blink_led()
{led_stato.update();
if ((led_stato.is_fading() == false)&&(stato_led_blink == 1))
{if (led_stato.get_value() == 255) {led_stato.fade(0, 100);contatore_led_blink++;}
else {led_stato.fade(255, 100);}}
if (contatore_led_blink == numero_blink){stato_led_blink = 0; contatore_led_blink = 0;}}
void Wii()
{tempoCorrente_wii=millis();
if (lettura_pulsante_wii == HIGH && valore_precedente_pulsante_wii == LOW && tempoCorrente_wii - tempo_wii > ritardo_pulsante)
{if (stato_wii == 1) stato_wii = 0; else stato_wii = 1; tempo_wii = millis(); }
digitalWrite(wii, stato_wii);
valore_precedente_pulsante_wii = lettura_pulsante_wii;}
void PC()
{tempoCorrente_pc=millis();
if (lettura_pulsante_pc == HIGH && valore_precedente_pulsante_pc == LOW && tempoCorrente_pc - tempo_pc > ritardo_pulsante)
{if (stato_pc == 1) stato_pc = 0; else stato_pc = 1; tempo_pc = millis(); }
digitalWrite(PC, stato_pc);
valore_precedente_pulsante_pc = lettura_pulsante_pc;}
void Stereo()
{tempoCorrente_stereo=millis();
if (lettura_pulsante_stereo == HIGH && valore_precedente_pulsante_stereo == LOW && tempoCorrente_stereo - tempo_stereo > ritardo_pulsante)
{if (stato_stereo == HIGH) stato_stereo = LOW; else stato_stereo = HIGH; tempo_stereo = millis(); }
digitalWrite(stereo, stato_stereo);
valore_precedente_pulsante_stereo = lettura_pulsante_stereo;}
void Giradischi()
{tempoCorrente_giradischi=millis();
if (lettura_pulsante_giradischi == HIGH && valore_precedente_pulsante_giradischi == LOW && tempoCorrente_giradischi - tempo_giradischi > ritardo_pulsante)
{if (stato_giradischi == 1) stato_giradischi = 0; else stato_giradischi = 1; tempo_giradischi = millis(); }
digitalWrite(giradischi, stato_giradischi);
digitalWrite(amp_giradischi, !stato_giradischi);
valore_precedente_pulsante_giradischi = lettura_pulsante_giradischi;}
void Pulsante_riavvio_router_voip()
{if (stato_riavvio_router_voip == 1 && lettura_pulsante_riavvio_router_voip == HIGH){ tempo_riavvio_router_voip = millis() + 2000; stato_riavvio_router_voip = 2; led_stato.fade(255, 500);}
if (stato_riavvio_router_voip == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_router_voip) {stato_riavvio_router_voip = 3;}
if (stato_riavvio_router_voip == 2 && millis() > tempo_riavvio_router_voip) {stato_riavvio_router_voip = 4;}
if (stato_riavvio_router_voip == 3) {Riavvio_Router_Voip=1; stato_riavvio_router_voip = 1;}
if (stato_riavvio_router_voip == 4) {stato_riavvio_router_voip = 1; led_stato.fade(0, 500);}}
void Pulsante_modem()
{if (stato_pulsante_modem == 1 && lettura_pulsante_modem == HIGH){ tempo_riavvio_modem = millis() + 2000; stato_pulsante_modem = 2; led_stato.fade(255, 500);}
if (stato_pulsante_modem == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_modem) {stato_pulsante_modem = 3;}
if (stato_pulsante_modem == 2 && millis() > tempo_riavvio_modem) {stato_pulsante_modem = 4;}
if (stato_pulsante_modem == 3) {stato_pulsante_modem = 1;
{if (lettura_pulsante_conferma_azione == HIGH) {if (stato_router == 1) {digitalWrite(router, LOW); stato_router = 0;} else {digitalWrite(router, HIGH); stato_router = 1;}}}}
if (stato_pulsante_modem == 4) {stato_pulsante_modem = 1; led_stato.fade(0, 500);}}
void Pulsante_voip()
{if (stato_pulsante_voip == 1 && lettura_pulsante_voip == HIGH){ tempo_riavvio_voip = millis() + 2000; stato_pulsante_voip = 2; led_stato.fade(255, 500);}
if (stato_pulsante_voip == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_voip) {stato_pulsante_voip = 3;}
if (stato_pulsante_voip == 2 && millis() > tempo_riavvio_voip) {stato_pulsante_voip = 4;}
if (stato_pulsante_voip == 3) {stato_pulsante_voip = 1;
{if (lettura_pulsante_conferma_azione == HIGH) {if (stato_voip == 1) {digitalWrite(voip, LOW); stato_voip = 0;} else {digitalWrite(voip, HIGH); stato_voip = 1;}}}}
if (stato_pulsante_voip == 4) {stato_pulsante_voip = 1; led_stato.fade(0, 500);}}
void Pulsante_riavvio()
{if (stato_riavvio == 1 && lettura_pulsante_riavvio == HIGH){ tempo_riavvio = millis() + 2000; stato_riavvio = 2;led_stato.fade(255, 500);}
if (stato_riavvio == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio) {stato_riavvio = 3;}
if (stato_riavvio == 2 && millis() > tempo_riavvio) {stato_riavvio = 4;}
if (stato_riavvio == 3) {Riavvia(); stato_riavvio = 1; led_stato.fade(0, 500);}
if (stato_riavvio == 4) {stato_riavvio = 1; led_stato.fade(0, 500);}}
