#include #include #include WiFiUDP Udp; IPAddress remote_IP; #define SET_VOLUME(x) WriteReg(5, 0x84D0 | volume) #define RDA_ADDRESS 0x11 //Dane do połączenia z siecią WIFI const char* ssid = "testowa"; const char* password = "testowaesp"; unsigned int localPort = 8080; int recv_IP = 0; byte packetBuffer[512]; int noBytes = 0; String received_command = ""; String command = ""; char buffer[30]; //Nazwy komend, które powinny być rozpoznane typedef enum { NONE = 0, VOLUME, SET } command_type; void setup() { int i = 0; Wire.begin(); Serial.begin(9600); WiFi.begin(ssid, password); Serial.println(ssid); Serial.println(password); while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500); if (i == 21) { Serial.print("ERROR"); return; } Udp.begin(localPort); Serial.println("OK"); Serial.println(WiFi.localIP()); WriteReg(0x02, 0xC001); // write 0xC002 into Reg.2 (soft reset, enable,RDS, ) WriteReg(0x02, 0xC00d); // write 0xC002 into Reg.2 ( enable,RDS, ) WriteReg(0x05, 0x84d8); // write ,0x84d8 into Reg.3 set_frequency(187); } void loop() { //Odczyt ilości ewentualnych bitów do odczytania z buforu UDP noBytes = Udp.parsePacket(); if (noBytes) { remote_IP = Udp.remoteIP(); received_command = ""; //Odbiór pakietu Udp.read(packetBuffer, noBytes); for (int i = 0; i < noBytes; i++) { received_command = received_command + char(packetBuffer[i]); } if (find_text("esp_8266_radio", received_command) != -1) //Jeżeli w pakiecie znajduje się string zawierający powyższy ciąg, oznacza to rozpoczęcie funkcji parującej { remote_IP = Udp.remoteIP(); Serial.println("Found new application"); Udp.beginPacket(remote_IP, 8080); Udp.write("ok", 2); Udp.endPacket(); } else if ((find_text("start", received_command) != -1) && (Udp.remoteIP() == remote_IP)) //Jeżeli w pakiecie znajduje się ciąg "start" oznacza że może to być komenda sterująca, jeżeli pochodzi ona również od nadawcy, który jest sparowany { switch (get_command(received_command)) { case VOLUME: { int volume = get_value("vol", received_command); Serial.print("Set new volume value:"); Serial.println(volume, DEC); SET_VOLUME(volume); break; } case SET: { int freq = get_value("set", received_command); Serial.print("Set new frequency to:"); sprintf(buffer, "%04d", freq); for(int i = 0; i < 5; i++) { Serial.print(buffer[i]); if(i == 2) Serial.print("."); } Serial.println("MHz"); set_frequency(freq - 870); break; } default: { break; } } } } } //Z powodu specyficznego działania funkcji indexOf, trzeba pracować na kopii danych int find_text(String szukany, String zrodlo) { return zrodlo.indexOf(szukany); } command_type get_command(String received_command) { int poz1 = received_command.indexOf(":"); int poz2 = received_command.indexOf(":", poz1 + 1); String command = received_command.substring(poz1 + 1, poz2); if (find_text("set", command) != -1) { return SET; } else if (find_text("vol", command) != -1) { return VOLUME; } } int get_value(String command, String received_command) { int poz1 = received_command.indexOf(command); if (poz1 == -1) { return -1; } int poz2 = received_command.indexOf(":", poz1 + 1); if (poz2 == -1) { return -1; } int poz3 = received_command.indexOf(":", poz2 + 1); if (poz3 == -1) { return -1; } String value = received_command.substring(poz2 + 1, poz3); int val = value.toInt(); return val; } void set_frequency( int freq) { byte valueH, valueL; valueH = freq >> 2; valueL = ((freq & 3) << 6 | 0x10); Wire.beginTransmission(RDA_ADDRESS); Wire.write(0x03); Wire.write(valueH); Wire.write(valueL); Wire.endTransmission(); } void WriteReg(byte reg, unsigned int value) { Wire.beginTransmission(RDA_ADDRESS); Wire.write(reg); Wire.write(value >> 8); Wire.write(value & 0xFF); if (Wire.endTransmission() != 0) { Serial.println("I2C Error"); } delay(50); } short ReadReg(byte reg) { Wire.beginTransmission(RDA_ADDRESS); Wire.write(reg); Wire.endTransmission(0); Wire.requestFrom(RDA_ADDRESS, 8, 1); return (256 * Wire.read() + Wire.read()); }