Bom dia amigos.
Iniciei a pouco tempo meus estudos com arduino e estou tendo dificuldades em fazer com que o dimmer funcione no attiny85.
Efetuei os testes no arduino e funcionou muito bem, mas agora queria poder transferir o projeto para o attiny85, porém devido as diferençás de Timers e esta rodando em 8MHz acredito que este seja o problema.
Já tentei alterar os timers na programação, mas ainda continua o problema, ou acende totalmente ou fica totalmente apagada a lampada.
Vocês que já são mais experiente no assunto, poderiam me ajudar sobre onde estou errando neste código?
Obrigado.
#include <avr/io.h>
#include <avr/interrupt.h>
#define DETECT 0 //zero cross detect
#define GATE 3 //triac gate
#define PULSE 8 //trigger pulse width (counts)
int i=483;
void setup(){
Serial.begin(9600);
// set up pins
pinMode(DETECT, INPUT); //zero cross detect
digitalWrite(DETECT, HIGH); //enable pull-up resistor
pinMode(GATE, OUTPUT); //triac gate control
// set up Timer0
OCR0A = 100; //initialize the comparator
TIMSK = 0x03; //enable comparator A and overflow interrupts
TCCR0A = 0x00; //timer control registers set for
TCCR0B = 0x00; //normal operation, timer disabled
// set up zero crossing interrupt
attachInterrupt(5,zeroCrossingInterrupt, RISING);
//IRQ0 is pin 2. Call zeroCrossingInterrupt
//on rising signal
}
//Interrupt Service Routines
void zeroCrossingInterrupt(){ //zero cross detect
TCCR0B=0x04; //start timer with divide by 256 input
TCNT0 = 0; //reset timer - count from zero
}
ISR(TIMER0_COMPA_vect){ //comparator match
digitalWrite(GATE,HIGH); //set triac gate to high
TCNT0 = 65536-PULSE; //trigger pulse width
}
ISR(TIMER0_OVF_vect){ //timer0 overflow
digitalWrite(GATE,LOW); //turn off triac gate
TCCR0B = 0x00; //disable timer stopd unintended triggers
}
void loop(){ // sample code to exercise the circuit
i--;
OCR0A = i; //set the compare register brightness desired.
if (i<65){i=483;}
delay(15);
}
Tags:
Meu chute = divida por dois esses valores e use isso ...
OCR0A = i; //set the compare register brightness desired.
if (i<32){i=241;}
delay(15);
José, obrigado pela ajuda.
Efetuei os testes aqui, mas o problema continua, ainda não esta fazendo o fading.
Pesquisando #include <avr/io.h>
Diretorio = \arduino-1.0.5\hardware\tools\avr\avr\include\avr
#elif defined (__AVR_ATtiny85__)
# include <avr/iotn85.h>
Como será que o sketch sabe que é um ATtiny 85?
José, antes de compilar o sketck é selecionado a board como Attiny85 8Mhz.
Já alterei diversas opções do sketch, mas não faz a função corretamente.
Continuo pesquisando bastante, mas nada de dimmer relacionado ao Attini 85 ainda encontrei.
É mesmo, eu tinha me esquecido...
Boa noite Fábio,
Apesar do tempo que vc fez esta postagem eu tive o mesmo problema (em 2021) e após pesquisar encontrei a resposta na questão que o Attiny 85 possui pinos específicos para a função de interrupção, no meu caso, precisei da interrupção em apenas 1 pino (o que monitora a entrada de um contador de voltas de um sensor de vazão) então descobri que bastava utilizar para a interrupção 0 o pino digital 2
(int flowPin = 2; //Este é o pino de entrada no Attint 85, para permitir a interrupção 0, pino físico 7, porta DIGITAL D2),
pelo que consegui pesquisar o Attiny 85 possui dois modos de interrupção a 0 e a 1, e são em pinos diferentes. após trocas as portas consegui resolver e fazer o programa funcionar, agora vou para os testes práticos.
meu programa tem o objetivo de controlar a vazão em L/min de um poço semi-artesiano que perfurei em um terreno muito argiloso e que não me garante uma vazão constante, a ideia é de impedir que a bomba trabalhe a seco. meu código funcionando em testes de bancada está assim para o Attiny 85:
------------------------------------------Attiny 85------------------------------------------------------------------------------------------
int flowPin = 2; //Este é o pino de entrada no Attint 85, para permitir a interrupção 0, pino físico 7, porta DIGITAL D2
double flowRate; //Este é o valor que pretende-se calcular
volatile int count; //Este número precisa ser setado como volátil para garantir que ele seja atualizado
//corretamente durante o processo de interrupção
int buttonPin = 4; // pino de controle para a bomba, módulo relé, saída digital 4 porta D4
void setup() {
pinMode(buttonPin, OUTPUT);
pinMode(flowPin, INPUT); //Seta o pino de entrada D3
attachInterrupt(0, Flow, RISING); //Configura o interruptor 0 (pino D2 no Attiny 85) para rodar a função "Flow"
digitalWrite(buttonPin, 1); //liga a bomba
delay(3000); // tempo para encher a tubulação 3s
}
void loop() {
count = 0; // Reseta o contador para iniciarmos a contagem em 0 novamente
interrupts(); //Habilita o interrupção no Arduino
delay (1000); //Espera 1 segundo
noInterrupts(); //Desabilita o interrupção no Arduino
//Cálculos matemáticos
flowRate = (count * 2.25); //Conta os pulsos no último segundo e multiplica por 2,25mL, que é a vazão de cada pulso
flowRate = flowRate * 60; //Converte segundos em minutos, tornando a unidade de medida mL/min
flowRate = flowRate / 1000; //Converte mL em litros, tornando a unidade de medida L/min
// controle da bomba d'agua
if (flowRate > 1){
digitalWrite(buttonPin, 1); //mantem a bomba ligada se a medição de vazão for superior a 1 lito por minuto
}
if (flowRate < 1){
digitalWrite(buttonPin, 0); //deliga a bomba se a medição de vazão for inferior a 1 lito por minuto
interrupts(); //Habilita a interrupção no Arduino
delay (60000); //Espera 1 min para o poço encher de água
digitalWrite(buttonPin, 1); //liga a bomba
delay(3000); // ligando a bomba d'água, espera 3 segundos para bombear e realizar a nova medição,
//se for superior a 1,0 L/min, mantem ligada, caso contrário é aguardado mais 1 min para o poço encher de água
}
}
void Flow()
{
count++; //Quando essa função é chamada, soma-se 1 a variável "count"
}
------------------------------------------------------------------------------------------------------------------------------------
Para o Arduíno Uno, onde realizei testes práticos com a bomba d'água e o módulo relê que fiz, e funcionou por mais de 8hs contínuas e acompanhei pelo serial monitor/ploter o comportamento da vazão do poço, onde o programa funcionou muito bem interrompendo o funcionamento da bomba quando a vazão era igual ou menor que a 1 L/min a bomba era desligada e aguardava 1 min para o poço encher. e assim reiniciando o processo em automático.
============ Arduino UNO ===============================================
int flowPin = 2; //Este é o pino de entrada no Arduino
double flowRate; //Este é o valor que pretende-se calcular
volatile int count; //Este número precisa ser setado como volátil para garantir que ele seja atualizado corretamente durante o processo de interrupção
int buttonPin = 4; // pino de controle para a bomba, módulo relé
void setup() {
pinMode(buttonPin, OUTPUT);
pinMode(flowPin, INPUT); //Seta o pino de entrada
attachInterrupt(0, Flow, RISING); //Configura o interruptor 0 (pino 2 no Arduino Uno) para rodar a função "Flow"
Serial.begin(9600); //Inicia o Serial
digitalWrite(buttonPin, 1); //liga a bomba
Serial.println("ligada");
Serial.println("bombeamento inicial");
delay(3000); // tempo para encher a tubulação
}
void loop() {
count = 0; // Reseta o contador para iniciarmos a contagem em 0 novamente
interrupts(); //Habilita o interrupção no Arduino
delay (1000); //Espera 1 segundo
noInterrupts(); //Desabilita o interrupção no Arduino
//Cálculos matemáticos
flowRate = (count * 2.25); //Conta os pulsos no último segundo e multiplica por 2,25mL, que é a vazão de cada pulso
flowRate = flowRate * 60; //Converte segundos em minutos, tornando a unidade de medida mL/min
flowRate = flowRate / 1000; //Converte mL em litros, tornando a unidade de medida L/min
Serial.print(flowRate); //Imprime a variável flowRate no Serial
Serial.println(" L/Min");
// controle da bomba d'agua
if (flowRate > 1){
digitalWrite(buttonPin, 1); //liga a bomba
Serial.println(" ligada");
}
if (flowRate < 1){
digitalWrite(buttonPin, 0); //desliga a bomba
Serial.println(" desligada");
Serial.println("espera o poço encher");
interrupts(); //Desabilita o interrupção no Arduino
delay (60000); //Espera 1 min para o poço encher
digitalWrite(buttonPin, 1); //liga a bomba
Serial.println(" ligada apos queda");
delay(3000); //espera 3s antes de iniciar as medições/interrupções de contagem da vazão
//delay(180000); //180.000= 3min= 180segundos
}
}
void Flow()
{
count++; //Quando essa função é chamada, soma-se 1 a variável "count"
}
===============================================================
Espero com esta postagem poder ajudar a você ou alguém que precise de ajuda com esta dificuldade, ainda vou atualizar meu projeto com leds para indicar o funcionamento da bomba e da vazão, caso alguém precise de mais detalhes ou fotos das montagens que realizei podem me enviar e-mail john2n3055@yahoo.com.br . um abraço a todos.
referência que me ajudou: https://www.youtube.com/watch?v=JHjAf-ynYKk
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por