alibiduda Postat Decembrie 6, 2021 Autor Partajează Postat Decembrie 6, 2021 Revin cu update. Se pare ca e ceva in neregula cu modulele RS485 sau altceva ce imi scapa momentan. Am facut un sketch de test de sincronizare adica, modulul cu LCD trimite un caracter catre cel cu senzor si cand acesta il receptioneaza trimite alt caracter inapoi care e afisat pe LCD. A functionat ok dar dupa o pauza de cateva ore fara sa il ating nu a mai vrut in nici un fel sa receptioneze caracterul trimis de modulul cu senzor. Am schimbat modulele RS485 intre ele, microcontrolerele intre ele , nimic se comporta exact la fel intr-o directie mergea perfect dar inapoi nu se mai intorcea nimic. Din acel moment tot ce incercam sa trimit intre module ori se pierdea pe drum ori ajuncea altceva. Am scos modulele rs485 din ecuatie si tot la fel. Pana la urma am trecut pe porturile hardware serial direct fara module rs485 si in sfarsit comunicatia s-a stabilizat. Am reusit sa trimit temperatura prin metoda 2 octeti. Acum e traziu dar vreau sa testez si celelate metode (4 octeti si libraria), principalul meu scop e sa invat programarea. Nu imi expilc ce s-a intamplat pur si simplu nu a fost alimentat, nu l-am atins si nu a fost nimeni in preajma lui timp de cateva ore. Cel putin acum am o baza stabila de unde sa incep. Sper ca pana maine sa nu intre iar dracii in el. Link spre comentariu
Vizitator Postat Decembrie 7, 2021 Partajează Postat Decembrie 7, 2021 Acum 14 ore, alibiduda a spus: Pana la urma am trecut pe porturile hardware serial direct La 15m distanta nu prea va merge comunicatia cu nivele TTL chiar la viteze mici, Pune macar RS232. De RS485 oricum nu ai nevoie pentru ca ai doar doua dispozitive care comunica intre ele. Link spre comentariu
nico_2010 Postat Decembrie 7, 2021 Partajează Postat Decembrie 7, 2021 Posteaza sketch-ul asa cum l-ai avut cand nu au mers modulele si, eventual, fotografii/schite cu conexiunile dintre Arduino si modulul/modulele RS485, altfel vorbim vorbe Link spre comentariu
alibiduda Postat Decembrie 7, 2021 Autor Partajează Postat Decembrie 7, 2021 Astea sunt sketch-urile la care a luat-o razna. Vineri seara a functionat fara probleme, totul a ramas neatins. Sambata dimineata am alimentat si nu mai primea inpoi caracerul "A". Comanda reqtemp ajungea, de trimis trimitea. Am verificat conexiunile de nenumarate ori pin cu pin cu ohmetrul, am scimbat modulele intre ele si rescris sketch-urile. Le-am schimbat locul pe breadboard. Din pacate fotografii nu am facut, eram prea nervos. Asta este fotografia actuala modulele RS485 sunt deconectate. Pana la urma nu mai conteza ce a fost, bine ca acum e stabil si pot testa. Imi cer scuze ca nu progresez mai repede dar timpul meu de "joca" e limitat si de obicei seara tarziu. @Liviu.Mihaiu nu am de gand sa renunt la RS485 doar momentan pana reusesc sa pun la punct programare pe partea de citre si afisare senzor. Dupa cum spuneam sunt incepator cu progamarea si trebuie sa ma documentez mult pana reusesc sa fac ceva nou. Microcontrolerul care afisaza. #include <SoftwareSerial.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); #define TX_485 8 // Pin DI modul RS 485 #define RX_485 7 // pin RO modul RS 485 #define RS485_control 3 // pin DE+RE control RS485 SoftwareSerial RS485_serial (RX_485, TX_485); #define RS485transmit HIGH #define RS485receive LOW int reqtemp = 1; char val = 0; void setup() { lcd.init(); lcd.clear(); lcd.backlight(); Serial.begin(9600); RS485_serial.begin(4800); pinMode(RS485_control, OUTPUT); } void loop() { lcd.clear(); digitalWrite(RS485_control, RS485transmit); RS485_serial.print(reqtemp); Serial.print(reqtemp); delay(50); digitalWrite(RS485_control, RS485receive); if (RS485_serial.available () > 0) { val = RS485_serial.read(); } Serial.println(val); lcd.setCursor(1, 0); lcd.print(val); delay(2000); } Microcontrolerul care "citeste temperaura". #include <SoftwareSerial.h> //#include <OneWire.h> //#include <DallasTemperature.h> #define TX_485 8 // pin DI modul RS 485 #define RX_485 7 // pin RO modul RS 485 #define RS485_control 3 // pin DE+RE control RS485 SoftwareSerial RS485_serial (RX_485, TX_485); #define RS485transmit HIGH #define RS485receive LOW /*const int pin_sensor = 5; OneWire bus (pin_sensor); DallasTemperature sensors (&bus); DeviceAddress sensor;*/ int command = 0; char val = "A" ; void setup() { // sensors.begin(); Serial.begin(9600); RS485_serial.begin(4800); pinMode(RS485_control, OUTPUT); /* if (!sensors.getAddress(sensor, 0)) { Serial.println("DS18B20 deconectat"); }*/ } void loop() { /* sensors.requestTemperatures(); temp = sensors.getTempC(sensor);*/ digitalWrite(RS485_control, RS485receive); if (RS485_serial.available () > 0) { command = RS485_serial.parseInt(); Serial.println(command); if (command == 1) { digitalWrite(RS485_control, RS485transmit); RS485_serial.print("A"); Serial.println(" A trimis"); } } } Link spre comentariu
core Postat Decembrie 7, 2021 Partajează Postat Decembrie 7, 2021 Mi se pare logic sa apelezi un eventual delay, dupa ce ai trecut linia pe receive, nu inainte. Posibil sa iti vina raspunsul cand este inca pe mod transmit. Daca nu ai o functie sa verifici cand ai terminat de transmis, si asta e motivul delay-ului, poti incerca un delay mai mic, de 2-3 ms ( ( 8 + 1) / 4800 ms ), apoi sa treci linia pe mod receive si eventual sa mai astepti ulterior raspunsul. Link spre comentariu
alibiduda Postat Decembrie 7, 2021 Autor Partajează Postat Decembrie 7, 2021 Da e logic la asta nu m-am gandit. Buna observatie. Multumesc. Link spre comentariu
mihaicozac Postat Decembrie 7, 2021 Partajează Postat Decembrie 7, 2021 Nu are cum să scape răspunsul, pt. că fără delay citirea intrării seriale se face de zeci de mii de ori pe secundă, şi doar dacă intră ceva în buffer se procesează condiţia if, iar asta durează probabil 2-3us după care iar verifică la nesfârşit intrarea serială. Pe de altă parte dacă treci pe recepţie şi ai timp mort cu delay-ul s-ar putea să pierzi datele de intrare dacă sunt transmise în acest timp. În mod normal ar trebui sincronizată cumva rularea ori cu millis() ori prin altă metodă. Dacă un byte de date are nevoie de 2ms să intre în buffer la 4800baud nu are rost să verifici mai des de atâta. În practică 50ms ar fi suficiente ca interval şi rămâne destul timp între pt. a face şi restul, cum ar fi afişarea plus bucătăria internă. Link spre comentariu
vijelie02 Postat Decembrie 8, 2021 Partajează Postat Decembrie 8, 2021 Problema apare din cauza breadboard-ului. Sunt proaste, contacte imperfecte. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum