Files
ggwave/examples/arduino-tx2/arduino-tx2.ino

138 lines
4.0 KiB
C++

#include "ggwave/ggwave.h"
const int kPinLed0 = 13;
const int kPinSpeaker = 10;
const int kPinButton0 = 2;
const int kPinButton1 = 4;
const int samplesPerFrame = 128;
const int sampleRate = 6000;
GGWave * g_ggwave = nullptr;
char txt[64];
#define P(str) (strcpy_P(txt, PSTR(str)), txt)
// helper function to output the generated GGWave waveform via a buzzer
void send_text(GGWave & ggwave, uint8_t pin, const char * text, GGWave::TxProtocolId protocolId) {
Serial.print(F("Sending text: "));
Serial.println(text);
ggwave.init(text, protocolId);
ggwave.encode();
const auto & protocol = GGWave::Protocols::tx()[protocolId];
const auto tones = ggwave.txTones();
const auto duration_ms = protocol.txDuration_ms(ggwave.samplesPerFrame(), ggwave.sampleRateOut());
for (auto & curTone : tones) {
const auto freq_hz = (protocol.freqStart + curTone)*ggwave.hzPerSample();
tone(pin, freq_hz);
delay(duration_ms);
}
noTone(pin);
digitalWrite(pin, LOW);
}
void setup() {
Serial.begin(57600);
pinMode(kPinLed0, OUTPUT);
pinMode(kPinSpeaker, OUTPUT);
pinMode(kPinButton0, INPUT);
pinMode(kPinButton1, INPUT);
Serial.println(F("Trying to create ggwave instance"));
auto p = GGWave::getDefaultParameters();
p.payloadLength = 16;
p.sampleRateInp = sampleRate;
p.sampleRateOut = sampleRate;
p.sampleRate = sampleRate;
p.samplesPerFrame = samplesPerFrame;
p.sampleFormatInp = GGWAVE_SAMPLE_FORMAT_I16;
p.sampleFormatOut = GGWAVE_SAMPLE_FORMAT_U8;
p.operatingMode = (ggwave_OperatingMode) (GGWAVE_OPERATING_MODE_TX | GGWAVE_OPERATING_MODE_TX_ONLY_TONES | GGWAVE_OPERATING_MODE_USE_DSS);
GGWave::Protocols::tx().only(GGWAVE_PROTOCOL_MT_FASTEST);
static GGWave ggwave(p);
ggwave.setLogFile(nullptr);
Serial.println(ggwave.heapSize());
g_ggwave = &ggwave;
Serial.println(F("Instance initialized"));
}
int pressed = 0;
bool isDown = false;
void loop() {
auto & ggwave = *g_ggwave;
delay(1000);
digitalWrite(kPinLed0, HIGH);
send_text(ggwave, kPinSpeaker, P("Hello!"), GGWAVE_PROTOCOL_MT_FASTEST);
digitalWrite(kPinLed0, LOW);
delay(2000);
digitalWrite(kPinLed0, HIGH);
send_text(ggwave, kPinSpeaker, P("This is a"), GGWAVE_PROTOCOL_MT_FASTEST);
send_text(ggwave, kPinSpeaker, P("ggwave demo"), GGWAVE_PROTOCOL_MT_FASTEST);
digitalWrite(kPinLed0, LOW);
delay(2000);
digitalWrite(kPinLed0, HIGH);
send_text(ggwave, kPinSpeaker, P("The arduino"), GGWAVE_PROTOCOL_MT_FASTEST);
delay(200);
send_text(ggwave, kPinSpeaker, P("transmits data"), GGWAVE_PROTOCOL_MT_FASTEST);
delay(200);
send_text(ggwave, kPinSpeaker, P("using sound"), GGWAVE_PROTOCOL_MT_FASTEST);
delay(200);
send_text(ggwave, kPinSpeaker, P("through a buzzer"), GGWAVE_PROTOCOL_MT_FASTEST);
digitalWrite(kPinLed0, LOW);
delay(1000);
digitalWrite(kPinLed0, HIGH);
send_text(ggwave, kPinSpeaker, P("The sound is"), GGWAVE_PROTOCOL_MT_FASTEST);
delay(200);
send_text(ggwave, kPinSpeaker, P("decoded in a"), GGWAVE_PROTOCOL_MT_FASTEST);
delay(200);
send_text(ggwave, kPinSpeaker, P("web page."), GGWAVE_PROTOCOL_MT_FASTEST);
digitalWrite(kPinLed0, LOW);
delay(1000);
digitalWrite(kPinLed0, HIGH);
send_text(ggwave, kPinSpeaker, P("Press the button!"), GGWAVE_PROTOCOL_MT_FASTEST);
digitalWrite(kPinLed0, LOW);
Serial.println(F("Starting main loop"));
while (true) {
int but0 = digitalRead(kPinButton0);
int but1 = digitalRead(kPinButton1);
if (but1 == LOW && isDown == false) {
delay(200);
++pressed;
isDown = true;
} else if (but1 == HIGH) {
isDown = false;
}
if (but0 == LOW) {
snprintf(txt, 16, "Pressed: %d", pressed);
digitalWrite(kPinLed0, HIGH);
send_text(ggwave, kPinSpeaker, txt, GGWAVE_PROTOCOL_MT_FASTEST);
digitalWrite(kPinLed0, LOW);
pressed = 0;
}
}
}