OS: Ubuntu 22.04.4 LTS
PlatformIO: Core 6.1.16, Home 3.4.4
I have following src folder structure in my PlatformIO project:
-src
--arduino
---main.cpp
--esp32
---essentials.cpp
---main.cpp
the content of all the three files is as follows:
arduino/main.cpp:
#include<Arduino.h>
#define aggregationCount 10
#define sensorPin 5
#define devicePin 6
#define esp Serial1
String messageFromEsp, messageToEsp;
void setup(){
pinMode(sensorPin,INPUT);
pinMode(devicePin,OUTPUT);
// Serial.begin(9600);
esp.begin(9600);
Serial.begin(9600);
while(!Serial){}
Serial.println("Serial began");
}
void loop(){
if(esp.available()){
messageFromEsp = messageToEsp = "";
messageFromEsp = esp.readStringUntil('\n');
Serial.print("esp:");
Serial.println(messageFromEsp);
if(messageFromEsp.indexOf("giveReading") == 0){
messageToEsp = "reading:" + String(digitalRead(sensorPin));
esp.println(messageToEsp);
Serial.print("sent:");
Serial.println(messageToEsp);
}
else if(messageFromEsp.indexOf("turnDeviceOn") == 0){
digitalWrite(devicePin,HIGH);
messageToEsp = "deviceIs:" + String("ON");
esp.println(messageToEsp);
Serial.print("sent:");
Serial.println(messageToEsp);
}
else if(messageFromEsp.indexOf("turnDeviceOff") == 0){
digitalWrite(devicePin,LOW);
messageToEsp = "deviceIs:" + String("OFF");
esp.println(messageToEsp);
Serial.print("sent:");
Serial.println(messageToEsp);
}
else{
esp.println("invalid command");
}
while(esp.available())esp.read();
}
}
esp32/essentials.cpp
#define ssid "Gondals"
#define password "GondalsRouter"
#define askArdTimeout 3000
#define arduino Serial2
ESPTelnet telnet;
IPAddress myIp(192,168,10,55);
IPAddress subnet(255,255,255,0);
IPAddress gateway(192,168,10,1);
IPAddress dns(192,168,10,1);
String message;
void onTelnetConnect(String ip);
void onTelnetDisconnect(String ip);
void onTelnetInput(String input);
void setupOTA();
void setupTelnet();
//helpingFunctions
void print(String inMessage){
Serial.println(inMessage);
telnet.println(inMessage);
}
String askArduino(String inMessage){
// while(arduino.available())arduino.read();
print("sent:" + inMessage);
arduino.flush();
arduino.println(inMessage);
unsigned long int start = millis();
while((!arduino.available()) && ((millis() - start) < askArdTimeout)){}
message = "";
message = arduino.readStringUntil('\n');
print("message:" + message);
// while(arduino.available())arduino.read();
return message;
}
void onTelnetConnect(String ip){
print("telnet connected from ip: " + ip);
}
void onTelnetDisconnect(String ip){
print("telnet disconnected from ip: "+ip);
}
void onTelnetInput(String input){
print("input received: "+input);
}
void setupOTA(){
ArduinoOTA.onStart([]() {
print("OTA Update started");
});
ArduinoOTA.onEnd([]() {
print("OTA Update ended");
});
ArduinoOTA.onError([](ota_error_t error){
print("OTA Error["+String(error)+"]");
if (error == OTA_AUTH_ERROR) print("Auth Failed");
else if (error == OTA_BEGIN_ERROR) print("Begin Failed");
else if (error == OTA_CONNECT_ERROR) print("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) print("Receive Failed");
else if (error == OTA_END_ERROR) print("End Failed");
});
ArduinoOTA.begin();
print("OTA ready");
}
void setupTelnet(){
if(telnet.begin(55555)){
print("telnet began");
}
else{
print("error in telnet");
}
telnet.onConnect(onTelnetConnect);
telnet.onDisconnect(onTelnetDisconnect);
telnet.onInputReceived(onTelnetInput);
}
esp32/main.cpp
#include <Arduino.h>
#include<ArduinoOTA.h>
#include<ESPTelnet.h>
#include"essentials.h"
#include<freertos/FreeRTOS.h>
#include<freertos/task.h>
// #include<ACS712.h>
#define aggregationCount 10
#define sensorPin 5
#define devicePin 6
enum status {OFF, ON, INVALID};
status deviceStatus = OFF, reading = OFF;
int result = 0, aggregation = 0;
int param = 5;
unsigned long int start = millis();
status changeDevState(status deviceStatus){
String message = deviceStatus ? askArduino("turnDeviceOff") : askArduino("turnDeviceOn");
print(String("ardResp:" + message));
if(message.indexOf("deviceIs:" == 0)){
message = message.substring(9);
if(message.indexOf("ON") == 0)return ON;
else if(message.indexOf("OFF") == 0)return OFF;
}
else print("invalid response");
return INVALID;
}
void turnTheDevice(status statusIn){
if(statusIn) deviceStatus = changeDevState(ON);
else deviceStatus = changeDevState(OFF);
if(deviceStatus)print("device ON");
else print("device OFF");
}
status getReading(){
message = "";
message = askArduino("giveReading");
print("ardResp:" + message);
if(message.indexOf("reading:" == 0)){
message = message.substring(8);
if(message[0] == '0')return OFF;
else if(message[0] == '1')return ON;
}
else print("invalid response");
return INVALID;
}
void services(void *pvParamters){
while(1){
telnet.loop();ArduinoOTA.handle();
}
}
void setup() {
Serial.begin(9600);
arduino.begin(9600);
pinMode(2, OUTPUT);
WiFi.mode(WIFI_AP_STA);
//wireless services initializations
if(!WiFi.config(myIp,gateway,subnet,dns)){
print("static ip config failed");
}
WiFi.begin(ssid,password);
while(WiFi.status() != WL_CONNECTED){
digitalWrite(2, LOW);print(".");delay(500);
digitalWrite(2, HIGH);print(".");delay(500);
print(String(WiFi.status()));
}
setupTelnet();
setupOTA();
xTaskCreate(services,"services",4096,NULL,1,NULL);
}
void loop(){
while(1){
if(deviceStatus == OFF){
do{
reading = getReading();
print(String(reading));
delay(500);
}while(!(reading == 1));
turnTheDevice(ON);
}
else if(deviceStatus == ON){
print("inside deviceON");
result = 0;
for(int m=0,end=aggregationCount*2;m<end;m++){
reading = getReading();
if((reading == 0) || (reading == 1)){
result += reading;
}
delay(500);
print(String(reading));
}
aggregation = (result*100)/(aggregationCount*2);
print("aggregation:" + String(aggregation));
if(aggregation < 25){
turnTheDevice(OFF);
}
}
}
}
and finally, the platformio.ini contents:
[env:megaatmega1280]
platform = atmelavr
board = megaatmega1280
framework = arduino
build_src_filter = +<arduino/*> -<esp32/*>
and the error I am being faced with is:
/tmp/ccCoYnv2.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0xe0): undefined reference to `setup'
<artificial>:(.text.startup+0xe8): undefined reference to `loop'
collect2: error: ld returned 1 exit status
*** [.pio/build/megaatmega1280/firmware.elf] Error 1
What can be the issue?