Aiuto creazione sketch per aumentare una variabile

Ciao a tutti… avrei bisogno del vostro przioso aiuto.
sto creando un sistema di controllo per l’acquario con misurazione del ph e temperatura. Devo impostare la soglia di ph alla quale fare in modo di attivare o meno una elettrovalvole e fin qui tutto ok!! il problema sorge quando inserisco nello sketch la parte relativa alla creazione dei tasti per aumentare o diminuire la variabile alla qua.le si riferisce il ph… (utlizzo un sainsmart utft da 3,2".
questo lo sketch:

#include <UTFT_Buttons.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <tinyFAT.h>
#include <UTFT.h>
#include <UTouch.h>


#define ONE_WIRE_BUS 12

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int LED=13;	                //Pin13 = LED
// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

UTFT         myGLCD(ITDB32S, 38, 39, 40, 41);   // Remember to change the model parameter to suit your display module!

// Set up UTouch...
UTouch        myTouch(6,5,4,3,2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);
#define SensorPin 0          //pH meter Analog output to Arduino Analog Input 0
unsigned long int avgValue;  //Store the average value of the sensor feedback
float b;
float phRif = 4.4;
int buf[10],temp;
int but1, but2, pressed_button;

void setup()

{

  // start serial port

  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  pinMode(LED, OUTPUT);			  //LED set to output
  Serial.begin(9600);  
  Serial.println("Ready");    //Test the serial monitor

}

void loop()


{ 

  for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  { 
    buf[i]=analogRead(SensorPin);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }

  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  double phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;                      //convert the millivolt into pH value
  
    Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");
  myGLCD.print("Val Ph.", 1, 1);
  myGLCD.printNumF(phValue, 2, 180, 1);
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
  myGLCD.print("Temp. Acqua", 1, 40);
  myGLCD.printNumF(sensors.getTempCByIndex(0), 2, 180, 40);
  myGLCD.print("Riferimento Ph", 1, 100);
  myGLCD.printNumF(phRif, 2, 140, 100);
  
  
    if (phValue >= phRif)                        //temperatura maggiore o uguale a valore ph impostato led spento
    {
      digitalWrite (LED, LOW);	
      Serial.print("Relè Disattivato");    
      myGLCD.print("Rele' Disattivato", 1, 130);
    }
    else	if (phValue < phRif)                //temperatura minore o uguale a valore ph impostato led acceso
    {
      digitalWrite (LED, HIGH); 
      Serial.print("Relè Attivato");   
      myGLCD.print("Rele' Attivato", 1, 130);
    }
    
}

e questi i comandi che non so dove andare a mettere :

boolean default_colors = true;
  myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_WHITE, VGA_RED, VGA_BLUE);
  but1 = myButtons.addButton( 120,  140, 40,  70, "Button 1");
  but2 = myButtons.addButton( 10,  60, 300,  30, "Button 2");
   myButtons.drawButtons();
  myGLCD.print("You pressed:", 110, 205);
  while(1) 
  {
    if (myTouch.dataAvailable() == true)
    {
      pressed_button = myButtons.checkButtons();
      
       if (pressed_button==but1)
        myGLCD.print("Button 1", 110, 220);
      if (pressed_button==but2)
        myGLCD.print("Button 2", 110, 220);
     }
  }

grazie mille a tutti!!!

nessuno vuole aiutarmi?
non so veramente come integrare queste due parti!!
grazie

Non conosco quello schermo e non conosco la libreria.
A parte cose strane come il print su serial prima del serial begin…
Posso solo suggerirti di prendere il pezzo che nell’esempio è dentro il while e portarlo all’interno di una funzione che puoi chiamare controllaSchermo() e che richiami ad ogni loop o ogni 10 loop insomma dipende vedi tu.

Ammettiamo ora che but 1 sia quello per aumentare il ph e but2 sia quello per diminuirlo puoi fare una cosa del genere:

if (pressed_button==but1)
       {
        phRif = phRif + 0.1;
           if (phRif > MASSIMOPOSSIBILE) {phRif = MASSIMOPOSSIBILE}
        myGLCD.print(phRif, dove, deveessere);
        }
if (pressed_button==but2)
        {
        phRif = phRif - 0.1;
           if (phRif < MINIMOPOSSIBILE) {phRif = MINIMOPOSSIBILE}
        myGLCD.print(phRif, dove, deveessere);
        }

E’ solo un esempio, ovviamente si dovrà un po’ raffinare ed adattare.

Grazie mille ma scusa l'ignoranza: con quale funzione richiemo la funzione controllaSchermo??

stecamux:
Grazie mille ma scusa l’ignoranza: con quale funzione richiemo la funzione controllaSchermo??


controllaSchermo();

Ho dovuto cambiare programmi in seguito all’incapacità di inserire i tasti…quindi o modificato il tutto inserendo un quadrato dove scrivo il simbolo + e uno con - alla pressione della parte di schermo corrispondente la variabile dovrebbe aumentare o diminuire … questo però non accade… dove sbaglio.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <tinyFAT.h>
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>

#define ONE_WIRE_BUS 12

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int LED=13;	                //Pin13 = LED
// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

UTFT         myGLCD(ITDB32S, 38, 39, 40, 41);   // Remember to change the model parameter to suit your display module!

// Set up UTouch...
UTouch        myTouch(6,5,4,3,2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);
#define SensorPin 0          //pH meter Analog output to Arduino Analog Input 0
unsigned long int avgValue;  //Store the average value of the sensor feedback
float b;
float phRif = 4.4;
int buf[10],temp,x,y;
int butmenu;

void setup()

{

  // start serial port

  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  pinMode(LED, OUTPUT);			  //LED set to output
  Serial.begin(9600);  
  Serial.println("Ready");    //Test the serial monitor
  UTFT_Buttons  myButtons(&myGLCD, &myTouch);
}

void loop()


{ 

  for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  { 
    buf[i]=analogRead(SensorPin);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }




  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  double phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;                      //convert the millivolt into pH value

    Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");
  myGLCD.print("Val Ph.", 1, 1);
  myGLCD.printNumF(phValue, 2, 180, 1);
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
  myGLCD.print("Temp. Acqua", 1, 40);
  myGLCD.printNumF(sensors.getTempCByIndex(0), 2, 180, 40);
  myGLCD.print("Rif. Ph", CENTER, 200);
  myGLCD.printNumF(phRif, 2, CENTER, 210);
  myGLCD.drawRect(10,160,50,200);
  myGLCD.print("+", 25, 180);


  if (myTouch.dataAvailable())
  {
    myTouch.read();
    x= myTouch.getX();
    y=myTouch.getY();
    if ((x>=10)&&(x<=50))
    {
      if ((y>=160) && (y<=200))
      {
        phRif = phRif+0,1;
        Serial.print(phRif);
        return phRif;
      }
      myGLCD.printNumF(phRif, 2, CENTER, 210); 
    }
  }


  { 


    if (phValue >= phRif)                        //temperatura maggiore o uguale a valore ph impostato led spento
    {
      digitalWrite (LED, LOW);	
      Serial.print("Relè Disattivato");    //led acceso
      myGLCD.print("Rele' Disattivato", 1, 100);
    }
    else	if (phValue < phRif)                //temperatura minore o uguale a valore ph impostato led acceso
    {
      digitalWrite (LED, HIGH); 
      Serial.print("Relè Attivato");    //led spento
      myGLCD.print("Rele' Attivato", 1, 100);
    }


  }
}

il sistema dopo il caricamento non legge la pressione dei pixel e non aumenta la variabile come dovrebbe fare.
idee??

Potrebbe dipendere dal fatto che...

phRif = phRif+0,1;

andrebbe invece con:

phRif = phRif+0.1;

cavolo... grazie....che scemo...mi ero fissato a vedere tutto tranne che la cosa ovvia!!!!!!

Ma come mai secondo voi se circoscrivo la pressione dei tasti al quadrato che ho disegnato lo skech non funziona mentre invece se lascio tutto lo schermo la variabile aumenta??

Ciao.
ci sono riuscito. Ora funzione.
unico inghippo è una cosa strana: se imposto la variabile di riferimento phRif vicino al valore che il sensore ph sta leggendo in quel momento il pin 13 di arduino (che ho impostato in output) si accende e si spenge continuamente in quanto il ph letto dal sensore inizia ad oscillare di 1/10 di grado ph avanti e indietro apparentemente senza controllo!

#include <OneWire.h>
#include <DallasTemperature.h>
#include <tinyFAT.h>
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>

#define ONE_WIRE_BUS 12

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int LED=13;	                //Pin13 = LED
// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

UTFT         myGLCD(ITDB32S, 38, 39, 40, 41);   // Remember to change the model parameter to suit your display module!

// Set up UTouch...
UTouch        myTouch(6,5,4,3,2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);
#define SensorPin 0          //pH meter Analog output to Arduino Analog Input 0
unsigned long int avgValue;  //Store the average value of the sensor feedback
float b;
float phRif = 4.4;
int buf[10],temp,x,y;
int butmenu;

void setup()

{

  // start serial port

  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  pinMode(LED, OUTPUT);			  //LED set to output
  Serial.begin(9600);  
  Serial.println("Ready");    //Test the serial monitor
  UTFT_Buttons  myButtons(&myGLCD, &myTouch);
}

void loop()


{ 

  for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  { 
    buf[i]=analogRead(SensorPin);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }




  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  double phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;                      //convert the millivolt into pH value

    Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");
  myGLCD.print("Val Ph.", 1, 1);
  myGLCD.printNumF(phValue, 2, 180, 1);
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
  myGLCD.print("Temp. Acqua", 1, 40);
  myGLCD.printNumF(sensors.getTempCByIndex(0), 2, 180, 40);
  myGLCD.print("Rif. Ph", CENTER, 200);
  myGLCD.printNumF(phRif, 2, CENTER, 210);
  myGLCD.setFont(BigFont);
  myGLCD.drawRect(10,160,50,200);
  myGLCD.print("+", 27, 178);
  myGLCD.drawRect(270,160,310,200);
  myGLCD.print("-", 288, 178);
  myGLCD.setFont(SmallFont);
  if (myTouch.dataAvailable()== true)
  {
    myTouch.read();
    x= myTouch.getX();
    y=myTouch.getY();
     if ((y>=160) && (y<=200))
    {
      if ((x>=10)&&(x<=50))
      {
        phRif = phRif+0.05;
        Serial.print(phRif);
        myGLCD.printNumF(phRif, 2, CENTER, 180);
        delay (500);
        myGLCD.print("       ", CENTER, 180); 
      }
      else if ((x>270)&&(x<310))
      {
        phRif = phRif-0.05;
        myGLCD.printNumF(phRif, 2, CENTER, 180);
        delay (500);
        myGLCD.print("       ", CENTER, 180); 
      }
    }
  }

  { 
    if (phValue >= phRif)                        //temperatura maggiore o uguale a valore ph impostato led spento
    {
      digitalWrite (LED, LOW);	
      Serial.print("Relè Disattivato");    //led acceso
      myGLCD.print("Rele' Disattivato", 1, 100);
    }
    else	if (phValue < phRif)                //temperatura minore o uguale a valore ph impostato led acceso
    {
      digitalWrite (LED, HIGH); 
      Serial.print("Relè Attivato");    //led spento
      myGLCD.print("Rele' Attivato", 1, 100);
    }
  }
}

Qualche idea???
grazie

nessuno??

I float sono imprecisi. Alle volte ti ritrovi delle cifre decimali non richieste, comparse solo per le approssimazioni usate per le conversioni. Quindi una lettura di 4.50 non è sempre è 4.50, per esempio: potrebbe anche darsi che una volta valga 4.50634 e quella dopo 4.50563. E così vale per il valore usato come riferimento. Tu potresti porre phRef a 4.51 ma non sai a priori come il numero verrà salvato. Potrebbe essere 4.499435 oppure 4.500099 ecc

Cerca di dare un range meno ristretto per i tuoi valori oppure fa una cosa saggia, converti i float in interi.
Invece di avere ad esempio un numero tipo 4.52 usa 452 oppure invece di 4.2 usa 420 oppure 42 (a seconda della precisione ottenuta).

Grazie per la risposta ma per quello che posso capire io non sembra che il problema sia legato al tipo di variabile.
Mi spiego meglio. Se la variabile phValue ha valore 4,40 o 4,39876 a me poco interessa ai fini della gestione della vasca.
l problema è che sembra, una volta in cui le due variabili si " accavallano" che la phValue si modifica sensa senso (cosa che non dovrebbe avvenire)
Se io la leggo a 4,19 (e oscilla di 0,01 o 0,02 in base alle varie letture non is discosta molto. nel momento in cui cambio la variabile phRif la phValue ha una variazione di 0,15/0,2 punti.
Non capisco come sia possibile visto che sono valori indipendenti.
Non so se l’inghippo risiede nella lettura e immagazinamento delle letture che il sensore fa per creare una media di valori in questa parte di sketch:

 for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  { 
    buf[i]=analogRead(SensorPin);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }




  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  double phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;

ma comunque la parte relativa all’accenzione e spengimento del pin led non dovrebbe farla variare.

 { 
    if (phValue < phRif)                        //temperatura maggiore o uguale a valore ph impostato led spento
    {
      digitalWrite (LED, LOW);	
      Serial.print("Relè Disattivato");    //led acceso
      myGLCD.print("Disattivato", 40, 100);
    }
    else	if (phValue >= phRif)                //temperatura minore o uguale a valore ph impostato led acceso
    {
      digitalWrite (LED, HIGH); 
      
      Serial.print(" Attivato");    //led spento
      myGLCD.print("Attivato", 40, 100);
    }
  }

grazie

ps: ho provato anche come suggerito ad usare le int ma il problema persiste.......ho provato ad staccare i vari componenti uno ad uno e la cosa sembra dipendere dal rele che ho inserito nel pin 10 che deve controllare l'elettrovalvola. non appena il pin del relè entra in hight sembra il sensore del ph sballa. come risolvo e quale puo essere il problema??
grazie mille

sto impazzendo