Wow abych pravdu řek začínám se ztrácet. Nejsem žádný velký technik je to v podstatě jen hobby. Tákže...
Knihovna by měla fungovat, jedná se o oficiální knihovnu pro arduino takže zde bych problém nehledal.
Zde ještě uvedu kody v obou arduinech jak v nanu tak v meze.
NANO#include <SoftwareSerial.h>
#include <LCD5110_Basic.h>
#include <Nokia5110.h>
#include <dht.h>
#include <math.h>
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
#define SSerialTxControl 12 // RS modul pin 12
// vytvorime seriovy port na pinu 10 a 11 se jménem RS485Serial
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
LCDnokia5110 lcd(5,6,7,2,13);
//(SCLK, DN, DC, RES, SCE)
LCD5110 myGLCD(13,2,7,5,6);
dht DHT;
#define DHT11_PIN 0
dht DHT2;
#define DHT11_PIN2 1
const unsigned char icon [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x0A, 0x0E, 0x00, 0xFC, 0xFA, 0x06, 0x06, 0x06, 0x06, 0x06, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xBF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x0A, 0x0E, 0x00, 0x00, 0xE0, 0xF8, 0x3E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x3F, 0x0F, 0x00, 0x01, 0xE1, 0xA0, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
int TempUpPin = A1;
int TempDwnPin = A2;
int LightPin = A3;
int TempUp = 1000;
int TempDwn = 1000;
int Light = 1000;
int SetTemp = 1;
int LastTemp;
int SetInterval = 5000; //Doba po kterou je aktivní mod nastavování teploty
int LightPower = 8;
long last = 0;
long timeout = 0;
long LightOff = 0;
long cekam = 0;
bool debug = true;
bool sett = true;
#define ThermistorPIN1 6 // Podlahoví termostat pin A6
double temp1;
#define ThermistorPIN2 7 // Podlahoví termostat pin A7
double temp2;
double Thermistor(int RawADC, long Calibrate) {
long Resistance;
double Temp;
Resistance=Calibrate *((1024.0/RawADC) - 1);
Temp = log(Resistance);
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15; // Convert Kelvin to Celsius
return Temp; // Return the Temperature
}
void setup()
{
myGLCD.InitLCD();
lcd.ShowImage(icon, true);
pinMode(LightPower, OUTPUT);
//Serial.begin(9600);
RS485Serial.begin(14400);
digitalWrite(LightPower, LOW);
if(debug){
Serial.println();
Serial.println(" DEBUG MODE ENABLED");
Serial.println();
}
}
void loop()
{
if(millis() > cekam){
cekam = millis() + 100;
TempUp = analogRead(TempUpPin);
TempDwn = analogRead(TempDwnPin);
Light = analogRead(LightPin);
if(debug){
if((TempUp == 0 || TempDwn == 0) || Light == 0){
//Serial.print("\t \t \t \t \t");
//Serial.print("TempUp: ");
//Serial.print(TempUp);
//Serial.print("\t");
//Serial.print("TempDwn: ");
//Serial.print(TempDwn);
//Serial.print("\t");
//Serial.print("Light: ");
//Serial.println(Light);
}
}
if(Light == 0){
digitalWrite(LightPower, HIGH);
LightOff = millis()+3000;
}
if(TempUp == 0){
digitalWrite(LightPower, HIGH);
timeout = millis()+SetInterval;
LightOff = timeout;
if(SetTemp < 45){
SetTemp = SetTemp + 1;
}
}
if(TempDwn == 0){
digitalWrite(LightPower, HIGH);
timeout = millis()+SetInterval;
LightOff = timeout;
if(SetTemp > 1){
SetTemp = SetTemp - 1;
}
}
if((TempUp == 0 || TempDwn == 0) || Light == 0){
Serial.print("id:1-settemp:");
Serial.println(SetTemp);
}
if(LightOff < millis()){
digitalWrite(LightPower, LOW);
}
}
if((TempDwn != 0 && TempUp != 0) && timeout+250 < millis()){
if(millis() > last){
int chk = DHT.read11(DHT11_PIN);
int chk2 = DHT2.read11(DHT11_PIN2);
last = millis() + 1000;
myGLCD.setFont(MediumNumbers);
myGLCD.printNumI(DHT.temperature, 21, 0);
myGLCD.printNumI(DHT.humidity, 21, 32);
if(debug){
myGLCD.setFont(SmallFont);
myGLCD.printNumI(last, RIGHT, 24);
myGLCD.printNumI(SetTemp, LEFT, 24);
Serial.print("Vlhkost: ");
Serial.print(DHT.humidity, 0);
Serial.print("\t");
Serial.print("Teplota: ");
Serial.println(DHT.temperature, 0);
}
if(debug){
//Serial.print("SettTemp: ");
//Serial.println(SetTemp);
digitalWrite(SSerialTxControl, 1); // Povolí odesílání na modulu RS485
// id termostatu
RS485Serial.print("id:1");
// teplota z interního čidla
RS485Serial.print("-its1:");
RS485Serial.print(DHT.temperature, 0);
// vlhkost z interního čidla
RS485Serial.print("-ihs1:");
RS485Serial.print(DHT.humidity, 0);
//teplota z externiho čidl
RS485Serial.print("-its2:");
RS485Serial.print(DHT2.temperature, 0);
// vlhkost z externiho čidla
RS485Serial.print("-ihs2:");
RS485Serial.print(DHT2.humidity, 0);
temp1=Thermistor(analogRead(ThermistorPIN1), 9750);
RS485Serial.print("-ets1:");
RS485Serial.print(temp1,0);
temp2=Thermistor(analogRead(ThermistorPIN2), 9750);
RS485Serial.print("-ets2:");
RS485Serial.print(temp2,0);
if(LastTemp != SetTemp){
//odesílání informace o nově nastavené teplotě
LastTemp = SetTemp;
RS485Serial.print("-stmp:");
RS485Serial.print(LastTemp);
}
RS485Serial.write(0x0A); // odešle znak kového řádku
digitalWrite(SSerialTxControl, 0); // Zakáže odesílání na modulu RS485
}
}
}else{
if(timeout < millis()){
myGLCD.clrScr();
lcd.ShowImage(icon, true);
}else{
myGLCD.clrScr();
myGLCD.setFont(SmallFont);
myGLCD.print("Nastavte", CENTER, 1);
myGLCD.print("teplotu", CENTER, 8);
myGLCD.setFont(BigNumbers);
myGLCD.printNumI(SetTemp, CENTER, 24);
delay(20);
}
}
}
MEGA#include <SoftwareSerial.h>
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
#define SSerialTxControl 3 // RS modul pin 3
#define R1 22
#define R2 23
#define R3 24
#define R4 25
#define R5 26
#define R6 27
#define R7 28
#define R8 29
int cmd = 0;
boolean SR1 = false;
boolean SR2 = false;
boolean SR3 = false;
boolean SR4 = false;
boolean SR5 = false;
boolean SR6 = false;
boolean SR7 = false;
boolean SR8 = false;
// vytvorime seriovy port na pinu 10 a 11
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
int byteReceived;
void setup()
{
Serial.begin(9600);
pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, 0); // Povolí přijímaní na modulu RS485
RS485Serial.begin(14400); // rychlost RS485 musí být nastavená stejně jako na vysílači
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
pinMode(R5, OUTPUT);
pinMode(R6, OUTPUT);
pinMode(R7, OUTPUT);
pinMode(R8, OUTPUT);
digitalWrite(R1, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R4, HIGH);
digitalWrite(R5, HIGH);
digitalWrite(R6, HIGH);
digitalWrite(R7, HIGH);
digitalWrite(R8, HIGH);
}
void loop() {
//načítání hodnot z RPI a spínání jednotlivích vístupů na rele liště
if(Serial.available() > 0){
cmd = Serial.read();
if(cmd == '1'){
if(SR1){
digitalWrite(R1, HIGH);
SR1 = false;
}else{
digitalWrite(R1, LOW);
SR1 = true;
}
}
if(cmd == '2'){
if(SR2){
digitalWrite(R2, HIGH);
SR2 = false;
}else{
digitalWrite(R2, LOW);
SR2 = true;
}
}
if(cmd == '3'){
if(SR3){
digitalWrite(R3, HIGH);
SR3 = false;
}else{
digitalWrite(R3, LOW);
SR3 = true;
}
}
if(cmd == '4'){
if(SR4){
digitalWrite(R4, HIGH);
SR4 = false;
}else{
digitalWrite(R4, LOW);
SR4 = true;
}
}
if(cmd == '5'){
if(SR5){
digitalWrite(R5, HIGH);
SR5 = false;
}else{
digitalWrite(R5, LOW);
SR5 = true;
}
}
if(cmd == '6'){
if(SR6){
digitalWrite(R6, HIGH);
SR6 = false;
}else{
digitalWrite(R6, LOW);
SR6 = true;
}
}
if(cmd == '7'){
if(SR7){
digitalWrite(R7, HIGH);
SR7 = false;
}else{
digitalWrite(R7, LOW);
SR7 = true;
}
}
if(cmd == '8'){
if(SR8){
digitalWrite(R8, HIGH);
SR8 = false;
}else{
digitalWrite(R8, LOW);
SR8 = true;
}
}
}
// když jsou nějaká data přijata na RS485
if (RS485Serial.available())
{
byteReceived = RS485Serial.read(); // Přečte byte z modulu RS485
Serial.write(byteReceived); // a odešle je na Serial Monitor
}
}
Dále jako propojovací vodiče používám klasický UTP kabel 2 dráty pro data a po 2 drátech vedu napájení. Délka cca 8m (jedná se pouze o testovací propojení, v reálu bude vzdálenost od 3m do 30m) Oba konce jsou zakončeny odporem 110Ω.
Zde je i vyfocené zapojení u megy.

Moduly RS485 jsou na obou koncích napájeny přímo arduinem.
Někdo se zmiňoval o restartech. Jediné co pomáhá je vypnutí obou arduin kompletní odpojení modulu RS485 a vše zase zapojit a zapnout.