E ae Pessoal do Laboratório

Estou desenvolvendo um projeto com Dimmer, segui os passos que o Renato Aloi postou na aula 14 no youtube, consegui fazer a lampada ligar e diminuir até desligar no código exemplo que ele passou, porém no código que ele montou com botões eu queria mudar para escrever uma porcentagem na porta serial, por exemplo se eu digitar 50 a lâmpada acende 50%, digito 25 e a lâmpada ascende 25%, digito 100 e a lâmpada ascende 100%.

O código do Renato Aloi é esse:

int UP = 7;
int DOWN = 8;
int LAMP = 3;   
int dimming = 128;
int counts = 7;
int dimmer[7] = { 1, 105, 100, 75, 50, 25, 10 };
int i = 0;

void setup()
{
  //Serial.begin(9600);
  //delay(1000);
  pinMode(UP, INPUT);
  pinMode(DOWN, INPUT);
  pinMode(LAMP, OUTPUT);
  digitalWrite(UP, HIGH);
  digitalWrite(DOWN, HIGH);
  attachInterrupt(0, zero_crosss_int, RISING);
}

void loop()
{
  if (!digitalRead(UP) || !digitalRead(DOWN))
  {
    if (verifica_botao(UP))
    {
      if (i < (counts - 1)) i++;
      //Serial.print("UP: ");
      //Serial.println(i, DEC);
    }
    else if (verifica_botao(DOWN))
    {
      if (i > 0) i--;
      //Serial.print("DOWN: ");
      //Serial.println(i, DEC);
    }
  }
  //Serial.print("VALOR: ");
  //  Serial.println(i, DEC);
  dimming = dimmer[i];
  delay(100);
}

void zero_crosss_int()
{
  int dimtime = (65 * dimming);     
  delayMicroseconds(dimtime);   
  digitalWrite(LAMP, HIGH);  
  delayMicroseconds(8.33);        
  digitalWrite(LAMP, LOW);   
}

byte verifica_botao(byte botao)
{
  if (!digitalRead(botao))
  {
    unsigned long tempo = millis() + (150 - dimming);
    while(tempo > millis())
    {
     if (digitalRead(botao)) return LOW;
    }
    return HIGH;
  }
  else
    return LOW;
}

Estou usando:

Triac Tic246

Optocopladores: Moc3021 e 4N25

Ponte de diodo

Resistores

Alguém poderia me orientar como deveria fazer o código para funcionar direitinho pela porta serial?

Exibições: 3143

Anexos

Responder esta

Respostas a este tópico

Rui

Pior que fica no fade ainda acende e apaga

Olá Pessoal

Para quem interessar com créditos do Rui Viana, o código certinho para acionamento via serial do dimmer digital:

int LAMP = 3;
int dimming = 10;
int i = 0;

String str;

void setup()
{
Serial.begin(9600);
delay(300);

pinMode(LAMP, OUTPUT);

attachInterrupt(0, zero_crosss_int, RISING);
}

void loop()
{
Serial.println(dimming);
if(Serial.available() > 0)
{
str = Serial.readStringUntil('\n');
dimming = str.toInt();
dimming= dimming*1.15;
if (dimming <10) dimming = 10;
Serial.println(dimming);
}
delay(100);
}

void zero_crosss_int()
{
int dimtime = (65 * dimming);
delayMicroseconds(dimtime);
digitalWrite(LAMP, HIGH);
delayMicroseconds(8.33);
digitalWrite(LAMP, LOW);
}

Everson,

Legal, o Rui é gente boa e sabe muito.

Seria bom que você agora coloca-se na frente do titulo do seu tópico, a palavra RESOLVIDO, desta forma o tópico passa a ser uma consulta de resolução e não mais de busca de solução, servindo assim como banco de consultas para outros.

Um abraço!

Ok Carlos farei isso obrigado

Everson, vou simular o dimmer na proto.

Qual optoacoplador voce usou? 4N25?   ligou em 110v ou 220v?

Rui

Everson, boa noite. 

Resolvi rever o código e montei tudo no proto.

Melhorei o código e ele ficou menor e mais comentado.

Seque o código novo, e o esquema qu usei.

Rui

// Rotina para dimmer. (110v ou 220v) comandado pela serial
// Os valores de brilho da lampada são enviados ao Arduino pelo Serial Monitor.
// O Serial monitor deve ser configurado como "No line ending".
// Os valoes vão de 0 (min) a 100(max).
// Uso didático
// Rui 01/05/2015
//*************** Variaveis e constantes *************
int LAMP = 3; // Pino de disparo do Triac
unsigned int dimming = 115; // Variavel para tempo de retardo. Valor Inicial Minimo
String str; // Variavel string para receber dados da Serial

//*********************** Setup ********************
void setup() // Rotina de setup
{
Serial.begin(9600); // Inicializa a serial a 9600 bps
pinMode(LAMP, OUTPUT); // Define o pino(D3) LAMP como saída
attachInterrupt(0, zero_cross, RISING); // Enable interrupt no pino D2
Serial.println("Digite o valor de brilho de 0 min a 100 max"); // Mensagem de entrada
}
//*********************** Loop ********************
void loop() // Rotina de loop
{
if(Serial.available() > 0) // Verifica se tem dados disponiveis na serial
{
str = Serial.readStringUntil('\n'); // Le os dados da serial para uma string
dimming = str.toInt(); // Transforma a string em Interio
Serial.println(dimming); // Eco da entrada da serial
dimming = (118-dimming)*68; // Calcula o retardo para o disparo do triac
if (dimming <1224) dimming = 1224; // Valor para o brilho máximo 1224
if (dimming >7820) dimming = 7820; // Valor para o brilho minimo 7820
}
delay(10);
}
//******************** Zero_Cross_Int ****************
void zero_cross() // Rotina chamada à cada interrupt causada pelo zero cross do AC
{
delayMicroseconds(dimming); // Restardo calculado
digitalWrite(LAMP, HIGH); // Dispara o Triac
delayMicroseconds(8.33); // Duração do pulso de disparo
digitalWrite(LAMP, LOW); // Desliga pulso de disparo
}

boa tarde rui...montei seu projeto, mas estou com alguns problemas... o resistor de 47k esta esquentando tanto q ta escurecendo. estou aplicando 220v e usando um bta12 700c, mas quando eu digito no serial 100 a saida fica em 12v AC e quando digito 0 a saida fica em 8v AC. alguma ideia do q pode ser. obrigado pela atençao.

fazendo novos teste descobri um dos problemas. a tensao na rede ta 214v, quando eu ligo o projeto na tomada a lampada da uma piscada bem forte e apaga... dai eu digito 50 na serial ela ascende... dai quando eu digito 100 o dimmer para de funcionar e a lampada nao ascende mais com nenhum comando...dai tenho q desligar e ligar o dimmer. se eu colocar 99 a lampada ascende forte com tensao de 205v. sabe me dizer prq com 100 o dimmer trava?

no meu caso o triac soh dispara com valor de 16 na serial(tensao de 2v AC) ate 99 (tensao de 205v AC).

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço