Problema incrementare e decrementare una variabile

salve a tutti ho un problema con questo codice, esegue un conta posti per un parcheggio , il problema è che il codice incrementa di 1 ma quando deve decrementare decrementa di 10 ad esempio va a 90 !!

    lcd.setCursor (0 ,0);
    lcd.print("N. posti:");
    lcd.setCursor(10, 0);
    lcd.print(conta);
  
  pressioneP1 = digitalRead(pulsanteuscita);
  if (pressioneP1 == LOW)
  {
   servouscita.write(-90);
  delay(3000);
   conta++;
    servouscita.write(90);
  }
   pressioneP2 = digitalRead(pulsanteentrata);
  if (pressioneP2 == LOW)
  {
   servoentrata.write(-90);
  delay(3000);
    servoentrata.write(90);
    --conta ;
   }
 }

samuelburatti: salve a tutti ho un problema con questo codice, esegue un conta posti per un parcheggio , il problema è che il codice incrementa di 1 ma quando deve decrementare decrementa di 10 ad esempio va a 90 !!

    lcd.setCursor (0 ,0);
    lcd.print("N. posti:");
    lcd.setCursor(10, 0);
    lcd.print(conta);
  
  pressioneP1 = digitalRead(pulsanteuscita);
  if (pressioneP1 == LOW)
  {
   servouscita.write(-90);
  delay(3000);
   conta++;
    servouscita.write(90);
  }
   pressioneP2 = digitalRead(pulsanteentrata);
  if (pressioneP2 == LOW)
  {
   servoentrata.write(-90);
  delay(3000);
    servoentrata.write(90);
    --conta ;
   }
 }

Ma da quanti posti vuoi partire? Non hai assegnato un valore iniziale alla variabile del conta

Ciao, conta è unsigned int? Poi prova a mettere

conta--;

anzichè --conta Stefano

cam9500: Poi prova a mettere

conta--;

anziché --conta

E che cambia ? È da solo su una riga quindi che faccia il pre-decremento o il post-decremento non cambia nulla ... ... sempre conta = conta -1 fa !

Guglielmo

par strano che non vada: metti il codice completo con le dichiarazioni e tutto. Sarei propenso a pensare ad un bounce del bottone ma il delay di 3 secodi dovrebbe ampiamente scongiurare il caso.... invece non è che per caso il display rimane sporco del valore precedente? ossia stampi 10 poi stampi 9 ma rimane lo 0 del 10?

qsecofr: non è che per caso il display rimane sporco del valore precedente? ossia stampi 10 poi stampi 9 ma rimane lo 0 del 10?

Mi sa che c'hai preso ;).

Kind3rin: Ma da quanti posti vuoi partire? Non hai assegnato un valore iniziale alla variabile del conta

Scusami non lo messo ma all'inizio ho messo Int conta = 10

qsecofr: par strano che non vada: metti il codice completo con le dichiarazioni e tutto. Sarei propenso a pensare ad un bounce del bottone ma il delay di 3 secodi dovrebbe ampiamente scongiurare il caso.... invece non è che per caso il display rimane sporco del valore precedente? ossia stampi 10 poi stampi 9 ma rimane lo 0 del 10?

Ma quando invece aumento Va ad 11

E scommetto che quando decrementi da 12 va lo stesso ad 11 e poi a 10, ma poi a 90.

Devi stampare uno spazio dopo il numero, in poche parole.

SukkoPera:
Mi sa che c’hai preso ;).

ogni tanto… :sunglasses:

comunque ammesso e non concesso che c’abbia preso c’ho preso perchè evidentemente ci sono cascato 2000 volte dentro…
:’(

gpb01:
E che cambia ? È da solo su una riga quindi che faccia il pre-decremento o il post-decremento non cambia nulla …
… sempre conta = conta -1 fa !

Guglielmo

ehhh nel dubbio…
… poi in vb6 queste sintassi strane non ci sono :grin:

Stefano

cam9500: .... poi in vb6 queste sintassi strane non ci sono

Guglielmo

Ehhh non avevo dubbi: sono un tecnico da "battaglia" porta pazienza !

.... tutte le volte che leggo il motto di Astrobeed mi viene un brivido alla schiena!

SukkoPera: E scommetto che quando decrementi da 12 va lo stesso ad 11 e poi a 10, ma poi a 90.

Devi stampare uno spazio dopo il numero, in poche parole.

Dove lo devo inserire lo spazio?

SukkoPera:
E scommetto che quando decrementi da 12 va lo stesso ad 11 e poi a 10, ma poi a 90.

Devi stampare uno spazio dopo il numero, in poche parole.

questo è il codice completo

#include "dht11.h"
#include "RTClib.h"
#include <Servo.h> 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
RTC_DS1307 RTC;

dht11 DHT;
#define DHT11_PIN 4 
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
Servo servouscita;
Servo servoentrata;
int conta;
int pulsanteuscita = 7; //button pin, connect to ground to move servo
int pulsanteentrata = 6;
int pressioneP1 = 0;
int pressioneP2 = 0;
int led_accessoconsentito = 22;
int led_accessonegato = 24;
int striscialed = 30;
int luminosita;
int pinFotoresistenza = A0;
int lampione1 = 34;
int lampione2 = 35;
int lampione3 = 36;
int lampione4 = 37;
int irrigatore1 = 38;
int irrigatore2 = 39;
int irrigatore3 = 40;
int irrigatore4 = 41;
int irrigatore5 = 42;
int irrigatore6 = 43;
byte orainizioirrigazione = 20;
byte minutiinizioirrigazione = 23;
byte orafineirrigazione = 20;
byte minutifineirrigazione = 24;

byte confermainizio = 0;
byte acceso = 0;
byte confermafine = 0;


void setup() 
{ lcd.begin(16, 2);
lcd.setBacklight(HIGH);

  conta = 10 ;
  
  pinMode(pulsanteuscita, INPUT);
  pinMode(pulsanteentrata, INPUT);
  
 servouscita.attach(9);
 servoentrata.attach(10);
 servouscita.write(90);
 servoentrata.write(90);
 digitalWrite(pulsanteuscita, HIGH);
 digitalWrite(pulsanteentrata, HIGH);
 pinMode(28, OUTPUT);
 pinMode(led_accessoconsentito, OUTPUT);
 pinMode(led_accessonegato, OUTPUT);
 pinMode(pinFotoresistenza, INPUT);
 pinMode(striscialed, OUTPUT);
 pinMode(lampione1, OUTPUT);
 pinMode(lampione2, OUTPUT);
 pinMode(lampione3, OUTPUT);
 pinMode(lampione4, OUTPUT);
 pinMode(irrigatore1, OUTPUT);
 pinMode(irrigatore2, OUTPUT);
 pinMode(irrigatore3, OUTPUT);
 pinMode(irrigatore4, OUTPUT);
 pinMode(irrigatore5, OUTPUT);
 pinMode(irrigatore6, OUTPUT);
 Serial.begin(9600);
 delay(2000);
 Serial.println(F("Type,\tstatus,\tHumidity (%),\tTemperature (C)"));
 Wire.begin();
 RTC.begin();
 if (! RTC.isrunning())
 {
  Serial.println(F("L'rtc non è attivo"));
 }

Wire.beginTransmission(0x68);
Wire.write((byte)0x00);
Wire.write((byte)0x55);
Wire.write((byte)0x22); //2° byte MINUTI da 0x00 a 0x59
Wire.write((byte)0x80 | 0x20); //3° byte ORE da 0x00 a 0x24
Wire.write((byte)0x02); //4° byte GIORNO della settimana da 0x01 a 0x07
Wire.write((byte)0x07); //5° byte GIORNO del mese da 0x00 a 0x31
Wire.write((byte)0x06); //6° byte MESE da 0x00 a 0x12
Wire.write((byte)0x16); //7° byte ANNO 0x00 a 0x99
Wire.endTransmission();
  }
void loop() 
{ 
  { 
  
      int chk;
  Serial.print(F("DHT11, \t"));
  chk = DHT.read(DHT11_PIN);    // READ DATA
  switch (chk){
    case DHTLIB_OK:  
                Serial.print("OK,\t");
                break;
  }
 // DISPLAT DATA
  Serial.print(DHT.humidity,1);
  Serial.print(F(",\t"));
  Serial.println(DHT.temperature,1);
lcd.setCursor(12, 1);
  lcd.println(DHT.temperature);
    lcd.setCursor(14, 1);
   lcd.print("'C");

}

  {
    
  pressioneP1 = digitalRead(pulsanteuscita);
  if (pressioneP1 == LOW)
  {
   servouscita.write(-90);
  delay(3000);
   conta= conta + 1;
    servouscita.write(90);
  }
   pressioneP2 = digitalRead(pulsanteentrata);
  if (pressioneP2 == LOW)
  {
   servoentrata.write(-90);
  delay(3000);
    servoentrata.write(90);
    conta= conta - 1 ;
   }
   lcd.setCursor (0 ,0);
    lcd.print("N. posti:");
    lcd.setCursor(10, 0);
    lcd.print(conta );
  
 }

{
  luminosita = analogRead(pinFotoresistenza);
if(luminosita <300)
{
  Serial.print("Accendo led");
  Serial.println(luminosita);
  digitalWrite(striscialed,HIGH);  
   digitalWrite(lampione1,HIGH);
digitalWrite(lampione2,HIGH);
digitalWrite(lampione3,HIGH);
digitalWrite(lampione4,HIGH);


}
else 
{
    digitalWrite(striscialed,LOW);  
   digitalWrite(lampione1,LOW);
digitalWrite(lampione2,LOW);
digitalWrite(lampione3,LOW);
digitalWrite(lampione4,LOW);
}

Serial.print("Valore luminosita");
Serial.println(luminosita);

  }
{ 
  //inizzializza la trasmissione partendo
//dall'indirizzo 0x00
Wire.beginTransmission(0x68);
Wire.write((byte)0x00);
Wire.endTransmission();
 
//richiedo 7 byte dal dispositivo con
//indirizzo 0x68
Wire.requestFrom(0x68, 7);
//regupero i 7 byte relativi ai
//corrispondenti registri
byte secondi = Wire.read();
byte minuti = Wire.read();
byte ora = Wire.read();
byte giorno_sett = Wire.read();
byte giorno_mese = Wire.read();
byte mese = Wire.read();
byte anno = Wire.read();
 
Serial.print("Orario corrente: ");
Serial.print(ora, HEX);
Serial.print(":");
Serial.print(minuti, HEX);
Serial.print(":");
Serial.println(secondi, HEX);
 
Serial.print("Giorno della settimana: ");
Serial.println(giorno_sett, HEX);
 
Serial.print("Data corrente: ");
Serial.print(giorno_mese, HEX);
Serial.print("/");
Serial.print(mese, HEX);
Serial.print("/");
Serial.println(anno, HEX);
Serial.println();
lcd.setCursor(0, 1);
lcd.print("Ora:");
lcd.setCursor(5, 1);
lcd.print(ora, HEX);
lcd.print(":");
lcd.print(minuti, HEX);

 
DateTime now = RTC.now();

if (now.second() == 0) {
  if (acceso == 0) {
    controllatempoinizio();
    } else {
      controllatempofine();
     
    }

    if (confermainizio == 1) {
      accendiirrigatori();
    }
    if (confermafine == 1) {
      spegniirrigatori();
    }
  }
 }
 delay(1000);
 } 
 
byte controllatempoinizio() {
  
   DateTime now = RTC.now();
  if (now.hour() == orainizioirrigazione && now.minute() == minutiinizioirrigazione) {
    confermainizio = 1;  // If our start hour and minute match the current time, set 'on' flags
    acceso = 1;
  } else {
    confermainizio = 0;  // Otherwise we don't need to power up the lights yet
  }
  
  return confermainizio; // Return the status for powering up
} 
byte controllatempofine() {
 DateTime now = RTC.now();
  if (now.hour() == orafineirrigazione && now.minute() == minutifineirrigazione) {
     confermafine = 1;
     acceso = 0;  
     } else {
      confermafine = 0;
     }
    
     return confermafine;
}
 
void accendiirrigatori() {
  digitalWrite(irrigatore1, HIGH);
  digitalWrite(irrigatore2, HIGH);
  digitalWrite(irrigatore3, HIGH);
  digitalWrite(irrigatore4, HIGH);
  digitalWrite(irrigatore5, HIGH);
  digitalWrite(irrigatore6, HIGH);
  
 
  }
void spegniirrigatori() {
  digitalWrite(irrigatore1, LOW);
  digitalWrite(irrigatore2, LOW);
  digitalWrite(irrigatore3, LOW);
  digitalWrite(irrigatore4, LOW);
  digitalWrite(irrigatore5, LOW);
  digitalWrite(irrigatore6, LOW);

 }

un altra domanda come faccio che il valore conta non possa superare il 10 ?

Su, sono sicuro che puoi arrivarci da solo, a dove stampi la variabile in questione!

SukkoPera: Su, sono sicuro che puoi arrivarci da solo, a dove stampi la variabile in questione!

Ti ho mandato un Pm ma comunque ho messo spazi ovunque ma non cambia nulla

Non rispondo ai PM.

La questione è semplice: quando scrivi 10 scrivi due cifre. Se poi scrivi 9 senza cancellare tutto lo schermo, il 9 va a "coprire" l'1, ma nulla va a coprire lo 0, per cui questo rimane lì e sembra che tu abbia scritto 90. Per cui se ogni volta che scrivi il valore scrivi anche uno spazio subito dopo, questo spazio andrà a coprire lo 0, effettivamente cancellandolo.

Ora guarda il tuo codice e cerca di capire da solo dove metterlo. Se non ci riesci fermati un po' a STUDIARE il C e Arduino, perché difficilmente riuscirai a fare qualunque altra cosa.

SukkoPera: Non rispondo ai PM.

La questione è semplice: quando scrivi 10 scrivi due cifre. Se poi scrivi 9 senza cancellare tutto lo schermo, il 9 va a "coprire" l'1, ma nulla va a coprire lo 0, per cui questo rimane lì e sembra che tu abbia scritto 90. Per cui se ogni volta che scrivi il valore scrivi anche uno spazio subito dopo, questo spazio andrà a coprire lo 0, effettivamente cancellandolo.

Ora guarda il tuo codice e cerca di capire da solo dove metterlo. Se non ci riesci fermati un po' a STUDIARE il C e Arduino, perché difficilmente riuscirai a fare qualunque altra cosa.

ho risolto cosi mettondo

lcd.print(conta);
lcd.print(" ");

ti volevo chiedere invece come faccio a fare che il valore conta non superi il 10

samuelburatti: ho risolto cosi mettondo

lcd.print(conta);
lcd.print(" ");

ti volevo chiedere invece come faccio a fare che il valore conta non superi il 10

  1. esatto
  2. devi TU controllare se hai superato 10 e decidere cosa fare, di solito lo forzi a 10.
conta++;
if(conta>10) conta=10;