Two Arduino HC-05 over Software Serial communication not working - arduino

I am currently working with 1. Master Hc-05 on Arduino Mega and 2. Slave Hc-05 on Arduino Nano where the Nano is sending integer to the Mega.
I have already configured the AT command such that for the Master HC-05:
AT+ROLE=1
AT+CMODE=0
AT+ADDR= (was set to the address of the slave HC-05)
AT+UART=38400,0,0
The AT configuration for Slave HC-05:
AT+Role=0
AT+UART=38400,0,0
I am following the schematic here:
Except I have the pin connections as:
RX of mega to digital pin 3 (soft TX)
TX of mega to digital pin 2 (soft RX)
and
RX of nano to digital pin 3 (soft TX)
TX of nano to digital pin 2 (soft RX)
What I am trying to do is send an integer from Nano(slave) to Mega(master) that is parsed through the serial monitor connected to the Nano, and then print the same integer received on the end of Mega's serial monitor. (I have connected Nano to laptop 1 and Mega to another laptop2)
However, the integer parsed in thorugh laptop connected to Nano's serial monitor is printing but none is printing on the Mega side.
It seems like the two Hc-05 are paired and connected as the two are blinking twice every 2 seconds at the same rate, but they are not receiving any messages on Bluetooth serial?
The code for Nano (Slave / Transmitter):
#include<SoftwareSerial.h>
#define softrx 2
#define softtx3
SoftwareSerial BTSerial(softrx, softtx);
void setup(){
BTSerial.begin(38400);
Serial.begin(9600);
}
void loop(){
while(Serial.available()){
int data = Serial.parseInt(); //reads the data sent through serial monitor
BTSerial.write(data); //send the number to the Master Hc-05
Serial.println(); // print the number sent through the serial monitor
}
}
The code for Mega (Master / Receiver)
#include <SoftwareSerial.h>
#define softrx 2
#define softtx 3
SoftwareSerial BTSerial(softrx, softtx); // RX | TX
void setup() {
BTSerial.begin(38400);
Serial.begin(9600);
}
void loop() {
if (BTSerial.available()>0)
{
char data = BTSerial.read();
Serial.println(data);
}
}
These are just my setup and ultimately I want to connect flex sensors on Nano which sends integer based on sensor data to activate LED connected to mega.
But this simple thing is not even working and I want to know what I am doing wrong here.
Tried connecting tx of the microcontroller to tx of HC-05 but did not work either.

Related

HC-05 Module AT command mode won't respond

I've been trying to connect two HC-05 bluetooth modules together as master and slave devices. I know that to do this i need to establish one as a slave device and one as a master using the AT command mode. I am using an arduino nano with each of the modules and the circuit i have used is shown:
Vcc -----> 5V
GND ----> GND
Rx ------> Rx
Tx ------> Tx
I followed various online tutorials and have used this code:
include SoftwareSerial.h
SoftwareSerial BTSerial(0, 1); // RX | TX
void setup()
{
Serial.begin(9600);
BTSerial.begin(9600); // HC-05 default speed in AT command more
Serial.println("Enter AT commands:");
}
void loop()
{
// Keep reading from HC-05 and send to Arduino Serial Monitor
if (BTSerial.available()){
Serial.write(BTSerial.read());
}
// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available()){
BTSerial.write(Serial.read());
}
}
Using the button on the module or by setting the EN pin high, i am able to put the module into AT mode as displayed by the LED blinking every 2 seconds. However, i receive no response after sending commands to the module using the serial monitor when i should receive a confirmation of my command.
Any ideas where i'm going wrong?
Here's the solution that eventually worked for me: I used this circuit with a voltage divider:
Vcc -----> 5V
GND ----> GND
D2 ------> Tx
D3 ------> Rx
I ended up having to buy an Uno for this to work, I'm assuming then that my Nano's were faulty in some way. I then used the following code:
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); // RX | TX
void setup()
{
Serial.begin(9600);
BTSerial.begin(38400); // HC-05 default speed in AT command more
Serial.println("Enter AT commands:");
}
void loop()
{
// Keep reading from HC-05 and send to Arduino Serial Monitor
if (BTSerial.available()){
Serial.write(BTSerial.read());
}
// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available()){
BTSerial.write(Serial.read());
}
}
This allowed me to enter the AT mode and also receive responses.
One of the issues was that I was using the Tx and Rx pins which are also used to communicate with the computer so cannot be used with the HC-05 at the same time.
Another issue was the baudrate: I alternated between 9600 and 38400 for each communication until I found a combination that worked, and adjusted the speed in the Serial monitor so that it made sense.
Then I was able to use the command mode normally.

Arduino Nano no serial communication SIM800C

I am trying to get my SIM800C to talk with my Arduino. There is no communication happening, though.
#include <SoftwareSerial.h>
SoftwareSerial at(2, 3);
void setup() {
Serial.begin(9600);
at.begin(9600);
}
void loop() {
// try every 2 seconds
delay(2000);
Serial.println("sending AT ... ");
at.println("AT");
while (at.available() > 0) {
Serial.write(at.read());
}
}
I am not able to get an OK back. SIM800C is supposed to detect the baud rate by itself.
I am sure there has to be a simple stupid mistake. I just don't know what to do at this point. I obviously already checked for cable break. Out of desperation I already tried to switch RX and TX. I also tried different baud rates (whatever is within the usual limitations of SoftwareSerial) but it should automatically detect it once a couple of AT commands got in anyway.
Weird enough, the pin PWX on the SIM800C needs to be hooked up to a GND to work. It started blinking every second now and is responding to AT commands.
Also it turned out that this specific module does not ship with autobauding enabled, as stated by the SIM800C documentation. The correct baud rate is 115200.
There are some problems you need to consider:
Use below sample code which transfers data between PC and SIM. Sometimes SIM module would go into power down state and won't respond on any AT command but would print some results in the serial monitor.
As already mentioned in comments it seems that your wiring is wrong and as you declared Software Serial as SoftwareSerial at(2, 3); which means pin 2 is Rx on Arduino and should connect to Tx pin of SIM and pin 3 is Tx on Arduino and should connect to Rx pin of SIM. Please don't mess with the pins and connect the pins like below correctly.
Arduino SIM
Rx 2 ----> Tx
Tx 3 ----> Rx
I'm not sure if you can power on SIM800 with a 500mA USB connector, make sure that use an external 1/2 A power supply for VCC of SIM module.
Look at the blink speed of SIM module if it connected and powered on it would blinky with 3 seconds delay and if it blinks fast, it means that it is being restarted. Also if SIM powered on correctly it would print some info like SIM READY, CALL READY, etc.
Try other baud rates like 115200 and see if you get anything on power on.
I put some macro definition to make pin mappings more clear.
#include <SoftwareSerial.h>
//SIM800 TX is connected to Arduino D2
#define SIM800_TX_PIN 2
//SIM800 RX is connected to Arduino D3
#define SIM800_RX_PIN 3
//Create software serial object to communicate with SIM800
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
void setup() {
//Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
while(!Serial);
//Being serial communication witj Arduino and SIM800
serialSIM800.begin(9600);
delay(1000);
Serial.println("Setup Complete!");
}
void loop() {
//Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
if(serialSIM800.available()){
Serial.write(serialSIM800.read());
}
//Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
if(Serial.available()){
serialSIM800.write(Serial.read());
}
}
Yes this module will not work in this configuration. There is a pin of V_TTL With 5V pin.. This pin enables the TTL logic converter of your GSM.. You have to connect this pin to 5V in case of arduino and to 3V in case of ESP8266.See the pin configuration here

SIM800L Cant Send Message

I have a SIM800L module.
I have configured my 800L SIM module, where I connect OUT+ on LM2596 to VCC on SIM800L and OUT- on LM2596 to GND on SIM800L. Besides that, I connect TX SIM800L to pin 2 Arduino and RX SIM800L to pin 3 Arduino
Then, After the source code is uploaded to the arduino mega 2560 board, the SIM800L module flashes 3 times every 3 seconds, sometimes also blinks 7 times every 3 seconds. So on.
And until now my SIM800L module cannot send messages. where is the problem? thanks please answered
First, you must double check that the modem is connected correctly and have enough power. To ensure that I always try to read the output serial of the modem in startup and make a call to it.
If modem starts correctly it should print some data in the serial output (with default settings) and some of them prints the power issues.
You can use the following example to creating a two-way communication between your host PC and the modem. In here I'm using Serial1 with pins 18, 19.
If I remember correctly the blinks should be every 3 seconds, and if it changes it means that modem is being restarted.
After that, you can send AT commands with your host PC and check the functions.
#include <SoftwareSerial.h>
#define serialSIM800 Serial1
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//wait on host serial
while (!Serial);
//Being serial communication with Arduino and SIM800
// you should double check the default baudrate of SIM800 and set it here
serialSIM800.begin(9600);
delay(1000);
Serial.println(“Setup Complete !”);
}
void loop()
{
//Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
if (serialSIM800.available())
{
Serial.write(serialSIM800.read());
}
//Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
if (Serial.available())
{
serialSIM800.write(Serial.read());
}
}

SoftSerial Not Working ESP8266

I am trying to communicate with my ESP8266 module through Arduino Mega with the ESP's Rx pin connected to Mega's Pin 7 the ESP's Tx pin connected to Mega's Pin 6. I tried to run the following test code:
#include <SoftwareSerial.h>
SoftwareSerial esp8266(6, 7);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Started");
// set the data rate for the SoftwareSerial port
esp8266.begin(9600);
esp8266.write("AT\r\n");
}
void loop() {
if (esp8266.available()) {
Serial.write(esp8266.read());
}
if (Serial.available()) {
esp8266.write(Serial.read());
}
}
I get no response from the ESP8266 module. I then tried to use the Mega's dedicated Tx and Rx pins (1 and 0 respectively). I can send commands using the serial monitor and it replies. First I sent AT+CIOBAUD=9600 under a 115200 baud to change the baud rate of my ESP module to 9600. Then under 9600 baud I sent AT+UART_DEF=9600,8,1,0,0. It replied OK for both as expected. I tried again to run this program but I'm still getting no response from the ESP 8266 module. I also tried simply switching the Rx and Tx pins just to be safe. Still doesn't work. Any ideas on what I might be doing incorrectly?
As you've mentioned in comments, SoftwareSerial esp(6,7) works on UNO but not on Mega. That should be hint big enough to google the Arduino SoftwareSerial reference page, particularly the Limitation section.
In short, unlike UNO the Mega doesn't have Pin Change Interrupt capability on all pins. So you can't have Rx pin on pin 6.

Arduino Serial1

I'm using an Arduino Micro. When I use "Serial.write", etc. with the Arduino's IDE serial monitor, everything is working fine.
However, when I try to read or send data via "Serial1", I get nothing. "Serial1" is supposed to use 0 and 1, RX and TX, respectively.
Do I need to connect these pins through a USB converter or are they connected on the boards USB converter?
Here is the code:
Void setup(){ Serial1.begin(4800); }
Void loop(){ Serial1.prrint('X'); }
The only serial port connected to the USB that the serial monitor can read from is Serial.
Serial1, Serial2, and Serial3 are all logic level serial and will not show up on the Arduino serial monitor.
If you want to see the output from these on your computer, it will require extra hardware.
Serial is the only serial port connected to USB. So serial monitor can access only that port. If you need Serial1 or Serial2 to be accessed by serial monitor, then you should use 'USB to TTL Serial Cable' and connect this to RX and TX pins of the arduino's Serial1 port.
Please visit link for USB to TTL Serial Cable, enter link description here
"Serial1" in Arduino Micro is physically connected to the TX and RX pins (TTL), and "Serial" is just a "virtual port" which you can read using Arduino IDE's Serial Monitor. That’s why Arduino Micro is a little different from another, such as Arduino Nano or Arduino Pro Mini.
If you use Serial and Serial1, you can approach this advantage, upload code using USB and make a connection through Bluetooth (using HC06 connected to physical pins) without disconnecting the USB cable and powered both devices (Arduino Micro and Bluetooth).
If you can't upload code to your Arduino Micro sometimes, press the Arduino Micro's reset button, release it, and press the upload button in Arduino IDE's.
"virtual port" sometimes needs to restart and connect using USB.
This is from Arduino's documentation website:
...Serial: 0 (RX) and 1 (TX). Used to receive (RX) and transmit (TX) TTL serial data using the ATmega32U4 hardware serial capability. Note that on the Micro, the Serial class refers to USB (CDC) communication; for TTL serial on pins 0 and 1, use the Serial1 class.
You said it right. Serial1 is the RX and TX pin, while Serial is a virtual interface between the computer and Arduino. I have used the TX and RX pins for a wireless module, and if you need to use Serial1, it would have to occupy pins 0 and 1, and switch from DLINE to UART on your board.
Make sure you go to tool/board: and select Arduino Mega (or other board with multiply serial ports) or it won't work, because the Uno only has one Serial communication port (aka The TX and RX pins on pins on 1 and 0)! Write 1,2 or 3 depending on what TX and RX pins you are using on the Board. The mega has a whole set of extra pins for Serial 1,2 and 3, for example:
Arduino Uno (etc):
Serial.begin(9600)
Serial.write("testing")
Arduino Mega:
Serial1.begin(9600) // <{or what even baud rate you should use}
Serial1.write("testing")
or
Serial2.begin(9600)
Serial2.write("testing")
or
Serial3.begin(9600)
Serial3.write("testing")
Serial1 is the wrong class for pin 0 and pin 1. You should use Serial class.
Do I need to connect these pins through a USB converter or are they connected on the boards USB converter?
It makes no difference for Serial class.
Use:
Void setup()
{
Serial.begin(4800); // 9600....
}
void loop()
{
if(Serial.available())
{
int a = Serial.read();
Serial.Writeln(a);
}
else
{
Serial.Writeln("Error");
}
}
Open the serial monitor with the icon placed in right corner of Arduino IDE. It will be available if you connect the Arduino with PC.
When you open the Arduino IDE, write this code block:
Void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available())
{
char get = Serial.read();
Serial.Write(get);
}
}
Select the Arduino 9600 port and write something. If you get your written text, your Arduino is ready for serial communication.
You have to define Serial1 by using SoftwareSerial class from SoftwareSerial library, google and download the library:
The code should be something like this:
// Example
SoftwareSerial Serial1(9, 10); // RX and TX, respectively
Void setup() {
Serial1.begin(4800); // Here is your New serial
Serial.begin(9600); // This is where Arduino is connected to your PC
}
Void loop() {
// Code goes Here
}

Resources