#include "secrets.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <Wire.h>
#include <TimeLib.h>
#define AWS_IOT_PUBLISH_TOPIC "outTopic"
#define AWS_IOT_SUBSCRIBE_TOPIC "esp32/sub"
// Define the RPM sensor pin
int rpm_sensor = 15;
int voltage_sensor = 14;
float v;
int potValue;
// Variables for tachometer logic
volatile unsigned long pulseCount = 0; // Variable to store pulse count
unsigned long startTime = millis(); // Stores start time for RPM calculation
const float revolutionsPerPulse = 1.0; // Adjust revolutions per pulse according to your setup
// AWS IoT configuration
WiFiClientSecure net;
PubSubClient client(net);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "id.pool.ntp.org");
void connectAWS() {
Serial.println("Connecting to Wi-Fi");
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi connected");
Serial.println("Connecting to AWS IoT");
net.setCACert(AWS_CERT_CA);
net.setCertificate(AWS_CERT_CRT);
net.setPrivateKey(AWS_CERT_PRIVATE);
client.setServer(AWS_IOT_ENDPOINT, 8883);
client.setCallback(messageHandler);
while (!client.connected()) {
Serial.print(".");
if (client.connect(THINGNAME)) {
Serial.println("\nConnected to AWS IoT");
client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
} else {
Serial.println("\nAWS IoT Connection Failed! Retrying...");
delay(1000);
}
}
}
void publishRPM() {
unsigned long elapsedTime = millis() - startTime;
if (elapsedTime > 5000) { // Update RPM every five seconds
float rpm = (float)pulseCount * 60.0 / elapsedTime * revolutionsPerPulse;
pulseCount = 0; // Reset pulse count
startTime = millis();
StaticJsonDocument<200> doc;
time_t epochTime = timeClient.getEpochTime();
struct tm *timeInfo = localtime(&epochTime);
char timestampBuffer[20]; // Adjust size if needed
strftime(timestampBuffer, sizeof(timestampBuffer), "%Y-%m-%d %H:%M:%S", timeInfo);
doc["rpm"] = rpm;
doc["voltage"] = v;
doc["timestamps"] = timestampBuffer; // Add current time
char jsonBuffer[512];
serializeJson(doc, jsonBuffer);
client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}
}
void messageHandler(char* topic, byte* payload, unsigned int length) {
Serial.print("Incoming message from topic: ");
Serial.println(topic);
StaticJsonDocument<200> doc;
deserializeJson(doc, payload, length);
const char* message = doc["message"];
Serial.println(message);
}
void readAnalog(){
}
void setup() {
pinMode(rpm_sensor, INPUT);
pinMode(voltage_sensor, INPUT);
Serial.begin(115200);
connectAWS();
Wire.begin();
timeClient.begin();
timeClient.setTimeOffset(0);
attachInterrupt(digitalPinToInterrupt(rpm_sensor), countPulse, RISING); // Attach interrupt to RPM sensor pin
readAnalog();
}
void loop() {
publishRPM();
client.loop();
timeClient.update();
potValue = analogRead(potPin);
Serial.print("RPM: ");
Serial.println(pulseCount);
Serial.println("Voltage:");
Serial.print()
delay(5000);
}
void countPulse() {
pulseCount++;
}