Sari la conținut
ELFORUM - Forumul electronistilor

Pagini cu meniu si modificare/salvare parametri


catalin004

Postări Recomandate

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?

:aplauze :aplauze :aplauze esti cu un pas mare inaintea mea.

Am tras in apartament numai cabluri pt RS485.

Editat de Vizitator
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu

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

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 de Bandi Szasz
Link spre comentariu

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 de mars01
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu

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

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

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 de Bandi Szasz
Link spre comentariu

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 de catalin004
Link spre comentariu

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări