celem icon

ask_rxtx.ino

celem | PRO | 11/21/16 02:27:28 AM UTC | 0 ⭐ | 817 👁️ | Never ⏰ | []
C++ |

4.82 KB

|

None

|

0 👍

/

0 👎

/*
  ask_rxtx.ino - V2
  AUTHOR: Edward Comer, USA
  Open Source Licenesed under Creative Commons Attribution 4.0 International (CC BY 4.0)
  See: https://creativecommons.org/licenses/by/4.0/
  ------------
  Uses RadioHead library for messaging via a simple ASK transmitter and
  receiver, i.e., FS1000A and MX-RM-5V, etc.
 
  For RadioHead information, see:
  http://www.airspayce.com/mikem/arduino/RadioHead/classRH__ASK.html#details
  ------------
  Controls both transmitter AND receiver
  Receiver is powered by inverted PTTPIN, which powers down receiver when
  transmitting in order to prevent swamping the receiver.
  Receiver MX-RM-5v Working current:≤5.5mA (5.0VDC) nominally 4ma
  Arduino DC Current per I/O Pin: 40.0 mA
 
   +-------+   +---------+
   |FS1000A|   |XD-RF-5V |
   |D 5 G  |   | 5 D  G  |
   ++-+-+--+   +-+-+--+--+
    | | |        | |  |
    | + +        | |  +
    |            | |
  +-+------------+-+--+
  | 1            1 1  |
  | 2            0 1  |
  |    ARDUINO        |
  +-------------------+
*/
 
 
#include <RH_ASK.h>
#include <stdint.h>
#include <SPI.h>    // Not actually used but needed to compile
 
#define SPEED 2000  // The desired bit rate in bits per second
#define RXPIN 11    // The pin that is used to get data from the receiver
#define TXPIN 12    // The pin that is used to send data to the transmitter
#define PTTPIN 10   // Push To Talk pin
#define PTTINVERTED true // true = LOW when transmitting, otherwise HIGH
 
RH_ASK driver(SPEED, RXPIN, TXPIN, PTTPIN, PTTINVERTED);
 
char kbdbuf[RH_ASK_MAX_MESSAGE_LEN];
char rxbuf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t rxbuflen = sizeof(rxbuf);
 
 
const int ledPin = 13; // onboard LED
 
void setup()
{
  digitalWrite(ledPin, HIGH);
  Serial.begin(19200);
  while (!Serial); // Wait for serial connect
  if (!driver.init())
  {
    Serial.println("Radiohead driver.init failed - system halting");
    while (true) {}  // do nothing further until reset
  }
  digitalWrite(ledPin, LOW);
  Serial.println("");
  Serial.print("Maximum message length requested of this Driver is ");
  Serial.print(RH_ASK_MAX_MESSAGE_LEN);
  Serial.println("");
  Serial.print("Maximum message length available in this Driver is ");
  Serial.print(driver.maxMessageLength());
  Serial.println("");
  Serial.println("Setup complete.");
  Serial.println("");
  Serial.println("Enter New message: ");
}
 
/*
   loop, contstantly checking for either a string to transmit or
   a received string. This loop is predominantly non-blocking. The receiver
   is powered down when the transmitter is sending to prevent swamping the
   receiver. Power down/up is accomplished by powering the receiver with
   the RadioHead PTT pin (pin 10). The receiver uses 5V @ 4ma and the
   Arduino can source 40ma.
 
   NOTE: There is no immediate local echo of characters typed
*/
void loop()
{
  if (readline(Serial.read(), kbdbuf, RH_ASK_MAX_MESSAGE_LEN) > 0)
  {
    Serial.print("You entered: [");
    Serial.print(kbdbuf);
    Serial.println("]");
    // Now, Send user typed string via radio
    driver.send(kbdbuf, strlen(kbdbuf));
    driver.waitPacketSent();
    Serial.println("Transmit complete");
    delay(500);  // settling time for RX turnon
    memset(kbdbuf,0,sizeof(kbdbuf));
  }
 
  // Check for data received via radio
  if (driver.recv(rxbuf, &rxbuflen)) // Non-blocking
  {
    // Message with a good checksum received, dump it.
    //driver.printBuffer("Received:", buf, QtyRead);
    Serial.write(0x07); // Ring bell on Putty console
    Serial.print("Received: ");
    Serial.println(rxbuf);
    Serial.println("-------------");
    memset(rxbuf,0,sizeof(rxbuf));
    rxbuflen = sizeof(rxbuf);
    Serial.println("Enter New message: ");
  }
}
 
/**
   Non-blocking string read from terminal
   name: readline(int readchar, char* buffer, int len)
   @param readchar is the character read
   @param buffer is storage for accumulated string
   @param len is maximum length input string allowed
   @return returns length of string read, otherwise negative value
 
   Inspired by Majenko's Hardware Hacking Blog
   http://tinyurl.com/hmb8vwa
*/
int readline(int readchar, char* buffer, int len)
{
  static int pos = 0;
  int ret_pos;
 
  if (readchar > 0) {
    switch (readchar) {
      case '\r': // Terminate with CR or LF
      case '\n':
        ret_pos = pos;
        pos = 0; // Reset position index ready for next entry
        return ret_pos;
      default:
        if (pos < len - 1) {
          buffer[pos++] = readchar;
          buffer[pos] = 0;
        } else {    // else buffer is full
          buffer[pos] = 0;
          ret_pos = pos;
          pos = 0; // Reset position index ready for next entry
          return ret_pos;
        }
    }
  }
  // No end of line has been found, so return -1.
  return -1;
}

Comments