Member 12299248 Ответов: 2

Связь ведущего и ведомого устройств с использованием rs485


Привет я мое приложение у меня есть два arduino используется в качестве ведущего и ведомого.
когда мой светодиод на ведомом arduino включается, он должен отправить сообщение ведущему arduino.
я в состоянии достичь этого, но проблема в том,что я хочу, чтобы сообщение было отправлено только один раз, как только светодиод горит, отправьте сообщение, а затем остановитесь.
для передачи сообщений используется rs485.

Что я уже пробовал:

мастер-код

#include <softwareserial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW
int ledpin = 13;
int data;
int data1;
int ack = 0;
/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

/*-----( Declare Variables )-----*/
int byteReceived;
int byteSend;

void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  Serial.println("SerialRemote");  // Can be ignored
  pinMode(SSerialTxControl, OUTPUT);  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
  
  // Start the software serial port, to another device
  RS485Serial.begin(9600);   // set the data rate 
  pinMode(ledpin,OUTPUT);
  digitalWrite(ledpin,LOW);
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  //Copy input data to output  
  if (RS485Serial.available()) 
  {
    digitalWrite(ledpin,HIGH);
    byteReceived = RS485Serial.read();   // Read the byte 
    Serial.write(byteReceived);         // Show on Serial Monitor
  delay(15);
   digitalWrite(SSerialTxControl, RS485Transmit);
    }
    else{}
  digitalWrite(SSerialTxControl, RS485Receive); 
      //delay(100);
       //digitalWrite(SSerialTxControl, RS485Transmit);
      }
      
     /*if(byteReceived == 2){
        digitalWrite(SSerialTxControl, RS485Receive);
      data1 = RS485Serial.read();
      Serial.write(data1); 
       digitalWrite(SSerialTxControl, RS485Transmit);
        }
        else {};
        
   delay(100);
  // End If RS485SerialAvailable
   digitalWrite(SSerialTxControl, RS485Receive);
}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/
//NONE

//*********( THE END )***********



подчиненный код

#include <softwareserial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 4   //RS485 Direction control

#define RS485Transmit    HIGH
#define RS485Receive     LOW
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
int byteReceived;
int byteSend; 

volatile unsigned long LastPulseTimeA;
volatile unsigned long LastPulseTimeB;
int durationA;
int durationB;
int distanceA;
int distanceB;
//unsigned long startTime;
#define trigPinA 7
#define echoPinA 2
#define trigPinB 8
#define echoPinB 3
#define ledpinA  13
#define ledpinB  12
int val = 1;
int val1 = 1;
int temp = 0;
int temp1 = 0;
int slave1=1;
int slave2 = 2;



void setup() {
  Serial.begin (9600);
  pinMode(trigPinA, OUTPUT);
  pinMode(echoPinA, INPUT);
   pinMode(trigPinB, OUTPUT);
  pinMode(echoPinB, INPUT); 
  pinMode(ledpinA,OUTPUT); 
   pinMode(ledpinB,OUTPUT); 
attachInterrupt(0, EchoPinA_ISR, CHANGE);  // Pin 2 interrupt on any change
attachInterrupt(1, EchoPinB_ISR, CHANGE);  // Pin3 interrupt on any change
digitalWrite(ledpinA,LOW);
digitalWrite(ledpinB,LOW);

Serial.begin (9600);
pinMode(SSerialTxControl, OUTPUT); 
 digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit 
 RS485Serial.begin(9600); 
}
void loop(){
  digitalWrite(trigPinA, LOW);
  digitalWrite(trigPinB, LOW);
  delayMicroseconds(2); 
  digitalWrite(trigPinA, HIGH);
  digitalWrite(trigPinB, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPinA, LOW);
  digitalWrite(trigPinB, LOW);

  if (distanceA&lt;10)
   {
    Serial.print("Sensor A  ");
    Serial.print(distanceA);
    Serial.print('\t');
    digitalWrite(ledpinA,HIGH);
    
  }
   else{
    digitalWrite(ledpinA,LOW);
    }

    if (distanceB&lt;10)
  {
     Serial.print("Sensor B  ");
    Serial.print(distanceB);
    Serial.print('\t');
    digitalWrite(ledpinB,HIGH);
    
  }
   else{
    digitalWrite(ledpinB,LOW);
    }

  temp = digitalRead(ledpinA);
  //temp1 = digitalRead(ledpinB);
  if(temp==val){
     
      digitalWrite(SSerialTxControl, RS485Transmit);
      RS485Serial.write("car A present  ");
       digitalWrite(SSerialTxControl, RS485Receive); 
      }
      else{}
     
      digitalWrite(SSerialTxControl, RS485Transmit);
   
//  if(temp1==val1){
     
      //digitalWrite(SSerialTxControl, RS485Transmit);
      //RS485Serial.write("car B present  ");
      // digitalWrite(SSerialTxControl, RS485Receive); 
     // }
     // else{}
      // digitalWrite(SSerialTxControl, RS485Transmit);
 }//loop end
void EchoPinA_ISR() {
    static unsigned long startTimeA;
   
    if (digitalRead(2)) // Gone HIGH
        startTimeA = micros();
    else  // Gone LOW
          LastPulseTimeA = micros() - startTimeA;
          distanceA=(LastPulseTimeA/2) / 29.1,1;
}
void EchoPinB_ISR() {
    static unsigned long startTimeB;
   
    if (digitalRead(3)) // Gone HIGH
        startTimeB = micros();
    else  // Gone LOW
        LastPulseTimeB = micros() - startTimeB;
        distanceB=(LastPulseTimeB/2) / 29.1,1;
}

2 Ответов

Рейтинг:
1

Rajarshi Das

Сменить пин-код
Попробуйте Pin3 с прерыванием
#определение SSerialTxControl 3

Пожалуйста, проверьте с помощью interrupt, micro, millis, delay() не работает!


Рейтинг:
0

Mike Hankey

В этом коде val установлен на 1, так что каждый раз, когда ledPinA поднимается высоко, вы будете многократно посылать сообщение "автомобиль подарок", если только я здесь что-то не упустил. Чтобы прийти к этому, установите флаг, когда вы 1-й отправляете сообщение, и установите флаг, когда ledPinA идет высоко, и сбросьте его, когда он идет низко, а затем проверьте флаг в вашем коде.

temp = digitalRead(ledpinA);
//temp1 = digitalRead(ledpinB);
if(temp==val && !flag){
    ...
    flag = true;
 } else {
    flag = false;
 }