Vizitator Postat Decembrie 3, 2017 Partajează Postat Decembrie 3, 2017 (editat) Sunt destul de rapide, uite aici ce am reusit sa fac eu pana acuma cu al meu. Momentan e doar strict display-ul fara montajul din spate pe care inca nu am avut timp sa-l termin, o sa fie un master RS485 care o sa comunice cu alte montaje slave prin casa. https://www.youtube.com/watch?v=LNrzKi-iN6U ... Omule, ideea, hmmm, imi apartine, sau suntem pe aceeasi idee? esti cu un pas mare inaintea mea. Am tras in apartament numai cabluri pt RS485. Editat Decembrie 3, 2017 de Vizitator Link spre comentariu
Bandi Szasz Postat Decembrie 3, 2017 Partajează Postat Decembrie 3, 2017 (editat) Probabil e aceasi idee , initial am pronit de la idea de a aduce cumva setarile pentru modulul de control de la collectorul solar pentru apa menajera jos in casa, momentan find in pod, m-am saturat sa ma tot sui in pod daca vreau sa schimb temeratura setata si alte minunatii. Mai apoi au venit tot feluri de idei pt alte module, eu inca nu am cabluri trase, o sa fie interesant treaba. Am mai luat si niste module Wifi sa vad cam de ce sunt in stare sa faca, m-am gandit ca unde nu am posibilitate de tras cablu sa folosesc un modul Wifi. Momentam sunt in faza de testare a modulelor RS485 cu max485 si sa construiesc o librarie reutilizabila pentru PIC pe care sa-l pot include in proiect si de acolo sa am doar functii de get si send data. Poate ar fi interesant de dechis un topic nou. Editat Decembrie 3, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Decembrie 3, 2017 Autor Partajează Postat Decembrie 3, 2017 Maaaiii...pai pana ajung eu acolo e muuuuult.Nu ma deranjeaza ca prezentati ceea ce e frumos. Bandi cred ca te referi la programelul de la pagina termostat acolo ai facut treba cu variabila la afisare....insa ai bagat un display refresh care trece prin while Mars a zis ca nu prea sunt bune delayurile in while... Link spre comentariu
Bandi Szasz Postat Decembrie 3, 2017 Partajează Postat Decembrie 3, 2017 (editat) Nu mai tin exact minte ce am pus acolo, dar putin probabil sa fie un delay fizic, de mult nu mai folosesc delay-uri. Mult mai probabil am pus un delay facut prin timer0 cu millis care nu impiedica deloc executarea programului. Acuma fiecare cu preferintele lui, eu lucrez cu timer0 setat la 1ms si numar millisecundele, apoi prin tot programul ma folosesc de variabila millis si vad cat timp a trecut. De acolo poti face simple verificari cu if, vezi cat timp a trecut, daca e destul pentru un refresh apelezi si functia de display daca nu executi restul programului. Uite aici un exemplu de meniu. char* chargingSettingsText[7]={"Bulk Voltage","Floating Voltage","Amper limit","Load Disable","Load Enable","Night Detection","Volt comp."}; float chargingSettings[5] = {14.4,13.7,5.5,11.8,12.2}; int loadManagementSetting = 1; float voltComp = 1.0; float absorbScale = 0; char isSettingEnabled = 0; char backlightTimer = 1; unsigned volatile long millis; long timeButton1 = 0; long timeButton2 = 0; long timeButton3 = 0; #define buttonDelay 250 void EEPROM_StrRead(unsigned char a, unsigned char l, unsigned char *s){ unsigned char i ; for(i = 0 ; i < l ; i++) { *s = EEPROM_Read(a + i) ; s++ ; } } void EEPROM_StrWrite(unsigned char a, unsigned char l, unsigned char *s){ unsigned char i ; for(i = 0 ; i < l ; i++) { EEPROM_Write(a + i, *s) ; s++ ; delay_ms(10); } } void changeSettings() { int i; Lcd_Cmd(_LCD_CLEAR); LCD_Out(1,1,"Loading Settings"); delay_ms(1000); isSettingEnabled = 1; for(i=0;i<7;i++) { Lcd_Cmd(_LCD_CLEAR); LCD_Out(1,1,chargingSettingsText[i]); while(1) { if(Button(&PORTB,4, 1, 0) && timeButton1 < millis) // btn next setting { timeButton1 = millis + buttonDelay; break; } if(Button(&PORTB,6, 1, 0) && timeButton2 < millis ) // btn value + { if(i == 5 ) { if( loadManagementSetting < 1 ) loadManagementSetting++; } else { chargingSettings[i]+=0.1; timeButton2 = millis + buttonDelay; } } if(Button(&PORTB,7, 1, 0) && timeButton3 < millis) // btn value - { if(i == 5 ) { if( loadManagementSetting > 0 ) loadManagementSetting--; } else { chargingSettings[i]-=0.1; timeButton3 = millis + buttonDelay; } } if(i==2) // display different type of value for each setting's value { FloatToAmps(tempA,chargingSettings[i]); LCD_Out(2,6,tempA); } else if ( i == 5 ) { if( loadManagementSetting == 0 ) LCD_Out(2,6,"OFF"); else LCD_Out(2,6,"ON "); } else { FloatToVolts(tempV,chargingSettings[i]); LCD_Out(2,6,tempV); } } } absorbScale = 10/(chargingSettings[2]/10 - chargingSettings[2]*0.4); isSettingEnabled =0 ; Lcd_Cmd(_LCD_CLEAR); } void saveNewSettings() { int i; for(i=0;i<5;i++) { EEPROM_StrWrite(i*4,4,(char*)&chargingSettings[i]); delay_ms(20); } EEPROM_StrWrite(5*4,4,(char*)&loadManagementSetting); EEPROM_StrWrite(6*4,4,(char*)&voltComp); } void checkButtons() { if(Button(&PORTB,4, 1, 0) && timeButton1 < millis) // enter setting button { BackLight = 1; backlightTimer = 1; changeSettings(); saveNewSettings(); timeButton1 = millis + buttonDelay; } if(Button(&PORTB,7, 1, 0) && timeButton3 < millis) // change displayed page to next one { if(BackLight == 0) { BackLight = 1; } else { dispMode++; if(dispMode>2) dispMode=0; Lcd_Cmd(_LCD_CLEAR); } backlightTimer = 1; timeButton3 = millis + buttonDelay; } } void loadSettingsFromEeprom() { int i; if(EEPROM_Read(0x00) != 0xFF) for(i=0;i<5;i++) { EEPROM_StrRead(i*4,4, (char*)&chargingSettings[i]); delay_ms(50); } EEPROM_StrRead(5*4,4, (char*)&loadManagementSetting); delay_ms(50); EEPROM_StrRead(6*4,4, (char*)&voltComp); //absorbScale = 10/(chargingSettings[2]/10 - chargingSettings[2]*0.4); } Editat Decembrie 3, 2017 de Bandi Szasz Link spre comentariu
mars01 Postat Decembrie 3, 2017 Partajează Postat Decembrie 3, 2017 (editat) Sunt destul de rapide, uite aici ce am reusit sa fac eu pana acuma cu al meu. Momentan e doar strict display-ul fara montajul din spate pe care inca nu am avut timp sa-l termin, o sa fie un master RS485 care o sa comunice cu alte montaje slave prin casa. https://www.youtube.com/watch?v=LNrzKi-iN6U Intr-adevar este foarte OK ca viteza, cum varianta ta este cu acelasi procesor pe care o sa il am si eu, ma bucur. Din cate vad tu ti-ai comandat varianta cu touch capacitiv. Mi se pare cam scump la 108USD bucata ... si in plus are carcasa aia mare rau. @va_cristi Da eu am facut iconurile. Am invatat singur, si acuma mi se par simple. As fi vrut sa deschid un topic, cu tema aceasta, cum sa realizam iconite pt diferite display-uri. Interesant, poate faci un topic si discutam mai in amanunt. @catalin004 "Mars a zis ca nu prea sunt bune delayurile in while..." Delay-urile blocante gen functia delay_ms(x) este bine sa fie evitate pe cat posibil. Nu se poate tot timpul dar daca ai posibilitatea sa folosesti metoda colegului Bandi Szasz (metoda pe care o folosesc si eu de altfel in mod curent) atunci e mai bine. Editat Decembrie 3, 2017 de mars01 Link spre comentariu
Bandi Szasz Postat Decembrie 3, 2017 Partajează Postat Decembrie 3, 2017 (editat) Off topic: Am deschis eu un topic nou pentru a putea discuta fara sa deranjam acest topic. https://www.elforum.info/topic/129063-diferite-display-uri-cu-pic-sau-alte-uc-uri/. Si da este modelul capacitiv (am avut alte display-uri cu touch rezistiv si nu prea mi-a placut senzatia la atingere find mai multe straturi, la apasare aveam senzatia ca se impinge display-ul spre interior). Am de gand sa il montez ingropat pe perete si de acea am ales varianta cu rama, nu este cea mai frumoasa rama mai mult pentru ca este un pic mare cum ai zis dar nu as fi reusit nici eu sa fac unu-l mai frumos neavand acces la un CNC sa debitez o rama. Nu a fost cea mai ieftina solutie si aia e adevarat dar recunosc subtil ca find tanar fara prea multe "obligatii" si cu un job bine platit nu prea ma uit la bani . Si scuzele mele Catalin pentru offtopic. Editat Decembrie 3, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Decembrie 4, 2017 Autor Partajează Postat Decembrie 4, 2017 Nu este nici un deranj...ba din contra. In legatura cu delay-urile: define buton delay 250 ce fec de delay este? Link spre comentariu
Bandi Szasz Postat Decembrie 4, 2017 Partajează Postat Decembrie 4, 2017 Este un delay de 250ms inainte de inca o citire a butonului. Daca ti butonul apasat continu valorile sunt incrementate doar 1 singura data la fiecare 250ms. Este folosit timer0 la 1ms si incrementez contorul millis. E aceasi lucru ca si cand as fi inclus in if un delay_ms(250) dar in felul acela nu este blocking. Link spre comentariu
catalin004 Postat Decembrie 4, 2017 Autor Partajează Postat Decembrie 4, 2017 Deci acel delay nu este blocking....de retinut! Link spre comentariu
catalin004 Postat Decembrie 8, 2017 Autor Partajează Postat Decembrie 8, 2017 As vrea si eu cateva explicatii la liniile de mai jos....adica cam 3 linii... unsigned volatile long millis; long timeButton1 = 0; long timeButton2 = 0; long timeButton3 = 0; #define buttonDelay 250 Link spre comentariu
Bandi Szasz Postat Decembrie 8, 2017 Partajează Postat Decembrie 8, 2017 (editat) unsigned volatile long millis; ## variabila incrementata in timer0 setat la 1ms, declarata volatile pentru ca este folosit in intrerupere si e de preferat ca compilatorul sa nu efectueze optimizare pentru variabila. long timeButtonX = 0; ## variabile care retin timpul curent + valoarea de delay #define buttonDelay 250 ## este doar o metod simpla de declarare a valorilor la inceputul fiserului de cod fara a ocupa spatiul RAM, in timpul compilarii compilatorul va inlocuii in tot codul unde gaseste "buttonDelay" cu valoarea 250; Idea de functionare este urmatoarea: timeButtonX = millis + buttonDelay; ## deci variabila retine timpul curent + 250ms in avans. if ( timeButtonX < millis) ## nu se va executa pana cand variabila millis nu se incrementeaza de cel putin 251 ori de timer0, adica trec 250ms. Astfel se obtine un delay de 250ms fara a bloca executia altor linii de cod in afara conditiei if: non-blocking. Ultima linie din conditia if trebuie sa actualizeze variabila timeButtonX din nou cu millis + delay pentru a crea un nou delay de 250ms Editat Decembrie 8, 2017 de Bandi Szasz Link spre comentariu
catalin004 Postat Decembrie 8, 2017 Autor Partajează Postat Decembrie 8, 2017 (editat) Nu intelegeam cum acel millis lucreaza cu timer 0....adica nu era declarat nicaieri timerul sau interruptul...si credeam ca define250 lucreaza tot acolo in acel timer...Adica delay 250 este un delay blocking din ce vad... Probabil ca este doar o parte din program...sau un heater...nu vad main-ul....probabil ca acolo era si timer0 Editat Decembrie 8, 2017 de catalin004 Link spre comentariu
Bandi Szasz Postat Decembrie 8, 2017 Partajează Postat Decembrie 8, 2017 Corect, e in main. Codul postat e doar unu-l dintre fisiere, codul find destul de mare e impartit pe 4-5 fisiere. Provine de la incarcatorul solar facut acum 2 ani . Link spre comentariu
catalin004 Postat Decembrie 8, 2017 Autor Partajează Postat Decembrie 8, 2017 Felicitari...ce beterii aveti?deep cycle? Link spre comentariu
Bandi Szasz Postat Decembrie 8, 2017 Partajează Postat Decembrie 8, 2017 Momentan este o simpla baterie de masina. Sistemul este folosit doar ca backup pentru colectorul solar de apa menajera, in cazul in care pica reteaua porneste automat invertorul si se trece alimentarea pompei de recirculare a antigelului pe acumulator, in caz contrar in 30 de minute se ating temperaturi de peste 120 de grade si incepe sa fiarba instalatia. Poate la primavara mai completez cu un panou si atunci schimb si acumulatorul cu ceva mai bun dar in cazul de fata mai tot timpul sta 100% incarcat, din cand in cand mai pun un bec pe el sa se mai descarce putin. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum