Buona domenica!
ho creato un sistema di raccolta di alcuni dati provenienti da alcuni sensori e che vengono visualizzati su un Display LCD. Il codice è questo:
#include <BMP180.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#define CALIBRATION 5200 //da calibrare per riferimento pressione al livello del mare
//#define Altitude 42.713 //Altitude San Pietro in Cerro (Piacenza, Emilia-Romagna, Italy)
//#define Altitude 60.843 //Altitude Piacenza (Piacenza, Emilia-Romagna, Italy)
#define ONE_WIRE_BUS 2
#define LDR_Pin A0
#define MQ5_Pin A1
#define FC4_Pin A2
BMP180 bmp_p_sensor;
float seaLevelPressure = 102370; // cambia in continuazione la pressione al livello del mare, perciò impossibile definire un dato fisso
float pressionelivellodelmarehPa; // variabile per la pressione al livello del mare in hPa
float pressionelivellodelmare; // variabile per la pressione in Pa
int valLuce;
int percLuce;
int valGas;
int percGas;
int valSuono;
int percSuono;
byte alterna = 0;
unsigned long Tempo = 0;
const long intervalloTemperatura = 5000;
const long intervalloLuminosita = 5000;
const long intervalloGas = 5000;
const long intervalloSuono = 5000;
const long intervalloBMP = 5000;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(12, 11, 5, 4, 3, 6);
void MostraLuminosita()
{
lcd.clear();
lcd.setCursor(0, 0);
valLuce = analogRead(LDR_Pin);
percLuce = map(valLuce, 0, 1023, 0.0, 100.0);
lcd.print(F("Luminosita': "));
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(percLuce);
lcd.print(F("%"));
}
void MostraTemperatura()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperatura: ");
lcd.setCursor(0, 1);
lcd.print(sensors.getTempCByIndex(0));
lcd.print(" ");
lcd.print ((char)223);
lcd.print('C');
}
void MostraSuono()
{
lcd.clear();
lcd.setCursor(0, 0);
valSuono = analogRead(FC4_Pin);
Serial.print(valSuono);
Serial.println();
percSuono = map(valSuono, 0, 1023, 0.0, 100.0);
lcd.print(F("Rumore: "));
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(percSuono);
lcd.print(F("%"));
}
void MostraPresenzaGas()
{
lcd.clear();
lcd.setCursor(0, 0);
valGas = analogRead(MQ5_Pin);
percGas = map(valGas, 0, 1023, 0.0, 100.0);
lcd.print(F("Presenza Gas: "));
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(percGas);
lcd.print(F("%"));
}
void MostraPressioneAssoluta()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Pr.Assoluta: "));// calcolata nel vuoto
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(bmp_p_sensor.GetPressure());
lcd.print(F(" Pa"));
}
void MostraPressioneRelativa()
{
pressionelivellodelmare = bmp_p_sensor.GetPressure() + CALIBRATION; //in Pa
pressionelivellodelmarehPa = pressionelivellodelmare / 100; //in hPa
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Pr.Relativa: "));//calcolata grazie ad un'altra pressione
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(pressionelivellodelmarehPa);
lcd.print(F(" hPa"));
}
void MostraAltitudine()
{
float altitudine = bmp_p_sensor.GetAltitude(seaLevelPressure);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Altitudine: "));
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(altitudine);
lcd.print(F(" m"));
}
void setup()
{
Serial.begin(9600);
sensors.begin();
Wire.begin();
bmp_p_sensor = BMP180();
if (bmp_p_sensor.EnsureConnected())
{
bmp_p_sensor.SoftReset();
bmp_p_sensor.Initialize();
}
lcd.begin(16, 2);
pinMode(LDR_Pin, INPUT);
pinMode(MQ5_Pin, INPUT);
pinMode(FC4_Pin, INPUT);
lcd.setCursor(1, 0);
lcd.print("ARDUROVER 1.2");
delay(3000);
Tempo = millis();
}
void loop() {
sensors.requestTemperatures();
switch (alterna) {
case 0:
if (millis() - Tempo <= intervalloTemperatura)
{
MostraTemperatura();
}
else {
Tempo = millis();
alterna = 1;
}
break;
case 1:
if (millis() - Tempo <= intervalloLuminosita)
{
MostraLuminosita();
}
else {
Tempo = millis();
alterna = 2;
}
break;
case 2:
if (millis() - Tempo <= intervalloGas)
{
MostraPresenzaGas();
}
else {
Tempo = millis();
alterna = 3;
}
break;
case 3:
if (millis() - Tempo <= intervalloBMP)
{
MostraPressioneAssoluta();
}
else {
Tempo = millis();
alterna = 4;
}
break;
case 4:
if (millis() - Tempo <= intervalloBMP)
{
MostraPressioneRelativa();
}
else {
Tempo = millis();
alterna = 5;
}
break;
case 5:
if (millis() - Tempo <= intervalloBMP)
{
MostraAltitudine();
}
else {
Tempo = millis();
alterna = 6;
}
break;
case 6:
if (millis() - Tempo <= intervalloSuono)
{
MostraSuono();
}
else {
Tempo = millis();
alterna = 0;
}
break;
}
}
volevo mandare questi dati (per altre necessità) ad un altro arduino tramite protocollo I2C ( con un metodo MasterReader e SlaveSender)...volevo quindi integrare nel codice qua sopra questa procedura:
// Wire Slave Sender
// by Nicholas Zambetti <http://www.zambetti.com>
// Demonstrates use of the Wire library
// Sends data as an I2C/TWI slave device
// Refer to the "Wire Master Reader" example for use with this
// Created 29 March 2006
// This example code is in the public domain.
#include <Wire.h>
void setup() {
Wire.begin(8); // join i2c bus with address #8
Wire.onRequest(requestEvent); // register event
}
void loop() {
delay(100);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire.write("hello"); // respond with message of 6 bytes
// as expected by master
}
solo che il mio timore è che i due utilizzi della libreria Wire.h possano, in qualche modo, ostacolarsi...è così?
Se invece non fosse cosi, quindi che posso utilizzarla lo stesso, tengo l'indirizzo (Wire.begin(8)) oppure no?
Grazie a chi mi aiuterà!
EDIT: scusate per l'errore, la libreria Wire.h la utilizzavo per il display e non per il BMP180 (dove utilizzo OneWire.h)