control ventiladores y un maldito boton :)

Hola soy iván y me he comprado un arduino uno r3, la verdad estoy fascinado con el cacharro¡¡ principalmente pq funciona :slight_smile: 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 = tempValor255/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

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

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.... :frowning:

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 = tempValor255/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;
}

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.

Ummm me estoy rompiendo las narices con esto :slight_smile: 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...

Calculas la temperatura mal. Creas un array

int samples[8];

y después no lo usas, sólo utilizas la primera posición

samples = ( 5.0 * analogRead(pinTemperatura) * 100.0) / 1024.0;

Para hacer la media vas sumando "samples" en otra variable, "tempValor" para después fuera del for lo promedias por el número de lecturas que son 8. Desperdicio de memoria en variables y código poco optimizado. En este programa daría igual pero conforme se van haciendo más extensos es una cuestión primordial.
De este modo lo que estás haciendo es la media de las temperaturas 1 a 8, 9 a 16, 17 a 24, etc. cuando lo que suele hacerse es en "tiempo real" ir dando la media de las temperaturas 1 a 8, 2 a 9, 3 a 10, etc. Esto hará que cada vez que se ejecute esa parte del código sólo tengas un delay y no 8 como ahora. Por otra parte, ¿qué razón hay para poner ese delay?

En resumen tienes que quitar el bucle for y aplicar el ejemplo del IDE Smoothing para tener la media de temperaturas como te indico. Y el delay además yo lo bajaría, creo que para nada necesitas que sea tan grande como 100 ms. En Smoothing verás que por ejemplo ponen un delay de sólo 1 ms.

a ver q opinais de este metodo q he encontrado para calcular la temperatura, la verdad es q ya no me pasa lo del delay de una manera tan exagerada tenias razon al usar los samples x8 tb el delay era por x8 asi es mas real

la verdad q lo del smooth no lo di aplicado al lm35 :frowning: pero estoy en ello :slight_smile:

os pongo el código a ver q opinais gracias por vuestra ayuda sois la caña.

int fan = 11;
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;
float tempValor = 0;
float pinTemperatura = 0;
float celsius = 0;

void setup()

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

void loop()

{

pinTemperatura = analogRead(0);
tempValor = (pinTemperatura*5000)/1024;
tempValor = tempValor-500;
celsius = tempValor/10;
delay (100);

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

int valor = celsius*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);
}

}

antes que nada....
buenas compañeros, soy nuevo de mexico eh adquirido un arduino uno, estudio ing electronica y
pues que decir... me encanta la electrónica no se mucho programar bien pero poco a poco
aprendo cada dia...

ya eh realizado varios ejemplos con el arduino, pero ahora en la escuela me piden un control
de temperatura... y pues al comienzo empece a buscar el código lo admito u.u
pero pues que bueno resulto no encontrarlo pues buscando y leyendo fui aprendiendo un poco mas.

ya pude poco a poco desde, escribir en un display, leer el lm35, mostrar sus lecturas, activar un led...
solo que no se como cambiar la variable a controlar!!

la idea es tener dos push button para subir y bajar la temperatura a activar el led
si ejemplo es que digamos a los 30 grados se enciende y si es menos se debe apagar, pero
podrian ayudarme? a como cambiar ese valor externamente con push button?
de antemano un saludo a todos en el foro y revisare bien ya que los proyectos de todos ustedes
y sus colaboraciones me ayudan a aprender y querer mas al arduino UNO.