Go Down

Topic: control ventiladores y un maldito boton :) (Read 2 times) previous topic - next topic

kivir

Hola soy iván y me he comprado un arduino uno r3, la verdad estoy fascinado con el cacharro¡¡ principalmente pq funciona :) bueno antes de nada les digo q mis conocimientos en programacion son mas bien escasos (por no decir nulos) aprendo poco a poco y cada día pero he descubierto q me gusta sobre todo si lo aplicas a la electronica y ves q funciona¡¡¡

Les planteo mi problema a ver si me puede decir por donde tirar ya q no localizo nada q me sirva :

tngo mi arduino pensado para controlar los fans de un pc por temperatura esta parte la tngo mas o menos dominada y funcionando con un lm35z y trnasistor bd 127 mi problema part desde el momente en el q pienso poner un pulsador para cambair deigamos el estado automatico a uno manual en el cual yo con unos potenciometros controlare la velocidad de los fans (para esto el pulso del boton encendera un led para indicar el cambio de estado mas acturara en un rele de 5v q pasara los 12v directos a los potenciometros)

en fin ls dejo lo q llevo de codigo q no es mucho pero parece q funciona estoy abierto a todo tipo de ayuda para mejorar gracias anticipadas



int pinTemperatura = 0;
int fan = 11;
int tempValor = 0;
int samples[8];
int i;
int valor;
int inPin = 7;
int ledPin = 13;
int pul = 0;

void setup()

{
  pinMode(ledPin, OUTPUT);
  pinMode(inPin, INPUT);
  Serial.begin(9600);
}

void loop()

{
   
 
 
 
 
    for(i = 0;i<=7;i++){
 
    samples = ( 5.0 * analogRead(pinTemperatura) * 100.0) / 1024.0;
    tempValor = tempValor + samples;
    delay(100);
    }

tempValor = tempValor/8.0;

Serial.print("La Temperatura en este momento es de: (Celsius) = ");
Serial.println(tempValor);
       
 


 
          int valor = tempValor*255/37;
          analogWrite(fan,valor);
          if (valor > 200){
          analogWrite(fan,255);
          }
     
     
              pul = digitalRead(inPin);
              if (pul == LOW){
              digitalWrite(ledPin, HIGH);
              analogWrite(fan,valor);}
              else{
              digitalWrite(ledPin, LOW);
              analogWrite(fan,0);
              }
       
tempValor = 0;

}


de momento lo q consigo es q al pulsar apague la parte del fan y encinda el led pero en cuanto suelto empieza de nuevo a funcionar

masteron

Claro, porque en el condicional le dices que mientras el botón == LOW apague el ventilador y encienda el led, pero en cuanto dejas de pulsar botón == HIGH, por lo que te deja de funcionar.

Debes usar la función "Button State Change" de los ejemplos de Arduino, de esta manera el condicional lo haces según detecte un flanco de subida o bajada

kivir

Fenomeno.... muchas gracias ya he coseguido lo q qria :), efectivamente era con ese ejemplo, ahora al pulsar una vez apaga el led los fans y enciende el rele ¡¡¡ y al volver a pulsar justo lo contrario.

Dejo aqui el codigo q he estado probando en la protoboard por si alguien lo quiera o ve una posible mejora (siempre hay espacio para mejorar) ahora solo me qda un pqño problema con el delay de la temperatura ya q me afecta a toda la programacion si lo subo por ej al pulsar el boton tengo q estar ese tiempo pulsandolo para q funcione no se si hay alguna manera de aislar el delay de la temperatura para q solo afecte a la sonda y no a todo¿?¿?¿? he intentado aislarlo en cochertes pero no ha servido de nada.... :(




int pinTemperatura = 0;
int fan = 11;
int tempValor = 0;
int samples[8];
int i;
int valor;
const int buttonPin = 7;
const int ledPin = 13;
int pul = 0;
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;
int relem = 12;

void setup()

{
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(relem, OUTPUT);
  Serial.begin(9600);
}

void loop()

{
    for(i = 0;i<=7;i++){
    samples = ( 5.0 * analogRead(pinTemperatura) * 100.0) / 1024.0;
    tempValor = tempValor + samples;
    delay(100);                                                                              //<<<-----------delay temperatura me afecta a todo
    }

tempValor = tempValor/8.0;

Serial.print("La Temperatura en este momento es de: (Celsius) = ");
Serial.println(tempValor);
       
          int valor = tempValor*255/37;
          analogWrite(fan,valor);
          if (valor > 200){
          analogWrite(fan,255);
          }
     
              buttonState = digitalRead(buttonPin);
              if (buttonState != lastButtonState) {
              if (buttonState == HIGH) {
              buttonPushCounter++;
              }
              }
             
                  lastButtonState = buttonState;   
                  if (buttonPushCounter % 2 == 0) {
                  digitalWrite(relem, LOW);
                  digitalWrite(ledPin, HIGH);
                  }
                  else {
                  digitalWrite(ledPin, LOW);
                  digitalWrite(relem, HIGH);
                  analogWrite(fan,0);
                  }
                     
tempValor = 0;

}

masteron

Bienvenido al maravilloso mundo de Arduino Jejejeje

Ahora lo que debes de probar es el ejemplo de "Blink whitout delay" (creo que lo he escrito bien).

Lo que te permite es marcarle unos tiempos, pero sin realizar pausas en el funcionamiento del programa.

Pruebalo y si tienes dudas las comentas.

kivir

Ummm me estoy rompiendo las narices con esto :) pero no encuentro forma de aplicar el blinking without delay al lm 35, es decir si tubiera q poner un led a 1 o a 0 (una salida) si me funcionaria pero al ser una funcion como carja le digo cuando empieza y cuando para, o q lea el estado de la temperaturas :(...


me ayo perdido...

Go Up