Buongiorno a tutti ho arduino mega 25 60
DS18B20
e due ventole di raffreddamento
sto guardando in giro ma non capisco come collegare il sensore con le ventole, vorrei che a 26 gradi le ventole si accendono e a meno di 26 si spengono come posso fare? grz a tutti per l'aiuto
intanto, digitando il "nomesensore + arduino + wiring " trovi tantissimi schemi di collegamento, ad esempio, questo è il primo che ho trovato.
Inoltre , mancano un po di specifiche sulle ventole. Che ventole sono? a quanti V funzionano? quanti cavi hanno?
Difficilmente potrai alimentare delle ventole direttamente da arduino senza danneggiarlo. Fornisce troppa poca corrente, quindi avrai bisogno di un'alimentazione esterna.
Data per scontata l'alimentazione esterna, torniamo al problema cavi. Quanti sono ? se sono 2 quasi sicuramente avrai bisogno di un transistor per ogni ventola, se sono 3 forse potresti alimentarle esternamente e pilotarle in pwm
Se la ventola la vuoi solo accendere o spegnere puoi fregartene del terzo filo ( quello di pwm).
Io userei un transistor. Un collegamento del tipo : +12V ---> positivo ventola , negativo ventola mandato al collettore del transistor, emettitore transistor a massa, e base transistor collegata a una pin di arduino tramite una resistenza . Poi sta a te scrivere il programma, una cosa del tipo :
controlla temperatura
if ( temperatura > soglia) scrivi il pin di base del transistor HIGH
else if ( temperatura < soglia ) scrivi il pin di base del transistor LOW
quando sulla base del transistor metti una tensione HIGH il transistor si attiva e lascia scorrete corrente tra collettore ed emettitore facendo girare la ventola
Non ho mai lavorato con le ventole in pwm ma questo è uno schema di base che si utilizza in molte applicazioni
ho provato a collegare il ds solo arduino ma mi da solo 0
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print(" Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature for Device 1 is: ");
Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"?
// You can have more than one IC on the same bus.
// 0 refers to the first IC on the wire
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);
RTC_DS1307 rtc;
int oraAlba=7;
int minAlba=0;
long albas;
int durataAlbas=720;
int oraTramonto=9;
int minTramonto=0;
long tramontos;
int durataTramontos=720;
long nows;
int delayR=0;
int delayG=120;
int delayB=240;
int delayUV=360;
int delayW=360;
int pinR=2;
int pinG=3;
int pinB=4;
int pinW=5;
int pinUV=6;
void setup(){
Serial.begin(57600);
Wire.begin();
rtc.begin();
pinMode(pinR,OUTPUT);
pinMode(pinG,OUTPUT);
pinMode(pinB,OUTPUT);
pinMode(pinW,OUTPUT);
pinMode(pinUV,OUTPUT);
delay(1000);
Serial.begin(9600);
Serial.println("Misura la temperatura con sensore DS18B20");
Serial.println("CFP Manfredini Este PD");
delay(1000);
sensors.begin();
}
void loop(){
// Calcolo inizio alba in secondi
albas=oraAlba*3600+minAlba*60;
// Calcolo inizio tramonto in secondi
tramontos=oraTramonto*3600+minTramonto*60;
// prendo ora attuale
DateTime now=rtc.now();
// Calcolo attuale in secondi
nows=now.hour()*3600+now.minute()*60+now.second();
// Notte
if (nows<albas||nows>tramontos+durataTramontos){
digitalWrite(pinR,LOW);
digitalWrite(pinG,LOW);
digitalWrite(pinB,LOW);
digitalWrite(pinUV,LOW);
digitalWrite(pinW,LOW);
}
// Alba
if (nows>albas && nows+delayR<albas+durataAlbas){
analogWrite(pinR,65*(float)(((albas+durataAlbas)-nows)/(durataAlbas-delayR)));
}
if (nows>albas && nows+delayG<albas+durataAlbas){
analogWrite(pinG,65*(float)(((albas+durataAlbas)-nows)/(durataAlbas-delayG)));
}
if (nows>albas && nows+delayB<albas+durataAlbas){
analogWrite(pinB,65*(float)(((albas+durataAlbas)-nows)/(durataAlbas-delayB)));
}
if (nows>albas && nows+delayUV<albas+durataAlbas){
analogWrite(pinUV,65*(float)(((albas+durataAlbas)-nows)/(durataAlbas-delayUV)));
}
if (nows>albas && nows+delayW<albas+durataAlbas){
analogWrite(pinW,65*(float)(((albas+durataAlbas)-nows)/(durataAlbas-delayW)));
}
// Giorno
if (nows>albas+durataAlbas && nows<tramontos){
digitalWrite(pinR,HIGH);
digitalWrite(pinG,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinUV,HIGH);
digitalWrite(pinW,HIGH);
}
// Tramonto
if (nows>tramontos && nows+delayR<tramontos+durataTramontos){
int v = 65 - (255*(float)(((tramontos+durataTramontos)-nows)/(durataTramontos-delayR)));
analogWrite(pinR,v);
}
if (nows>tramontos && nows+delayG<tramontos+durataTramontos){
int v = 65 - (255*(float)(((tramontos+durataTramontos)-nows)/(durataTramontos-delayG)));
analogWrite(pinG,v);
}
if (nows>tramontos && nows+delayB<tramontos+durataTramontos){
int v = 65 - (255*(float)(((tramontos+durataTramontos)-nows)/(durataTramontos-delayB)));
analogWrite(pinB,v);
}
if (nows>tramontos && nows+delayUV<tramontos+durataTramontos){
int v = 65 - (255*(float)(((tramontos+durataTramontos)-nows)/(durataTramontos-delayUV)));
analogWrite(pinUV,v);
}
if (nows>tramontos && nows+delayW<tramontos+durataTramontos){
int v = 65 - (255*(float)(((tramontos+durataTramontos)-nows)/(durataTramontos-delayW)));
analogWrite(pinW,v);
}
Serial.println();
sensors.requestTemperatures();
Serial.print("Temperatura = ");
Serial.print(sensors.getTempCByIndex(0));
Serial.println(" gradi C");
}
buonasera a tutti io non sono ancora riuscito a trovare una soluzione, mi hanno detto che devo trovare id del mio dispositivo e poi metterlo nello skech
no, senza non va'.
E' una resistenza di PullUp. Serve per avere un livello logico positivo visto che l'uscita della sonda e' in Open Collector
In pratica, senza quella, non ti passa da livello logico Low a livello High, questo perche' si possono mettere piu' sonde sullo stesso BUS
finalmente ho messo al resistenza e mi dice il valore che legge , ora come collego le ventole a 12 volt ad arduino per far si che quando al temperatura supera 26 gradi si accendono le ventole?
Ti servono dei transistor ( con relativa resistenza in base) . Il transistor lo devi scegliere in base alla corrente che scorrerà in quelle ventole ( cercalo sul datasheet).
Transistor molto famosi sono i BC337 ( corrente massima 0,7-0,8 A) e i tip120( fino a 5A se non ricordo male)
Se cerchi su google "Arduino fan wiring" trovi milioni di esempi schemi.
Per far si che si accendano se la temperatura è > 26°, devi scrivere il tuo sketch e inserire questa condizione.
Un fotoaccoppiatore è un dispositivo che disaccoppia due circuiti ( generalmente con caratteristiche di corrente e tensione diverse) . Ok che contiene un transistor ma non puoi pilotarci una ventola ( la massima corrente di collettore è 50mA, un po pochi per una ventola). Puoi usarlo per disaccoppiare l'arduino dal circuito della ventola, ma per accenderla e spegnerla hai comunque bisogno di un transistor. fai riferimento ai due che ti ho gia indicato
ora che lho guardato 100 volte è quasi più chiaro, i 4 fori dove va collegata la ventola cosa sono? la resistenda da 10 k dove va? a cosa serve il diodo li?
il diodo (veloce, shotky) serve a eliminare i transistori dovuti al forte carico induttivo della ventola, che se non eliminati potrebbero daneggiare il transistor.
i 4 fori della ventola.... bhe dipende dalla ventolo cha hai
1 +vcc
2 gnd
poi optional (se le hai)
3 lettura velocità rotazione
4 cotrollo per pwm
la resistenza da 10K è messa come da schema schema tra base ed emettitre (massa)