ezioall
milliWatt Gruppo:Utente Messaggi:3
Stato:
| Inviato il: 20/03/2023 14:12:17
|
CITAZIONE (ezioall, 20/03/2023 14:02:16 )
ciao ho realizzato questo progetto come codice solo che ho un problema
avendo altri sensori attaccati, BME,sensore Luce e un display 16x2 i2c ed un rele per chiudere la tenda sul terrazzo quando diventa buio ho quando il vento diventa eccessivo
ho creato un loop per lcd con varie pagine che si alernano ma la variabile Kmora o Node non riesco a visualizzarle in quanto forse sono io incapace come posso rendere visibile queste variabili nel Loop del display
ci sto se volete posso postare il codice completo
qui il codice
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
#define LCD_SENSORS 0
#define LCD_BME 1
#define LCD_INIT 3
#define LCD_ANEM 2
int lcdPage = LCD_INIT; //calcolo visualizzazione pagine
unsigned long int lastPageChange = 0;
unsigned long int lcdPageChange = 10000;
boolean display_setup = false;
const float Pi = 3.141593; // Pigreco
const float raggio = 0.06; // raggio dell'anemometro in metri
const int reedPin = 2; // pin assegnato al contatto reed
int Statoreed = 0; // variabile per la lettura del contatto
int Statoreed_old = 0; // variabile per evitare doppio conteggio
int Conteggio = 0;// variabile che contiene il conteggio delle pulsazioni
unsigned long int TempoStart = 0; // memorizza i millisecondi dalla
//prima pulsazione conteggiata
unsigned long int Tempo = 0; // per conteggiare il tempo trascorso dalla prma pulsazione
unsigned long int TempoMax = 2000;// numero di millisecondi (2 seondi)
//per azzerare il conteggio e calcolare la Velocità
// così non si conteggiano brevi folate di vento
String senStatus;
//String sensLuce;
float node=0; //questo non va bene
int sensorValue = analogRead(A7);
int ledPin = 3; // select the pin for the LED
void loopBme() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println("*C");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println("%");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println("hPa");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println("m");
Serial.println();
delay(1000);
}
void loopTenda() {
int sensorValue = analogRead(A7);
int ledPin = 3; // select the pin for the LED
Serial.println(sensorValue);
if (sensorValue > 500) {
digitalWrite(ledPin, HIGH);
senStatus = "ON";
} else {
digitalWrite(ledPin, LOW);
senStatus = "OFF";
}
}
/** LCD **/
void lcdDispatch() {
unsigned long int ora = millis();
if (ora > lcdPageChange + lastPageChange) {
lastPageChange = ora;
switch (lcdPage) {
case LCD_INIT:
printHome();
break;
case LCD_SENSORS:
printTem();
break;
case LCD_BME:
printBme();
break;
case LCD_ANEM:
printAnem();
break;
default:
break;
}
}
}
void printHome() {
lcd.setCursor(0, 0);
lcd.print("STAZIONE METEO");
lcd.setCursor(0, 1);
lcd.print(" CASA DI EZIO");
lcdPage =LCD_SENSORS;
}
void printTem() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperat:");
lcd.print(bme.readTemperature());
//lcd.write(1);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidita:");
lcd.print(bme.readHumidity());
lcd.print("%");
lcd.display();
lcdPage = LCD_BME;
}
void printBme() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pressure: ");
lcd.print(bme.readPressure() / 100.0F);
lcd.print("hPa");
lcd.setCursor(0, 1);
lcd.print("Altitude: ");
lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
lcd.print("m");
lcd.display();
lcdPage = LCD_ANEM;
}
void printAnem() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("REL TENDA");
lcd.setCursor(0, 1);
lcd.print("Km/oraANEM:");
lcd.setCursor(12, 0);
lcd.print (senStatus);
lcd.setCursor(12, 1);
lcd.print(node); //non si visualizza niente
delay(1000);
lcd.display();
lcdPage = LCD_SENSORS;
}
void Anemo ()
{
Statoreed = digitalRead(reedPin); // legge il contatto reed
if (Statoreed != Statoreed_old) // si verifica se è cambiato
{
Statoreed_old = Statoreed; // se SI si aggiorna lo stato
if (Statoreed == HIGH) // si controlla SE è alto ( passaggio magnete)
{
if (Conteggio == 0){ TempoStart = millis();} // se E' il primo passaggio
// si memorizza il tempo di partenza
Conteggio = Conteggio + 1; // si aggiorna il contatore
Tempo = ( millis() - TempoStart); // si conteggia il tempo trascorso dallo start conteggio
if (Tempo >= TempoMax) // se il tempo trascorso è maggiore o uguale al tempo impostato
// si eseguono i calcoli e la stampa della velocità
{
float deltaTempo = ( Tempo/1000.0); // si trasforma in secondi
float Metris= (Conteggio*Pi*raggio)/deltaTempo; // si calcola la velocità in metri/s
float Kmora = (3.6*Conteggio*Pi*raggio)/deltaTempo; //formula per il calcolo della velocità
// in Km/h
float Node = (Metris/0.514444); // si porta in nodi
Node=node;
//--------------------------------------
// stampa i valori sul monitor
//---------------------------------------
Serial.print("Velocità m/s = ");
Serial.println(Metris);
Serial.print("Velocità nodi = ");
Serial.println(Node);
Serial.print("Velocità Km/h = ");
Serial.println(Kmora);
if (Kmora > 20) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
Conteggio = 0; // azzeriamo il conteggio per nuova lettura
delay(2000);// attesa per altra lettura
}
}
}
}
void inizializeAnemo(){
pinMode(reedPin, INPUT);
}
void setup() {
inizializeAnemo();
pinMode(ledPin, OUTPUT);
// pin dell'anemometro
//pinMode(reedPin, INPUT);
Serial.begin(9600);
lcd.init();
lcd.backlight();
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
void loop() {
loopBme() ;
loopTenda() ;
Anemo() ;
lcdDispatch();
}
|