Jump to content

  • Log In with Google      Sign In   
  • Create Account

Photo

Arduino - relee si ventilatoare amplificator cu afisaj lcd 20x4.


  • Please log in to reply
11 replies to this topic

#1 OFFLINE   Preoteasa Andrei

Preoteasa Andrei

    Nou venit

  • Membri
  • Pip
  • 9 posts
  • Locatie:Aldershot

Posted 04 January 2017 - 01:31 PM

Folosind unul sau mai multi senzori DS18B20, conectati pe un singur fir, relee si un display LCD 20x4 i2c. Am creat si un loading screen / bar, timpii se pot modifica in functie de necesitate, Mai intai se cauta adresa senzorilor cu onewire dev address finder (si al display-ului, in cazul in care display-ul nu este detectat - cu i2c scanner ). Se pot modifica temperaturile in functie de parametrii amplificatorului. Astept comentarii si / sau imbunatatiri ale codului, mentionand ca este primul meu proiect cu arduino, combinand multiple coduri din diferite tutoriale. 

 

#include <Wire.h>                                                                                                                  //
#include <LCD.h>                                                                                                                   //
#include <LiquidCrystal_I2C.h>                                                                                                     //
#include <OneWire.h>                                                                                                               //
#include <DallasTemperature.h>                                                                                                     //
//---------------------------------------------------------------------------------------------------------------------------------//
#define ONE_WIRE_BUS 13                                                                                         //sensor data pin  //
LiquidCrystal_I2C  lcd(0x3F,2,1,0,4,5,6,7,3,POSITIVE);                                                                             //
OneWire oneWire(ONE_WIRE_BUS);                                                                                                     //
DallasTemperature sensors(&oneWire);                                                                                               //  
DeviceAddress Probe01 = { 0x28, 0xEE, 0x23, 0xA3, 0x1D, 0x16, 0x02, 0x13 };             // write your own device address           //
DeviceAddress Probe02 = {};                                                             // write your own device address           //
//---------------------------------------------------------------------------------------------------------------------------------//
int sensor = 12;                          // sensor power pin (+)
int tempMin = 22;                         // the temperature to start the fans
int tempMax = 26;                         // the maximum temperature when fans are at 100%
int tempOFF = 30;                         // the temperature to cut off the main power of amplifier
int fanSpeed = 0; 
int fanLCD;
int fan = 2;                              //fan speed PWM - connects to 1k resistor fan board
int powerrelay = 3;                       //the ssr relay on the main power of amplifier
int speakersrelay = 4;                    //the relay powering speaker protection board
float temp1;                              //float value of first sensor
float temp2;                              //float value of second sensor
float tempC = 0;                          //float average value
float tempF = 0;
byte degree[8]       = { B00010, B00101, B00010, B00000, B00000, B00000, B00000, B00000 };
byte percentage_1[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 };
byte percentage_2[8] = { B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 };
byte percentage_3[8] = { B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100 };
byte percentage_4[8] = { B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110 };
byte percentage_5[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 };


//-----------------------------------------------------------------------------------------//              
void setup(){
             sensors.begin();
             sensors.setResolution(Probe01, 10); 
             sensors.setResolution(Probe02, 10);                // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
             pinMode(2, OUTPUT);
             pinMode(3, OUTPUT);
             pinMode(4, OUTPUT);
             pinMode(9, OUTPUT);
             pinMode(12, OUTPUT);
             Serial.begin(9600);
             digitalWrite (sensor, HIGH);
             lcd.begin (20,4);  // lcd screen type, mine is 20x4.
             lcd.createChar(6, degree);
             lcd.createChar(1, percentage_1);
             lcd.createChar(2, percentage_2);
             lcd.createChar(3, percentage_3);
             lcd.createChar(4, percentage_4);
             lcd.createChar(5, percentage_5);
             lcd.setBacklight(HIGH);
             lcd.setCursor(0,0);
             lcd.print ("       SYSTEM       ");
             lcd.setCursor(0,1);
             lcd.print ("         IS         ");
             lcd.setCursor(0,2);
             lcd.print ("    INITIALISING    ");
             lcd.setCursor(0,3);
             for (int i=0; i<20; ++i ){for(int j=0; j<5;j++)
                                      {lcd.setCursor(i,3);
                                       lcd.write(j);
                                       delay(10);}}} 
//-----------------------------------------------------------------------------------------//

void loop(){
            sensors.requestTemperatures();
            temp1 = sensors.getTempC(Probe01);
            temp2 = sensors.getTempC(Probe02);
            tempC = (temp1+temp2)/2;
            tempF = sensors.toFahrenheit(tempC);
            Serial.println(tempC,0);
            if (tempC >= tempOFF){digitalWrite(speakersrelay,LOW);             //this will cutoff the speakers protection boards ->no signal in speakers   
                                  delay(200);                                  //delay half second
                                  digitalWrite(powerrelay,LOW);}               //cut the main power of the amp.
                                  else {digitalWrite(powerrelay,HIGH);
                                        digitalWrite(speakersrelay,HIGH);}
                                                     
            delay(250);
            lcd.setCursor(0,0);
            lcd.print("AMPLIFIER MONITOR");
            lcd.print("   ");
            lcd.setCursor(0,1);
            lcd.print("Heatsink temp:");
            lcd.print(tempC,0);
            lcd.write(6);
            lcd.print("C");
            if(tempC < tempMin){                                                                // if temp is lower than minimum temp
                                fanSpeed = 0; // fan is not spinning
                                lcd.setCursor (0,2);
                                lcd.print ("Fans not running");
                                lcd.setCursor (0,3);
                                lcd.print ("ALL SYSTEMS GOOD!");
                                lcd.print ("   ");
                                digitalWrite(fan, LOW);}                                      
    
            if((tempC >= tempMin) && (tempC <= tempMax)) {                                  //if temp is higher than the minimum range
                                                          fanSpeed = map(tempC, tempMin, tempMax, 32, 255); // the actual speed of fan
                                                          fanLCD = map(tempC, tempMin, tempMax, 0, 100);  // speed of fan to display on LCD
                                                          lcd.setCursor(0,2);
                                                          lcd.print("Fans Speed:");  // display the fan speed
                                                          lcd.print(fanLCD);
                                                          lcd.print("%");
                                                          lcd.print("    ");
                                                          lcd.setCursor (0,3);
                                                          lcd.print ("ALL SYSTEMS GOOD!");
                                                          lcd.print ("   ");
                                                          analogWrite(fan, fanSpeed);} // spin the fan at the fanSpeed speed
    
            if (tempC > tempMax) {                                 // if temp is higher than tempMax
                                  lcd.setCursor (0,3);
                                  lcd.print ("HIGH TEMP REACHED!");
                                  lcd.print (" ");
                                  analogWrite(fan, 255);   
                                  fanLCD = 100;
                                  lcd.setCursor(0,2);
                                  lcd.print("Fans Speed:");  // display the fan speed
                                  lcd.print(fanLCD);
                                  lcd.print("%");
                                  lcd.print("    ");}

            if (tempC >= tempOFF){
                                  lcd.setCursor (0,3);
                                  lcd.print ("THERMAL THROTTLING!");
                                  lcd.print (" ");}

            }

 

 

Attached Files


  • 0

Cu_reclama

Cu_reclama
  • Membri

#2 OFFLINE   MifTy

MifTy

    Insuficient Curentat

  • Moderatori
  • 5,339 posts
  • Locatie:ConstanĊ£a

Posted 17 January 2017 - 12:23 AM

ai un Uno sau un Nano? :)

pentru că nu ştiu câţi au să se îndure să blocheze un Mega într-un amplificator numai pentru aşa ceva! :)



#3 OFFLINE   nico_2010

nico_2010

    Membru avansat

  • Moderatori
  • 1,768 posts
  • Locatie:Bucuresti

Posted 17 January 2017 - 08:56 AM

@Mifty: Nu te opreste nimeni sa adaptezi codul pentru porturile Uno/Nano si sa il folosesti.

Idea este interesanta si se poate adapta/folosi pe Arduino Uno/Nano.



#4 OFFLINE   Preoteasa Andrei

Preoteasa Andrei

    Nou venit

  • Membri
  • Pip
  • 9 posts
  • Locatie:Aldershot

Posted 20 January 2017 - 12:25 PM

Salut, am un mega (clona), dar cum a spus si nico_2010, se poate adapta usor insa pentru ce va urma nu cred ca nano are pini deajuns. mi-au venit si ceilalti senzori insa nu am avut timp sa mai postez, am modificat putin codul, am pus doi senzori south/north pe fiecare canal, face media si il afiseaza pe lcd media senzorilor, individual channel A si  channel B. Ca pret cred ca m-a costat tot in jur a 50 lei. Pe startup am pus un keypad, urmeaza codul pentru pin code, pentru pornirea amplificatorului (stiu ca este prea mult dar am tot incercat sa cumpar on off switch-uri cu cheie, din cate am cumparat nu am gasit unul safe, se pot porni usor si fara cheie), iar daca tot e mega in amplificator de ce nu?  :d


  • 0

#5 OFFLINE   MifTy

MifTy

    Insuficient Curentat

  • Moderatori
  • 5,339 posts
  • Locatie:ConstanĊ£a

Posted 04 February 2017 - 11:45 AM

... atunci profită de Mega: are mai mult flash, mai mulţi pini, faci un "electronic lock" cu cod numeric introdus de la tastatură! :)
eventual, faci asta pe un nano sau mini, care să se ocupe doar de asta, şi să-i trimită lui Mega ok-ul...
mă cam bate şi pe mine gândul să iau un Mega, mai ales că cipul lui nu există decât în capsulă SMD, aşa că mai bine iau "plăcuţa" gata făcută decât să mă chinui cu lipitul "gândăcelului", dar nu sunt foarte convins că mai rămân mult timp la joaca cu Arduino...

revenind la subiectul "lock"... există o poveste veche: impedanţa mânii fiecăruia e o variabilă, nu o constantă... aşa că ai putea să suplimentezi protecţia astfel încât să nu răspundă la cheie decât dacă e în mâna ta! :)
singura mică-mare problemă e că şi impedanţa personală variază după cum eşti de transpirat, nemâncat, stresat, etc... :))))
(m-am jucat o vreme cu ideea asta, dar la nivel analogic... mai safe era să fac ceva să răspundă la fluierat! :))))))) )



#6 OFFLINE   Aw Genetix

Aw Genetix

    Genetix

  • Membri
  • PipPip
  • 965 posts
  • Locatie:Deva

Posted 05 February 2017 - 12:37 AM

cu referire la cod...cred ca ar trebui implementat un HISTERIZIS..

nu de alta dar o sa fie cam nehotărât dispozitivul  in practica...


Edited by Aw Genetix, 05 February 2017 - 12:39 AM.

  • 0

#7 OFFLINE   dany_cta

dany_cta

    Banati

  • Membri
  • PipPip
  • 619 posts
  • Locatie:Acasa

Posted 05 February 2017 - 01:10 AM

Nu stiu sigur ce este HISTERIZIS, daca este o modalitate de a pastra valorile precedente la verificari, cu siguranta trebuie implementat asa ceva.

 

Eu am facut ceva similar folosind LM335 si din cand in cand variaza rezultatele cam aiurea, am rezolvat pastrand valorile pe ultimele 20 citiri si facand media.


Edited by dany_cta, 05 February 2017 - 01:11 AM.

  • 0

#8 OFFLINE   XAN77

XAN77

    Membru avansat

  • Membri
  • PipPipPipPip
  • 2,051 posts
  • Locatie:CT

Posted 05 February 2017 - 10:10 AM

Eu am facut ceva similar folosind LM335 si din cand in cand variaza rezultatele cam aiurea, am rezolvat pastrand valorile pe ultimele 20 citiri si facand media.

La fel am făcut și eu în trecut toto cu un 335 și un modul de senzor de umiditate la un ceas de cameră, dar există și o altă variantă. Tocmai de aceea intervin, pentru că mi se pare o variantă mai bună, e vorba de o filtrare digitală mai simplă decît păstrarea ultimelor n valori întro variabilă tip tablou de n valori.

Pentru o mediere de 10 valori, se citește valoarea curentă și se face următorul calcul: (valoarea anterioară x 9 + valoarea curentă) / 10.

Presupunînd că valoarea anterioară a fost corectă iar cea curentă deplasată, aceeasta va influența foarte puțin în mod negativ valoarea finală avînd o pondere de 10% din suma ce se divide cu 10.

Am folosit această filtrare, comparativ cu cea veche (mediere ultime n valori păstrate) la ultimul meu proiect (driver letcon JBC) și s-a dovedit o soluție mai bună.


  • 0

#9 OFFLINE   dany_cta

dany_cta

    Banati

  • Membri
  • PipPip
  • 619 posts
  • Locatie:Acasa

Posted 05 February 2017 - 10:29 AM

Deci solutia ta este sa cari media dupa tine din cate inteleg ? Cred ca da, ar merge bine desi ma gandesc ca ar fi destul de greu sa progreseze valoarea odata cu temperatura daca nu faci citiri foarte frecvente, o sa fie destul de greu sa urce media generala.

Mai e si posibilitatea sa fi inteles gresit si de fapt sa cari doar ultimele doua valori ceea ce are rata mare de eroare.

Nu ar fi mare problema la un ventilator dar cand faci shutdown la un echipament cu eroare de protectie e problema.


  • 0

#10 OFFLINE   XAN77

XAN77

    Membru avansat

  • Membri
  • PipPipPipPip
  • 2,051 posts
  • Locatie:CT

Posted 05 February 2017 - 10:35 AM

va urca la fel de repede ca și medierea ultimelor 10 valori citite, din acest punct de vedere nu are nici un dezavantaj, însă valoarea afișată e mai stabilă și dacă ai o citire pe secundă de exemplu nu trebuie să aștepți 10 secunde să crească valoarea după pornire.

Eu am folosit varianta pe un sistem instabil, nu zic teoretic.


  • 0

#11 OFFLINE   Liviu M

Liviu M

    -

  • Membri
  • PipPipPipPipPip
  • 3,093 posts
  • Locatie:In sat cu Doru

Posted 05 February 2017 - 11:31 AM

histerezis.

Pe scurt, "drumuri" diferite la crestere fata de descrestere.

"Histerezisurile" cel mai des intalnite de electronisti sunt intrarile schmitt-trigger ale diverselor circuite. La circuitele CMOS pragurile sunt, in general, 0.3 * VDD pentru comutarea High->Low si 0.7*VDD pentru comutarea Low -> High.


  • 0

Cu_reclama

Cu_reclama
  • Membri

#12 OFFLINE   mihaicozac

mihaicozac

    Membru

  • Membri
  • PipPip
  • 414 posts
  • Locatie:Luftenberg, Austria

Posted 17 February 2017 - 03:22 PM

Pt. cei care folosesc LM35 ca şi senzori de temperatură analogici, pt. evitarea instabilităţilor la fire lungi eu am preferat la o automatizarea unei instalaţii de încălzire cu sobă cu lemne şi centrală pe motorină modul "curent variabil", în care se folosesc doar 2 fire, ieşirea LM-ului fiind legată printr-un rezstor de 200 ohmi la masa lui. Astfel curentul prin dispozitiv variază cu 50uA/C, la care se adaugă cei 60uA consum propriu. La intrarea Ax de la Arduino se mai montează un rezistor de 1k spre masă, care converteşte curentul variabil de la senzor în tensiune. În acest caz avem şi o "mapare" automată a domeniului 0-100C, folosind astfel rezoluţia ADC-ului la maximum.

  În Arduino se face apoi compensarea abaterilor cu ceva gen temp = temp * 1,05 - 60.

Cât priveşte histerezisul, la acelaşi sistem eu am folosit după comparatorul de mărime un numărător pe rol de temporizator de declanşare. Dacă valoarea trece de cea setată numărătorul incrementează, sau invers, sub valoarea setată decrementează, iar când ajunge la o anumită valoare declanşează mai departe evenimentul. Dacă valoarea comparată oscilează peste sau sub prag, numărătorul urcă sau coboară în interiorul ferestrei, şi ieşirea lui nu se schimbă imediat. Dezavantajul este că reacţionează mai greu la schimbări nete, pt. că numărătorul trece prin toate valorile până să declanşeze.

 

Din codul meu de la comanda centralei pe motorină când soba pe lemne începe să se răcească:

 

 if ((power > 65) || (actual_T > 430))  {
       counter--;}                             
  else if (((power <= 60) || (forward_T < 400) && (exhaust_T < 100))) {
       counter++;} 
  counter = constrain(counter, 0, 1023);                                   //TEMPORIZAREA COMUTARII ARZATOR
 
  if (counter < 1) {
    digitalWrite(9, LOW);}
  else if(counter > 1022) {
    digitalWrite(9, HIGH);}                                                //PORNESTE ARZATORUL PE MOTORINA.  

Edited by mihaicozac, 17 February 2017 - 03:25 PM.

  • 0




2 user(s) are reading this topic

0 members, 2 guests, 0 anonymous users