Guglielmo stavo provando giusto ora la comunicazione da te descritta.
Ho scritto su arduino mega:
#include <SoftwareSerial.h>
#define SS_RX 50 // RX PIN to receive data
#define SS_TX 51 // TX PIN to transmit data
SoftwareSerial ssSerial(SS_RX, SS_TX);
void setup()
{
ssSerial.begin(9600);
}
void loop()
{
for(int i=0; i<3; i++){ ssSerial.write(i); delay(1000);}
}
e su arduino uno:
#include <IRremote.h>
#include <dht11.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#define SS_RX 2 // RX PIN to receive data
#define SS_TX 3 // TX PIN to transmit data
#define DHT11_PIN 4
#define button1 5
#define button2 7
#define LED1 6
#define LED2 9
#define LED3 10
#define receiver 8
SoftwareSerial ssSerial(SS_RX, SS_TX);
LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
dht11 DHT;
int tmp = 0, hmd = 0;
long nmillis = 0, omillis = 0, n2millis = 0;
int val = 1;
int preval = 0;
byte Centigradi[8] = {
0b00000,
0b01110,
0b01010,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup() {
Serial.begin(9600);
ssSerial.begin(9600);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
irrecv.enableIRIn(); // Start the receiver
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
// create a new custom character
lcd.createChar(0, Centigradi);
// set up number of columns and rows
lcd.begin(16, 2);
// print the custom char to the lcd
// why typecast? see: http://arduino.cc/forum/index.php?topic=74666.0
}
void dth() {
int chk;
nmillis = millis();
if (nmillis > (omillis + 1000)) {
chk = DHT.read(DHT11_PIN); // READ DATA
switch (chk) {
case DHTLIB_OK:
// Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
// Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
// Serial.print("Time out error,\t");
break;
default:
// Serial.print("Unknown error,\t");
break;
}
// DISPLAT DATA
if (DHT.temperature > 18)
tmp = DHT.temperature;
hmd = DHT.humidity;
lcd.setCursor(0, 0);
lcd.print("Temperatura: "); lcd.print(DHT.temperature); lcd.write((uint8_t)0);
lcd.setCursor(0, 1);
lcd.print("Umidita': "); lcd.print(DHT.humidity); lcd.print("%");
lcd.print("");
omillis = millis();
}
}
void infrar() {
if (irrecv.decode(&results)) // have we received an IR signal?
{
lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ricevuto IR: ");
lcd.setCursor(0, 1);
lcd.print(results.value, HEX); // display it on serial monitor in hexadecimal
irrecv.resume();// receive the next value
}
}
void serial(){
if (ssSerial.available())
int i = ssSerial.read();
}
void loop() {
if (digitalRead(button1) == LOW) {
switch (val) {
case 0: preval = 0; val = 1; analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
case 1: preval = 1; val = 2; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Valore: "); analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
case 2: preval = 2; val = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ricevuto IR: "); analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
}
while (digitalRead(button1) == LOW) ; //{ if(millis()<nmillis+5) ; else nmillis=millis(); } //attendi il rilascio del pulsante
}
if (digitalRead(button2) == LOW) {
switch (val) {
case 2: preval = 0; val = 1; analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
case 0: preval = 1; val = 2; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Valore: "); analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
case 1: preval = 2; val = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ricevuto IR: "); analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
}
while (digitalRead(button2) == LOW) ; //{ if(millis()<nmillis+5) ; else nmillis=millis(); } //attendi il rilascio del pulsante
}
int x=ssSerial.read();
if (x>-1 && x<3){
val=x;
switch (val) {
case 2: preval = 0; val = 1; analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
case 0: preval = 1; val = 2; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Valore: "); analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
case 1: preval = 2; val = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ricevuto IR: "); analogWrite(LED1, 0); analogWrite(LED2, 0); analogWrite(LED3, 0); break;
}
}
switch (preval) {
case 0: analogWrite(LED2, (analogRead(A0) / 4)); dth(); break;
case 1: {
analogWrite(LED1, (analogRead(A0) / 4));
int k = analogRead(A0);
if (k < 1000) {
lcd.setCursor(11, 0);
lcd.print(" ");
} if (k < 100) {
lcd.setCursor(10, 0);
lcd.print(" ");
} if (k < 10) {
lcd.setCursor(9, 0);
lcd.print(" ");
} lcd.setCursor(8, 0);
lcd.print(k);
break;
}
case 2: analogWrite(LED3, (analogRead(A0) / 4)); infrar(); break;
}
}
I 2 software funzionano, il diplay cambia funzione ogni secondo.
Il problema si presenta quando scollego i 2 arduino e li collego a 2 batterie 9v, il display funziona regolarmente con i pulsanti ma non riceve alcuna informazione dall'altro e di conseguenza non avviene il cambio di funzione "automatico".
Il problema è lo sketch o cosa? Come posso risolvere?