Ви не увійшли.
Сторінки 1
Всім вітання. Якщо хтось мав справу з комінкацією 2-х Arduino з використанням SoftwareSerial ліби, то прошу підказки. Перечитав багато прикладів та багато чого спробував, але є "проблема". Задумка така:
- Master по "крону" відправляє на Slave Char, потім виконується Flush
- Slave постійно перевіряє чи передається щось по SoftwareSerial
- Якщо Slave прийняв потрібний Char, то зі сторони Slave виконується Flush + відправляється інший Char на Master
- Master постійно перевіряє чи передається щось по SoftwareSerial
і т.д.
Про проблему SoftwareSerial (неможливість одночасно зчитувати та відправляти) знаю. Також пробував AltSoftserial, але трошки "не зайшло", тому вирішив "добити" спочатку з SoftwareSerial, а вже потім пробувати щось краще
Код Master (Nano v3):
#include <Wire.h>
#include <SoftwareSerial.h>
#include "RTClib.h"
#include <string.h>
#include "Time.h"
#include "TimeAlarms.h"
SoftwareSerial ArduinoSlave(8, 9);
char chrValue = ' ';
RTC_DS1307 RTC;
unsigned long time = 0;
uint32_t syncProvider() {
return RTC.now().unixtime();
}
void setup() {
Serial.begin(9600);
SPI.begin();
Wire.begin();
ArduinoSlave.begin(9600);
RTC.begin();
if (! RTC.isrunning()) {
Serial.println(F("RTC is NOT running!"));
return;
}
if (!ArduinoSlave.available()) {
Serial.println("Master to Slave not initiated!");
return;
}
RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
setSyncProvider(syncProvider);
// Alarm.alarmRepeat(0, 0, 10, checker);
Alarm.timerRepeat(10, checker); //повтор пересилки кожні 10 сек
}
void loop() {
DateTime now = RTC.now();
Alarm.delay(1000);
reads();
}
void checker() {
if (ArduinoSlave.available()) {
Serial.println("Master to Slave initiated!");
while (ArduinoSlave.available() > 0) {
Serial.println("Starting transmit:");
char chrValue = 65;
ArduinoSlave.print(chrValue);
Serial.println("Data was sent:" + chrValue);
delay(100);
ArduinoSlave.flush();
}
}
delay(100);
}
void reads() {
if (!ArduinoSlave.available()) {
Serial.println("Receive interface not initiated!");
}
if (ArduinoSlave.available()) {
while (ArduinoSlave.available() > 0) {
chrValue = ArduinoSlave.read();
Serial.println(chrValue);
if (chrValue == 66) {
Serial.println("Slave to Master OK!");
}
else if (!chrValue == 66) {
Serial.println("Slave to Master ERROR!");
delay(100);
ArduinoSlave.flush();
}
}
}
}
Код Slave (Mega2560)
#include <SPI.h>
#include <Wire.h>
#include <SoftwareSerial.h>
SoftwareSerial ArduinoMaster(46, 48);
int i;
char chrValue = ' ';
int led1 = 5;
int led2 = 4;
String answer = "";
void setup() {
Serial.begin(9600);
SPI.begin();
Wire.begin();
ArduinoMaster.begin(115200);
if (!ArduinoMaster.available()) {
Serial.println("Slave to Master not initiated!");
}
}
void loop() {
master();
}
void master() {
while (ArduinoMaster.available() == 0) {
}
if (ArduinoMaster.available() > 0) {
while (ArduinoMaster.available() > 0) {
chrValue = ArduinoMaster.read();
if (chrValue == 65) {
Serial.println("Data received:" + chrValue);
delay(100);
}
else if (!chrValue == 65) {
Serial.println("Wrong data!");
delay(100);
}
delay(100);
char chrValue = 66;
ArduinoMaster.print(chrValue);
Serial.println("Data was sent:" + chrValue);
delay(100);
ArduinoMaster.flush();
}
}
}
Якщо Master/Slave запустити окремо, то очікувано "....not initiated!" на обох "моніторах", а якщо разом - то просто нічого не виводиться на Master, але "....not initiated!" на Slave. Піни пробував міняти, GND підключав спільно для обох плат. Також пробував використовувати різний baud rate - не допомогло
Неактивний
... Про проблему SoftwareSerial (неможливість одночасно зчитувати та відправляти) знаю. Також пробував AltSoftserial, але трошки "не зайшло", тому вирішив "добити" спочатку з SoftwareSerial, а вже потім пробувати щось краще ...
Як би це була єдина проблема SoftwareSerial-iв. Почнiть зразу з чогось кращого i не витрачайте задарма час.
Ось перероблений варіант під AltSoftSerial
Master
#include <SPI.h>
#include <Wire.h>
#include <AltSoftSerial.h>
#include "RTClib.h"
#include <string.h>
#include "Time.h"
#include "TimeAlarms.h"
AltSoftSerial altSerial;
char chrValue = ' ';
RTC_DS1307 RTC;
unsigned long time = 0;
uint32_t syncProvider() {
return RTC.now().unixtime();
}
void setup() {
Serial.begin(9600);
SPI.begin();
Wire.begin();
altSerial.begin(9600);
RTC.begin();
if (! RTC.isrunning()) {
Serial.println(F("RTC is NOT running!"));
return;
}
if (!altSerial.available()) {
Serial.print("Alt connection error!");
}
RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
setSyncProvider(syncProvider);
}
void loop() {
DateTime now = RTC.now();
checker();
reads();
}
void checker() {
if (altSerial.available()) {
Serial.println("Master to Slave initiated!");
while (altSerial.available()) {
Serial.println("Starting transmit:");
char chrValue = 65;
altSerial.print(chrValue);
Serial.println("Data was sent:" + chrValue);
delay(100);
altSerial.flush();
}
}
delay(100);
}
void reads() {
if (altSerial.available()) {
while (altSerial.available() > 0) {
chrValue = altSerial.read();
Serial.println(chrValue);
if (chrValue == 66) {
Serial.println("Slave to Master OK!");
}
else if (!chrValue == 66) {
Serial.println("Slave to Master ERROR!");
delay(100);
altSerial.flush();
}
}
}
}
Slave
#include <SPI.h>
#include <Wire.h>
#include <AltSoftSerial.h>
AltSoftSerial altSerial;
char chrValue = ' ';
void setup() {
Serial.begin(9600);
SPI.begin();
Wire.begin();
altSerial.begin(9600);
if (!altSerial.available()) {
Serial.println("Slave to Master not initiated!");
}
}
void loop() {
master();
}
void master() {
while (altSerial.available() == 0) {
}
if (altSerial.available() > 0) {
while (altSerial.available() > 0) {
chrValue = altSerial.read();
if (chrValue == 65) {
Serial.println("Data received:" + chrValue);
delay(100);
}
else if (!chrValue == 65) {
Serial.println("Wrong data!");
delay(100);
}
delay(100);
char chrValue = 66;
altSerial.print(chrValue);
Serial.println("Data was sent:" + chrValue);
delay(100);
altSerial.flush();
}
}
}
Тепер стабільно, з обох сторін "...not initiated!". Розпіновка вірна, GND спільний
Неактивний
Ось перероблений варіант під AltSoftSerial
Master ... Тепер стабільно, з обох сторін "...not initiated!". Розпіновка вірна, GND спільний
От i добре, хай так i працюе. Я почуваюсь так як би сказав дурницю. Але ж нi. Успiхiв!
Я теж був би радий, але в моніторах плат нічого не видно, окрім "...not initiated!", тобто пересилка не відбувається Спробував іншу Мега2560, бо допускав момент. що піни "підпалені" - теж нічого не змінилося.
Неактивний
Сторінки 1