Ви не увійшли.
Доброго всім дня! Потрібна допомога. Є дві плати ардуіно мега і два радіо модуля e32 433t20d LoRa. Передаю через них структуру даних. На платі ардуіно Send стоїть два джойстика та клавіатура і екран я передаю на плату Receive дані положення джойстиків і значення клавіатури та двох кнопок. Коли ні чого не роблю то все приходить норм без проблем. Як що змінюю положення джойстика то значення змінюються. А ось коли натискаю кнопку то збивається передача даних і не коректно показує дані потім і значення зміщаються. Прикладаю код двох плат та те що відбувається в порту. Може хтось може допомогти в цьому?
Send arduino (що посилає значення)
#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include "EBYTE.h"
#define PIN_RX 9
#define PIN_TX 8
#define PIN_M0 7
#define PIN_M1 6
#define PIN_AX 10
#define pinX_1 A0
#define pinY_1 A1
#define swPin_1 30
#define pinX_2 A2
#define pinY_2 A3
#define swPin_2 31
int buttonState = LOW;
int lastButtonState = LOW;
struct DATA {
char Key;
int X1_send;
int Y1_send;
int X2_send;
int Y2_send;
int swPin1_send;
int swPin2_send;
};
int Chan;
DATA MyData;
SoftwareSerial ESerial(PIN_RX, PIN_TX);
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'D','C','B','A'},
{'#','9','6','3'},
{'0','8','5','2'},
{'*','7','4','1'}
};
byte rowPins[ROWS] = {25, 24, 23, 22};
byte colPins[COLS] = {29, 28, 27, 26};
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
EBYTE Transceiver(&ESerial, PIN_M0, PIN_M1, PIN_AX);
void setup(){
lcd.begin(16, 2);
Serial.begin(9600);
ESerial.begin(9600);
Transceiver.init();
pinMode(pinX_1, INPUT);
pinMode(pinY_1, INPUT);
pinMode(swPin_1, INPUT_PULLUP);
pinMode(pinX_2, INPUT);
pinMode(pinY_2, INPUT);
pinMode(swPin_2, INPUT_PULLUP);
lcd.setCursor(2, 0);
lcd.print("Browning");
lcd.setCursor(4, 1);
lcd.print("Ver.:1.1");
lcd.clear();
//Transceiver.PrintParameters();
}
void loop(){
Keypad_mod();
analog_joy();
Send_message();
Transceiver.SendStruct(&MyData, sizeof(MyData));
}
void Keypad_mod(){
char customKey = customKeypad.getKey();
if (customKey){
MyData.Key = customKey;
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(customKey);
//lcd.print(" ");
//Serial.println(customKey);
}
//Serial.print("Key: "); Serial.print(MyData.Key);
}
void analog_joy(){
int X1 = analogRead(pinX_1); // считываем значение оси Х
int Y1 = analogRead(pinY_1);
int X2 = analogRead(pinX_2); // считываем значение оси Х
int Y2 = analogRead(pinY_2);
int X1_Analog = map(X1, 516, 1023, 0, 100);
int Y1_Analog = map(Y1, 510, 1023, 0, 100);
int X2_Analog = map(X2, 510, 1023, 0, 100);
int Y2_Analog = map(Y2, 510, 1023, 0, 100);
int State_swPin1 = digitalRead(swPin_1);
int State_swPin2 = digitalRead(swPin_2);
lcd.setCursor(0, 0);
lcd.print("X1:");
lcd.setCursor(3, 0);
lcd.print(X1_Analog);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Y1:");
lcd.setCursor(3, 1);
lcd.print(Y1_Analog);
lcd.print(" ");
lcd.setCursor(7, 0);
lcd.print("X2:");
lcd.setCursor(10, 0);
lcd.print(X2_Analog);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print("Y2:");
lcd.setCursor(10, 1);
lcd.print(Y2_Analog);
lcd.print(" ");
lcd.setCursor(13, 0);
lcd.print("B:");
lcd.setCursor(15, 0);
lcd.print(State_swPin1);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print("B:");
lcd.setCursor(15, 1);
lcd.print(State_swPin2);
lcd.print(" ");
//Serial.println(Y2);
}
void Send_message(){
int X1 = analogRead(pinX_1); // считываем значение оси Х
int Y1 = analogRead(pinY_1);
int X2 = analogRead(pinX_2); // считываем значение оси Х
int Y2 = analogRead(pinY_2);
int State_swPin1 = digitalRead(swPin_1);
int State_swPin2 = digitalRead(swPin_2);
MyData.X1_send = analogRead(pinX_1);
MyData.Y1_send = analogRead(pinY_1);
MyData.X2_send = analogRead(pinX_2);
MyData.Y2_send = analogRead(pinY_2);
MyData.swPin1_send = digitalRead(swPin_1);
MyData.swPin2_send = digitalRead(swPin_2);
/* //Serial.print("Key: "); Serial.print(MyData.Key);
Serial.print(" X1: "); Serial.print(MyData.X1_send);
Serial.print(" Y1: "); Serial.print(MyData.Y1_send);
Serial.print(" X2: "); Serial.print(MyData.X2_send);
Serial.print(" Y2: "); Serial.print(MyData.Y2_send);
Serial.print(" swPin1_send: "); Serial.print(MyData.swPin1_send);
Serial.print(" swPin2_send: "); Serial.println(MyData.swPin2_send); */
}
Receive Arduino (що приймає значення)
#include <AccelStepper.h>
#include <SoftwareSerial.h>
#include "EBYTE.h"
const int stepPin = 9;
const int directionPin = 8;
const int enablePin = 7;
const int SPEED = 1000;
const int setSPEED = 1000;
#define PIN_RX 53
#define PIN_TX 52
#define PIN_M0 51
#define PIN_M1 50
#define PIN_AX 48
// i recommend putting this code in a .h file and including it
// from both the receiver and sender modules
struct DATA {
char Key;
int X1_send;
int Y1_send;
int X2_send;
int Y2_send;
int swPin1_send;
int swPin2_send;
};
int Chan;
DATA MyData;
unsigned long Last;
// connect to any digital pin to connect to the serial port
// don't use pin 01 and 1 as they are reserved for USB communications
SoftwareSerial ESerial(PIN_RX, PIN_TX);
// create the transceiver object, passing in the serial and pins
EBYTE Transceiver(&ESerial, PIN_M0, PIN_M1, PIN_AX);
AccelStepper stepper(AccelStepper::DRIVER, stepPin, directionPin);
void setup() {
Serial.begin(9600);
stepper.setEnablePin(enablePin);
stepper.enableOutputs();
stepper.setMaxSpeed(SPEED);
//stepper.setAcceleration(1000);
stepper.setSpeed(SPEED);
ESerial.begin(9600);
Transceiver.init();
}
void loop() {
Read_arduinoMega();
X1_left_rigth_state();
//MoveConerLeft ();
MoveConerRigth ();
}
void X1_left_rigth_state(){
int X1_left_rigth;
X1_left_rigth = map(MyData.X1_send, 516, 1023, 0, 100);
//Serial.println(X1_left_rigth);
if (X1_left_rigth >= 20){
stepper.setSpeed(setSPEED);
stepper.runSpeed();
}else if(X1_left_rigth <= -20){
stepper.setSpeed(-setSPEED);
stepper.runSpeed();
}else {
stepper.setSpeed(0);
stepper.stop();
}
//Serial.println(MyData.swPin2_send);
}
void MoveConerLeft (){
int ButtonStateConer = MyData.swPin1_send;
if (ButtonStateConer == LOW){
int setSPEED = 3000;
stepper.setSpeed(setSPEED);
stepper.setAcceleration(3000);
stepper.runToNewPosition(1000);
stepper.run();
//Serial.println(ButtonStateConer);
}
else if (ButtonStateConer == HIGH){
stepper.setCurrentPosition(0);
stepper.setSpeed(0);
//Serial.println(ButtonStateConer);
}
//stepper.run();
}
void MoveConerRigth (){
//int ButtonStateConer2 = MyData.swPin2_send;
if (MyData.swPin2_send == 0){
int setSPEED = 3000;
stepper.setSpeed(-setSPEED);
stepper.setAcceleration(3000);
stepper.runToNewPosition(-1000);
stepper.run();
//Serial.println(ButtonStateConer2);
}
else if (MyData.swPin2_send == 1){
stepper.setCurrentPosition(0);
stepper.setSpeed(0);
//Serial.println(ButtonStateConer2);
}
//Serial.println(MyData.Key);
}
void Read_arduinoMega(){
if (ESerial.available()) {
Transceiver.GetStruct(&MyData, sizeof(MyData));
//ESerial.readBytes((uint8_t*)& MyData, (uint8_t) sizeof(MyData));
Serial.print("Key: "); Serial.print(MyData.Key);
Serial.print(" X1: "); Serial.print(MyData.X1_send);
Serial.print(" Y1: "); Serial.print(MyData.Y1_send);
Serial.print(" X2: "); Serial.print(MyData.X2_send);
Serial.print(" Y2: "); Serial.print(MyData.Y2_send);
Serial.print(" swPin1_send: "); Serial.print(MyData.swPin1_send);
Serial.print(" swPin2_send: "); Serial.println(MyData.swPin2_send);
Last = millis();
}
else {
if ((millis() - Last) > 300) {
//Serial.println("Searching: ");
Last = millis();
}
}
}
і ось що приходить в Serial port:
Key: # X1: 520 Y1: 510 X2: 506 Y2: 509 swPin1_send: 1 swPin2_send: 1
Key: # X1: 519 Y1: 511 X2: 506 Y2: 509 swPin1_send: 1 swPin2_send: 0 // натиснув кнопку
Key: # X1: 520 Y1: 511 X2: 505 Y2: 510 swPin1_send: 1 swPin2_send: 1
Key: # X1: 519 Y1: 511 X2: 506 Y2: 509 swPin1_send: 1 swPin2_send: 1
Key: # X1: 519 Y1: 511 X2: 506 Y2: 509 swPin1_send: 1 swPin2_send: 1
Key: # X1: 520 Y1: 511 X2: 506 Y2: 510 swPin1_send: 1 swPin2_send: 1
Key: # X1: 520 Y1: 510 X2: 505 Y2: 510 swPin1_send: 1 swPin2_send: 1827 // і потім щось пішло не так
Key: X1: 511 Y1: 505 X2: 509 Y2: 1 swPin1_send: 1 swPin2_send: 2083
Key: X1: 511 Y1: 506 X2: 510 Y2: 1 swPin1_send: 1 swPin2_send: 2083
Key: X1: 511 Y1: 505 X2: 510 Y2: 1 swPin1_send: 1 swPin2_send: 2083
Key: X1: 511 Y1: 506 X2: 509 Y2: 1 swPin1_send: 1 swPin2_send: 2083
Key: X1: 511 Y1: 505 X2: 509 Y2: 1 swPin1_send: 1 swPin2_send: 2083
Key: X1: 511 Y1: 506 X2: 510 Y2: 1 swPin1_send: 1 swPin2_send: 1827
Як можна вирішити це питання? Щось з struct DATA, а як вирішити це поки не розумію.
Неактивний
А ось коли натискаю кнопку то збивається передача даних
Спробуйте натискати цю ж кнопку, але в програмі опитувати якусь іншу, так відокремите - апаратна чи програмна проблема.
Неактивний
Андр. пише:А ось коли натискаю кнопку то збивається передача даних
Спробуйте натискати цю ж кнопку, але в програмі опитувати якусь іншу, так відокремите - апаратна чи програмна проблема.
З цім розібрався, кнопки працюють все правильно, діло не в них. Тепер у мене інша проблема. Я передаю значення з ардуіно-1 на ардуіно-2 і все ОК, я зчитую данні з джойстика який стоїть на ардуіно-1. А ось я хочу налаштувати зворотній зв'язок, і тут проблема, не знаю чому перешукав багато туторіалів та коду і у мене не виходить відправити "ОК" з ардуіно-2 на ардуіно-1 коли кнопка натиснута. При цьому коли я відправляю sendMessage з ардуіно-2 то зависає передача в Serial port-у і приходиться його закрити і знов відкрити тоді все ок данні передавати відновлюються а ось меседж так і не приходить на ардуіно-1.
ось код нижче, може хтось з цим стикався та знає як вирішити?
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
const int csPin = 52; // LoRa radio chip select
const int resetPin = 3; // LoRa radio reset
const int irqPin = 2; // change for your board; must be a hardware interrupt pin
byte msgCount = 0; // count of outgoing messages
byte localAddress = 0xBB; // address of this device
byte destination = 0xFF; // destination to send to
long lastSendTime = 0; // last send time
int interval = 50; // interval between sends
boolean flag1 = false;
int RLY1=2;
int Sensor1 = 0;
int relay1Status;
String outgoing; // outgoing message
String statusmessage = "";
void setup() {
Serial.begin(9600); // initialize serial
//LoRa.setPins(csPin, resetPin, irqPin);// set CS, reset, IRQ pin
pinMode(RLY1,OUTPUT);
Serial.println("LoRa Duplex");
if (!LoRa.begin(433E6)) { // initialize ratio at 915 MHz
Serial.println("LoRa init failed. Check your connections.");
while (true); // if failed, do nothing
}
Serial.println("LoRa init succeeded.");
}
void loop() {
if (millis() - lastSendTime > interval) {
relay1Status = digitalRead(RLY1);
lastSendTime = millis(); // timestamp the message
interval = random(50) + 100; // 2-3 seconds
}
onReceive(LoRa.parsePacket());
//LoRa.receive();
}
void sendMessage(String outgoing) {
LoRa.beginPacket(); // start packet
LoRa.write(destination); // add destination address
LoRa.write(localAddress); // add sender address
LoRa.write(msgCount); // add message ID
LoRa.write(outgoing.length()); // add payload length
LoRa.print(outgoing); // add payload
LoRa.endPacket(); // finish packet and send it
msgCount++; // increment message ID
}
void onReceive(int packetSize) {
if (packetSize == 0) return; // if there's no packet, return
// read packet header bytes:
int recipient = LoRa.read(); // recipient address
byte sender = LoRa.read(); // sender address
byte incomingMsgId = LoRa.read(); // incoming msg ID
byte incomingLength = LoRa.read(); // incoming msg length
String incoming = "";
while (LoRa.available()) {
incoming += (char)LoRa.read();
}
if (incomingLength != incoming.length()) { // check length for error
// Serial.println("error: message length does not match length");
;
return; // skip rest of function
}
// if the recipient isn't this device or broadcast,
if (recipient != localAddress && recipient != 0xFF) {
//Serial.println("This message is not for me.");
;
return; // skip rest of function
}
// if message is for this device, or broadcast, print details:
// Serial.println("Received from: 0x" + String(sender, HEX));
// Serial.println("Sent to: 0x" + String(recipient, HEX));
//Serial.println("Message ID: " + String(incomingMsgId));
// Serial.println("Message length: " + String(incomingLength));
Serial.println("Message: " + incoming);
//Serial.println("RSSI: " + String(LoRa.packetRssi()));
//Serial.println("Snr: " + String(LoRa.packetSnr()));
// Serial.println();
String q = getValue(incoming, ',', 0);
Sensor1 = q.toInt();
//Serial.println(Sensor1);
if((Sensor1 == 1)&&(flag1==false))
{
digitalWrite(RLY1,HIGH);
relay1Status = 1;
Serial.println("Relay 1 is turned on");
flag1=true;
}
if((Sensor1 == 0)&&(flag1 ==true))
{
digitalWrite(RLY1,LOW);
relay1Status = 0;
Serial.println("Relay 1 is turned off");
statusmessage = statusmessage + relay1Status;
sendMessage(statusmessage);
delay(1000);
flag1=false;
}
incoming = "";
//statusmessage = statusmessage + relay1Status + "," + relay2Status + "," + relay3Status + "," + relay4Status;
//sendMessage(statusmessage);
}
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
Остання редакція Андр. (2023-10-20 14:44:22)
Неактивний