Ciao a tutti ... ![]()
Non sono esperto, sto cercando di creare uno script facendo un po' di copia/incolla qua e la.
In sostanza ho un LCD dove vengono indicate temperatura e umidità (ad un intervallo regolato con "millis") e un "Rotary Encoder" dovrebbe permettermi di scegliere un valore.
Premetto che il Rotary Encoder funziona abbastanza bene, dato che con lo sketch di esempio le letture vengono fuori più o meno bene.
Il problema nasce quando sposto tutto nel mio sketch, le letture diventano imprecise, i valori aumentano e diminuiscono come pare a loro.
Ho lasciato tutto invariato rispetto agli esempi, pin, nome variabili e tutto quanto. Credo ci sia qualche conflitto con le misurazioni, o con i MILLIS.
Dei MILLIS ho bisogno, perché altrimenti le letture di umidità e temperatura vengono sballate e delay mi bloccherebbe tutto.
Insomma quando giro il ROTARY a destra talvolta non mi varia nulla, altre va avanti di uno e indietro di due!
Sapreste darmi un aiuto così ad occhio e croce?
Grazie mille!!!
P.S. Non fate caso al codice commentato ... erano prove, ma forse vi saranno utili per capire quali tentativi (errati) ho fatto!
EDIT
Ho appena scoperto che, girando il Rotary molto, molto lentamente, le letture sono buone. Devo in sostanza accompagnarlo tra uno "scatto" e l'altro. In questo modo, i valori variano in maniera corretta!
//INIZIO PREPARAZIONE DEL DISPLAY
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define outputA 6
#define outputB 7
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define DHT11PIN 2
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
// FINE PREPARAZIONE DEL DISPLAY
// INIZIO PREPARAZIONE DEL SENSORE
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
float umidita = 0;
float centigradi = 0;
// FINE PREPARAZIONE DEL SENSORE
// INIZIO IMPOSTAZIONE TIMER INTERVALLO RILEVAZIONI
unsigned long previousMillis = 0;
const long interval = 6000;
// FINE IMPOSTAZIONE TIMER INTERVALLO RILEVAZIONI
// INIZIO IMPOSTAZIONE ROTARY
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
// FINE IMPOSTAZIONE ROTARY
void setup() {
Serial.begin(9600); //avviamo la comunicazione seriale
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // accendimo lo schermo
display.clearDisplay(); // cancelliamo lo schermo parte 1
display.display(); // cancelliamo lo schermo parte 2
delay (1500);
pinMode (outputA,INPUT); // definiamo la prima rotazione del pomello
pinMode (outputB,INPUT); // definiamo la seconda rotazione del pomello
aLastState = digitalRead(outputA);
}
void loop() {
unsigned long currentMillis = millis(); //impostazioni timer intervallo
// INIZIO ROTARY
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // Updates the previous state of the outputA with the current state
// FINE ROTARY
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// INIZIO RILEVAMENTO UMIDITÀ E TEMPERATURA
int chk = DHT11.read(DHT11PIN);
Serial.print("Lettura sensore: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
}
// Serial.print("Umidita' (%): ");
// Serial.print((float)DHT11.humidity);
umidita = DHT11.humidity; // valore umidità assegnato a questa variabile
// Serial.print("Temperatura (C): ");
// Serial.println((float)DHT11.temperature, 2);
// delay(2000);
// FINE RILEVAMENTO UMIDITÀ E TEMPERATURA
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.clearDisplay();
display.print("Umidita': % ");
display.println(umidita);
display.setCursor(0,10);
display.print("Temperatura: ");
display.println((float)DHT11.temperature, 2);
display.setCursor(0,20);
display.print("Position: ");
display.println(counter);
display.display();
}