@Robin2 Thanks. I read through the guide more thoroughly.
The code is working for data transmission from one Arduino Uno to another Arduino Uno.
When I hook up the HC-12 to my Arduino Pro Mini for transmission I am able to see that the data is properly being printed on the serial monitor on the transmitter side.
However, on the receiver end the Arduino Uno doesn't get data. The serial monitor shows a blank screen.
My guess is it's not a program issue at this point now but probably
an insufficient power provided to the HC-12 issue. Not 100% sure.
The Arduino Pro Mini is the 3.3V, 8 Mhz version.
I got the completed code for anyone that may need to refer to it or use it written below.
Here is what data looks like on the transmission end:
<380,148,224,260,1196,79>
Here is what successful reception of data looks like (between two Arduino Uno's):
<732,180,264,290,1272,82>
AZIMUTH MOTOR MOVES COUNTERCLOCKWISE
ELEVATION MOTOR MOVES CLOCKWISE
TRANSMITTER CODE:
#include <SoftwareSerial.h>
const byte HC12RxdPin = 11; // RECEIVE PIN ON HC12
const byte HC12TxdPin = 12; // TRANSMIT PIN ON HC12
SoftwareSerial HC12(HC12TxdPin, HC12RxdPin); // CREATE SOFTWARE SERIAL PORT
void setup() {
HC12.begin(9600); //SERIAL PORT TO HC12
}
void loop() {
//LIGHT SENSORS CONNNECTED TO ANALOG PIN ON ARDUINO BOARD
int TR = analogRead(A1); //TOP RIGHT SENSOR
int BR = analogRead(A0); //BOTTOM RIGHT SENSOR
int TL = analogRead(A2); //TOP LEFT SENSOR
int BL = analogRead(A3); //BOTTOM LEFT SENSOR
int DT = analogRead(A6) * 4; //CONTROL DELAY TIME BETWEEN READINGS OF SENSORS
int TE = analogRead(A7) / 4; //SET TOLERANCE VALUE FOR DIFFERENCE BETWEEN SENSORS
HC12.print("<"); //SENDS ANALOG VALUES IN THIS FORMAT: I.E. <380,148,224,260,1196,79>
HC12.print(TR);
HC12.print(",");
HC12.print(BR);
HC12.print(",");
HC12.print(TL);
HC12.print(",");
HC12.print(BL);
HC12.print(",");
HC12.print(DT);
HC12.print(",");
HC12.print(TE);
HC12.print(">");
HC12.println();
delay(DT);
}
RECEIVER CODE:
#include <SoftwareSerial.h>
const byte HC12RxdPin = 11; // RECEIVE PIN ON HC12
const byte HC12TxdPin = 12; // TRANSMIT PIN ON HC12
SoftwareSerial HC12(HC12TxdPin, HC12RxdPin); // CREATE SOFTWARE SERIAL PORT
// AZIMUTH AND ELEVATION PWM PINS ON EACH H-BRIDGE MUST BE CONNECTED TO FOUR PWM (PULSE WIDTH MODULATION) PINS ON ARDUINO.
// FOR UNO/MICRO/PRO MINI THEY ARE: 3,5,6,9,10,11.
int AREN = 2; int ARPWM = 3; int ALEN = 4; int ALPWM = 5; // MOTOR AZIMUTH ADJUSTMENT
int EREN = 7; int ERPWM = 6; int ELEN = 8; int ELPWM = 9; // MOTOR ELEVATION ADJUSTMENT
const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars]; // TEMPORARY ARRAY FOR USE WHEN PARSING
// VARIABLES TO HOLD THE PARSED DATA
int TR = 0; //TOP RIGHT SENSOR
int BR = 0; //BOTTOM RIGHT SENSOR
int TL = 0; //TOP LEFT SENSOR
int BL = 0; //BOTTOM LEFT SENSOR
int DT = 0; //CONTROL DELAY TIME BETWEEN READINGS OF SENSORS
int TE = 0; //SET TOLERANCE VALUE FOR DIFFERENCE BETWEEN SENSORS
boolean newData = false;
//====================
void setup() {
Serial.begin(9600); //SERIAL PORT TO PC
HC12.begin(9600); //SERIAL PORT TO HC12
pinMode(AREN, OUTPUT); pinMode(ARPWM, OUTPUT); pinMode(ALEN, OUTPUT); pinMode(ALPWM, OUTPUT); //SET ALL MOTOR CONTROL PINS TO OUTPUTS
pinMode(EREN, OUTPUT); pinMode(ERPWM, OUTPUT); pinMode(ELEN, OUTPUT); pinMode(ELPWM, OUTPUT);
}
void loop() {
recvWithStartEndMarkers();
if (newData == true) {
strcpy(tempChars, receivedChars);
// THIS TEMPORARY COPY IS NECESSARY TO PROTECT THE ORIGINAL DATA
// BECAUSE STRTOK() USED IN PARSEDATA() REPLACES THE COMMAS WITH \0
parseData();
showParsedData();
newData = false;
}
int avt = (TR + TL) / 2; // AVERAGE VALUE TOP
int avd = (BL + BR) / 2; // AVERAGE VALUE DOWN
int avl = (TL + BL) / 2; // AVERAGE VALUE LEFT
int avr = (TR + BR) / 2; // AVERAGE VALUE RIGHT
int dv = avt - avd; // AVERAGE DIFFERENCE OF TOP AND BOTTOM LIGHT SENSORS
int dh = avl - avr;// AVERAGE DIFFERENCE OF LEFT AND RIGHT LIGHT SENSORS
if (-1 * TE > dh || dh > TE) // CHECK IF THE DIFFERENCE IN LEFT AND RIGHT LIGHT SENSORS IS WITHIN TOLERANCE RANGE
{
if (avl > avr) // IF AVERAGE LIGHT SENSOR VALUES ON LEFT SIDE ARE GREATER THAN RIGHT SIDE, AZIMUTH MOTOR ROTATES CLOCKWISE
{
digitalWrite(AREN, HIGH); analogWrite(ARPWM, 255); // SET SPEED OUT OF POSSIBLE RANGE 0~255
digitalWrite(ALEN, HIGH); digitalWrite (ALPWM, LOW);
Serial.println("AZIMUTH MOTOR MOVES CLOCKWISE");
Serial.println(" ");
}
else // IF AVERAGE LIGHT SENSOR VALUES ON RIGHT SIDE ARE GREATER THAN ON LEFT SIDE, AZIMUTH MOTOR ROTATES COUNTERCLOCKWISE
{
digitalWrite(ALEN, HIGH); analogWrite(ALPWM, 255);
digitalWrite(AREN, HIGH); digitalWrite(ARPWM, LOW);
Serial.println("AZIMUTH MOTOR MOVES COUNTERCLOCKWISE");
Serial.println(" ");
}
}
else if (-1 * TE < dh || dh < TE) //IF DIFFERENCE IS SMALLER THAN TOLERANCE, STOP AZIMUTH MOTOR
{
digitalWrite(AREN, LOW); digitalWrite(ALEN, LOW);
Serial.println("AZIMUTH MOTOR STOPS");
Serial.println(" ");
}
if (-1 * TE > dv || dv > TE) //CHECK IF THE DIFFERENCE IN TOP/BOTTOM LIGHT SENSORS IS GREATER THAN TOLERANCE
{
if (avt > avd) //IF AVERAGE LIGHT SENSOR VALUES ON TOP SIDE ARE GREATER THAN ON BOTTOM SIDE THEN ELEVATION MOTOR ROTATES CLOCKWISE
{
digitalWrite(EREN, HIGH); analogWrite(ERPWM, 255);
digitalWrite(ELEN, HIGH); digitalWrite(ELPWM, LOW);
Serial.println("ELEVATION MOTOR MOVES CLOCKWISE");
Serial.println(" ");
}
else //IF AVERAGE LIGHT SENSOR VALUES ON BOTTOM SIDE ARE GREATER THAN ON TOP SIDE THEN ELEVATION MOTOR ROTATES COUNTERCLOCKWISE
{
digitalWrite(ELEN, HIGH); analogWrite(ELPWM, 255);
digitalWrite(EREN, HIGH); digitalWrite(ERPWM, LOW);
Serial.println("ELEVATION MOTOR MOVES COUNTERCLOCKWISE");
Serial.println(" ");
}
}
else if (-1 * TE < dv || dv < TE) //IF DIFFERENCE IS SMALLER THAN TOLERANCE, STOP ELEVATION MOTOR
{
digitalWrite(EREN, LOW); digitalWrite(ELEN, LOW);
Serial.println("ELEVATION MOTOR STOPS");
Serial.println(" ");
}
delay(DT);
}
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (HC12.available() > 0 && newData == false) {
rc = HC12.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // TERMINATE THE STRING
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
//===================
void parseData() { // SPLIT THE DATA INTO ITS PARTS
char * strtokIndx; // THIS IS USED BY STRTOK() AS AN INDEX
strtokIndx = strtok(tempChars, ","); // GET THE FIRST PART - THE STRING
TR = atoi(strtokIndx); // CONVERT THIS PART TO AN INTEGER
strtokIndx = strtok(NULL, ","); // THIS CONTINUES WHERE THE PREVIOUS CALL LEFT OFF
BR = atoi(strtokIndx);
strtokIndx = strtok(NULL, ","); //
TL = atoi(strtokIndx);
strtokIndx = strtok(NULL, ","); //
BL = atoi(strtokIndx);
strtokIndx = strtok(NULL, ","); //
DT = atoi(strtokIndx);
strtokIndx = strtok(NULL, ","); //
TE = atoi(strtokIndx);
}
//======================
void showParsedData() { // SHOWS PARSED DATA IN SERIAL MONITOR OUTPUT OF PC
Serial.print("<");
Serial.print(TR);
Serial.print(",");
Serial.print(BR);
Serial.print(",");
Serial.print(TL);
Serial.print(",");
Serial.print(BL);
Serial.print(",");
Serial.print(DT);
Serial.print(",");
Serial.print(TE);
Serial.print(">");
Serial.println();
}