Salve ragazzi, sono alle prime armi con arduino e sto cercando di realizzare il controllo di un server rack.
Viene gestito un LCD 16x2, un RTC 1307, un sensore di temperatura LM35 e 4 pin digitali ai quali sono collegati 3 mosfet IRF 520.
Il funzionamento è molto semplice; quando la temperatura è al di sotto dei 20 °C ho una strip led blu, quando la temp sale oltre i 20°C i led blu si spengono e si accendono le ventole collegate al pin 9, una strip led rossa ha un effetto fade ed un buzzer si accende e spegne.
L’effetto che volevo dare al rack è molto semplice quanto carino da vedere però ci sono dei piccoli problemi che sicuramente qualcuno di voi saprà risolvere.
Quando il pin 9 è in LOW cè comunque un voltaggio e provando a mettere un led al posto delle ventole, questo si accende, al contrario quando il pin 9 è in HIGH il led si spegne. Succede la stessa cosa con i mosfet, però a differenza del led questi funzionano correttamente pur avendo una tensione in LOW.
La mia domanda è… ma non dovrebbe essere al contrario??? Dove sbaglio???
Altra cosa… quando il sensore LM35 rileva in modo ripetitivo l’intervallo di temperatura tra i 19.90 e 20.90 è un continuo di ON/OFF delle ventole ed ho un effetto tipo lampeggianti della polizia BLU/ROSSO :D… si può risolvere in qualche modo???
Lo vorrei rendere più snello e performante possibile, sia la parte software che hardware.
grazie
#include <Wire.h>
#include <LiquidCrystal.h> //include la libreria per LCD
#include "RTClib.h"
RTC_DS1307 RTC;
LiquidCrystal lcd(8, 7, 5, 4, 3, 2); //uscite LCD
const int inPin = 0;
const int fan = 9;
int ledRosso = 10;
int speaker = 12;
int ledBlu = 11;
int fanState = 0;
int lastFanState = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
RTC.begin();
lcd.begin(16, 2); //numero righe e colonne LCD
pinMode (ledRosso, OUTPUT);
pinMode (speaker, OUTPUT);
pinMode (ledBlu, OUTPUT);
pinMode (fan, OUTPUT);
if (! RTC.isrunning()) {
Serial.print("RTC assente!");
// Decommentare la seguente riga per la memorizzazione della data e dell'ora sul DS1307
//RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop() {
//converte i mV in °C e stampa la temperatura su lcd
int value = analogRead(inPin);
lcd.setCursor(0, 1);
float millivolts = (value / 1024.0) * 5000;
float celsius = millivolts / 10;
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(celsius);
lcd.print(" Celsius");
//legge lo stato del pin 9 e se il valore è HIGH stampa su lcd la voce "VENTOLA ON"
fanState = digitalRead(fan);
if (fanState != lastFanState) {
if (fanState == HIGH) {
lcd.setCursor(0, 1);
lcd.print(" VENTOLE ON");
}
}
//variabile di temperatura
if (celsius >20)
{
digitalWrite(ledBlu, LOW);
digitalWrite(fan, HIGH);
{
digitalWrite(speaker, LOW);
delay(400);
digitalWrite(speaker, HIGH);
delay(100);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
{
analogWrite(ledRosso, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5)
{
analogWrite(ledRosso, fadeValue);
delay(30);
}
Serial.print(" WARNING!!! ");
}
else
{
digitalWrite(ledRosso, LOW);
digitalWrite(ledBlu, HIGH);
digitalWrite(fan, LOW);
//qui lo stato del pin 9 sarà LOW, quindi stampa su lcd "VENTOLA OFF"
lcd.setCursor(0, 1);
lcd.print(" VENTOLE OFF");
}
// Serial print
DateTime now =RTC.now();
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(' ');
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(" Temperatura ");
Serial.print(celsius);
Serial.println();
delay(500);
}