Sari la conținut
ELFORUM - Forumul electronistilor

icon-uri condiționate în html


XAN77

Postări Recomandate

Nu știu cât de sugestiv e numele topicului da mai mult nu am putut :D

Cum știu prea puțin spre deloc cod html, am următoarea necunoscută:

Într-o pagină web găzduită pe module cu ESP folosesc iconuri online, cum ar fi un termometru alături de o valoare de temperatură cu linia de cod:

<i class="fas fa-thermometer-half" style="color:#059e8a;"></i>

Cum aș putea să fac să fie afișat un anumit icon din mai multe variante, funcție de valoarea temperaturii ? Ceva gen If ...then...

În cazul de față iconul cu termometru există în mai multe variante cu diferite nivele de umplere, iconul simulând un termometru clasic cu lichid. Funcție de valoarea temperaturii aș vrea să fie afișat un icon cu o umplere proporțională cu temperatura.

E doar un exemplu, mă rog, bănuiesc că se înțelege ce vreau să fac.

Link spre comentariu
  • Răspunsuri 24
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

"if"-ul trebuie sa-l faci in javascript... e chiar un if.... :)
Din JS poti modifica toate proprietatile unui element html inclusiv "poza".

Iti recomand https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide

Nu-i nimic foarte complicat iar pe net gasesti aproape orice-ti trece prin cap sa faci cu html/css/js.

 

Ca idee pun o bucata din ce-am io in "robotu` casei"... cre` ca-i clar dupa nume ce si cum:

(.svg-urile sunt imagini locale dar poti si cu link-uri daca preferi...)

      if(theSwitch.state == 'on') {
        if(theSwitch.getAttribute('type') == 'light-switch') img.src = "img/light-on.svg";
        else if(theSwitch.getAttribute('type') == 'power-switch') img.src = "img/power-red.svg"; 
        else if(theSwitch.getAttribute('type') == 'heater-switch') img.src = "img/fire-on.svg";
        else if(theSwitch.getAttribute('type') == 'service-switch') img.src = "img/alarm-on.svg";
        else if(theSwitch.getAttribute('type') == 'heater-circuit') img.src = "img/radiator-on.svg";
        else img.src = "img/power-red.svg"; 
      } else {
        if(theSwitch.getAttribute('type') == 'light-switch') img.src = "img/light-off.svg";
        else if(theSwitch.getAttribute('type') == 'power-switch') img.src = "img/power-green.svg";
        else if(theSwitch.getAttribute('type') == 'heater-switch') img.src = "img/fire-off.svg"; 
        else if(theSwitch.getAttribute('type') == 'service-switch') img.src = "img/alarm-off.svg"; 
        else if(theSwitch.getAttribute('type') == 'heater-circuit') img.src = "img/radiator-off.svg"; 
        else img.src = "img/power-green.svg"; 
      }

Editat de informer
Link spre comentariu
Acum 1 oră, Kreator a spus:

@informer si cum incarci in ESP?

Exista implementari de file system in flash inca de la ESP8266... nu-i problema sa ai script-urile ori incluse in "pagina" html ori ca fisier separat.

Acelasi lucru (pusu` in flash) e valabil si pt. eventualele fisiere .png ori .svg daca se doreste sa fie locale... daca se apeleaza la link-uri, cu atat mai putin e o problema... insa personal n-as face asta. 

 

Daca intrebarea se referea concret la cum incarci fisiere de care or fi ele, in platformio se rezuma la a le pune intr-un director /data in proiect... sper sa-mi amintesc bine dar parca si-n asa numitul "IDE Arduino" era tot cam asa ceva doar ca un pic mai complicat... nu ma pot abtine sa nu ma enervez de cate ori ma gandesc la "unealta" asta din urma...  :rade:

Editat de informer
Link spre comentariu
La 06.01.2022 la 19:06, x_dadu a spus:

Într-o pagină web găzduită pe module cu ESP folosesc iconuri online, cum ar fi un termometru alături de o valoare de temperatură cu linia de cod:

<i class="fas fa-thermometer-half" style="color:#059e8a;"></i>

Cum aș putea să fac să fie afișat un anumit icon din mai multe variante, funcție de valoarea temperaturii ? Ceva gen If ...then...

Nu este foarte complicat. Dar trebuie sa citesti putin ce variante de termometru ai la Font Awesome.
Asignezi un id tagului <i> . adica:

<i id="i1" class="fas fa-thermometer-half" style="color:#059e8a;"></i>



Apoi, in codul javascript postat de tine acum ceva timp, acolo unde faci:

document.getElementById("temperaturec").innerHTML = this.responseText;

poti aduga ceva de genul:
 

if(this.responseText<10)
   document.getElementById("i1").setAttribute("class","fas fa-thermometer-empty");
else if(this.responseText<30)
   document.getElementById("i1").setAttribute("class","fas fa-thermometer-half");
else 
   document.getElementById("i1").setAttribute("class","fas fa-thermometer-full");

Te poti juca si cu culorile.
Nu am lucrat cu ESP nici cu Font Awesome. Dar cam asa se face.
Citeste, fa ceva teste, si te astept cu realizari si intrebari.
Succes.

Link spre comentariu
Acum 53 minute, Kreator a spus:

ESP nu stie decat HTML. Cum se poate implementa JS in ESP, ca eu nu am reusit?

Multumesc!

 

Daca e sa luam asa ESP nu stie nici HTML, el stie doar sa serveasca acel HTML scris ca text catre browser iar browser-ul este cel care se apuca sa afiseze grafic acel HTML. Cu JS exact la fel, tu scrii functia sau ce vrei in javascript ca text si ESP-ul il trimite la browser iar browserul cu siguranta site ce sa faca cu JS. Ce a fost sugerat a fost sa se faca niste mici bucatele de JS care sa ajunga impreuna cu continutul HTML (ca text) la browser iar mai apoi browserul sa se ocupe cu afisat o iconita sau alta.

Editat de Bandi Szasz
Link spre comentariu
Acum 10 ore, Kreator a spus:

ESP nu stie decat HTML. Cum se poate implementa JS in ESP, ca eu nu am reusit?

ESP nu "stie" nici HTML nici Javascript.
ESP trimite catre browser un fisier oarecare. Daca fisierul contine cod html (eventual si js) browserul il trateaza ca atare.

LE: tot ce vezi tu acolo in ESP (codul html si javascript) se executa in browserul care acceseaza ESP.
Vad ca explicat si user Bandi Szasz anterior.

 

Editat de Vizitator
Link spre comentariu

Un exemplu sau un site in care se explica "ca la prosti" cum se face  imi puteti indica?

Am facut un termostat WIFI pt centrala (cu emitator si receptor radio pe 433 MHz), dar l-am facut doar cu html, si parca l-as infrumuseta putin.

Nu stiu html javascript, etc, si recunosc ca "site-ul" mi-a luat cel mai mult timp sa-l creez.

Va multumesc.

Editat de Kreator
Link spre comentariu

Eu unu nu mă descurc, dacă are cineva timp, oricând că nu e nicio grabă, să modifice acest cod pentru a afișa iconița temperaturii în 2 feluri diferite (de exemplu half și full) dacă temperatura este mai mică sau egal cu, să zicem, 25 respectiv alt icon dacă e mai mare de 25. Codul este un dht22 web server și l-am ales pur întâmplător, vreau să văd în ce constau modificările. Sursa codului este scrisă îm antet, nu-mi aparține:

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com/esp8266-dht11dht22-temperature-and-humidity-web-server-with-arduino-ide/
*********/

// Import required libraries
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

#define DHTPIN 5     // Digital pin connected to the DHT sensor

// Uncomment the type of sensor in use:
//#define DHTTYPE    DHT11     // DHT 11
#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

// current temperature & humidity, updated in loop()
float t = 0.0;
float h = 0.0;

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;    // will store last time DHT was updated

// Updates DHT readings every 10 seconds
const long interval = 10000;  

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP8266 DHT Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature</span> 
    <span id="temperature">%TEMPERATURE%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity</span>
    <span id="humidity">%HUMIDITY%</span>
    <sup class="units">%</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 10000 ) ;
</script>
</html>)rawliteral";

// Replaces placeholder with DHT values
String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return String(t);
  }
  else if(var == "HUMIDITY"){
    return String(h);
  }
  return String();
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  dht.begin();
  
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println(".");
  }

  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", String(t).c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", String(h).c_str());
  });

  // Start server
  server.begin();
}
 
void loop(){  
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you updated the DHT values
    previousMillis = currentMillis;
    // Read temperature as Celsius (the default)
    float newT = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    //float newT = dht.readTemperature(true);
    // if temperature read failed, don't change t value
    if (isnan(newT)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      t = newT;
      Serial.println(t);
    }
    // Read Humidity
    float newH = dht.readHumidity();
    // if humidity read failed, don't change h value 
    if (isnan(newH)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      h = newH;
      Serial.println(h);
    }
  }
}

 

Link spre comentariu
Acum 21 minute, x_dadu a spus:
<p>
	<!-- Aceste este un comentariu html. Am adaugat aici id="id-thermo" -->
    <i id="id-thermo" class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    
    <span class="dht-labels">Temperature</span> 
    <span id="temperature">%TEMPERATURE%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity</span>
    <span id="humidity">%HUMIDITY%</span>
    <sup class="units">%</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").innerHTML = this.responseText;
      
      /* Aceste este un comentariu java. Am adaugat aici scriptul java care modifica dinamic icons */
		if(this.responseText<=25)
   			document.getElementById("id-thermo").setAttribute("class","fas fa-thermometer-half");
		else
			document.getElementById("id-thermo").setAttribute("class","fas fa-thermometer-full");
      
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;


 


Cauta in codul de mai sus dupa "comentariu"
Nu am cum sa testez dar cred ca este ok asa.

 

Editat de Vizitator
Link spre comentariu

Am testat eu acum, merge cum trebuie doar dacă nu dau refresh manual în browser. Dacă dau manual refresh apare mereu iconul cu half, iar după ce trec cele 10 secunde cum este în funcția setInterval când face el refreshu automat, apare iconița care trebuie.

Link spre comentariu

Este normal sa se comporte asa. Prima citire de temperatura se face dupa intervalul setat. 10 secunde. Asa este conceput programul.
Poti sterge atributul class="thermo..." din linia <i id=" " ...></i> pentru a nu mai aparea nici un fel de termometru pana nu se face prima citire.

Sau se poate modifica programul ca sa apeleze ,imediat dupa incarcarea paginii web, functia de citire date din ESP.

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