#include <map>
#include <Arduino.h>
#include <EEPROM.h>
#include <iostream>
#include <vector>
#include <string>
struct PinConfig {
int address;
int pin;
int mode; // 0 untuk INPUT, 1 untuk OUTPUT
float value;
String serialize() const {
return "Address: "+String(address)+",Pin :"+String(pin)+", Mode: " + String(mode) + ", Value: " + String(value);
} // Nilai pin (misalnya, HIGH atau LOW untuk OUTPUT)
};
std::map<String, PinConfig> pinset;
std::vector<std::string> splitString(const String &input, char delimiter) {
std::vector<std::string> result;
size_t start = 0;
size_t end = input.indexOf(delimiter);
while (end != -1) { // Ganti String::npos dengan -1
result.push_back(input.substring(start, end).c_str()); // Konversi ke std::string
start = end + 1;
end = input.indexOf(delimiter, start);
}
result.push_back(input.substring(start).c_str()); // Bagian terakhir
return result;
}
void initialPinMode(){
// pinset["D13"]={5,13,0,0};
// pinset["D12"]={6,12,0,0};
// pinset["D14"]={7,14,0,0};
// pinset["D27"]={8,27,0,0};
pinset["A34"]={5,34,0,0};
pinset["A33"]={6,33,0,0};
}
void pinModeSet(){
initialPinMode();
for ( auto& pair : pinset) {
PinConfig rm;
EEPROM.get(pair.second.address,rm);
if(rm.mode>1){
pair.second=rm;
}
if(pair.first.startsWith("D")){
if(pair.second.mode==1){
pinMode(pair.second.pin, OUTPUT);
if(pair.second.value>0){
digitalWrite(pair.second.pin, HIGH);
}else{
digitalWrite(pair.second.pin, LOW);
}
digitalWrite(pair.second.pin, LOW);
}else{
pinMode(pair.second.pin, INPUT);
}
}
}
Serial.println("PIN SET DONE");
}
void loopPin(){
for ( auto& pair : pinset) {
if(pair.second.mode==0){
if(pair.first.startsWith("D")){
// Serial.println("read pin "+String(pair.second.pin));
pair.second.value=digitalRead(pair.second.pin);
}else{
pair.second.value=analogRead(pair.second.pin);
}
pinset[pair.first]=pair.second;
}else if(pair.second.mode==1){
if(pair.first.startsWith("D")){
digitalWrite(pair.second.pin, pair.second.value>0?HIGH:LOW);
}else{
digitalWrite(pair.second.pin, pair.second.value);
}
}
}
}
void savePinMode(){
for (auto& pair : pinset) {
EEPROM.put(pair.second.address,pair.second);
Serial.println("SET PIN :--> "+pair.second.serialize());
delay(100);
}
EEPROM.commit();
Serial.println("SAVED PIN");
}
std::map<String, PinConfig> pinshow(){
std::map<String, PinConfig> allpin;
for (int i = 0; i <= 60; i++) {
PinConfig sa;
EEPROM.get(i,sa);
if(sa.address!=-1){
sa.address=i;
Serial.println(sa.serialize());
allpin[String(sa.pin)]=sa;
}
}
return allpin;
}
void resetPin(){
for (int i = 0; i <= 60; i++) {
EEPROM.put(i,0);
}
Serial.println("RSERT PIN DONE");
}
void setup() {
EEPROM.begin(61);
Serial.begin(9600);
PinConfig val;
EEPROM.get(5,val);
if(val.mode==-1){
pinModeSet();
savePinMode();
}else{
pinModeSet();
}
// pinMode(35, INPUT);
// pinMode(32, OUTPUT);
// put your setup code here, to run once:
}
void getValue(){
for (auto& pair : pinset) {
Serial.println("VALUE PIN :--> "+pair.second.serialize());
}
}
void loop() {
loopPin();
// Serial.println("NILAI PIN 35 "+String(digitalRead(35)));
Serial.println("NILAI PIN 32 "+String(analogRead(33)));
if(Serial.available()){
String a=Serial.readString();
Serial.println(a);
if(a.startsWith("SET#")){
std::vector<std::string> output =splitString(a.c_str(),'#');
if(output[1]=="PINMODE"){
// Konversi std::string ke String terlebih dahulu
String pinName = String(output[2].c_str());
String addressStr = String(output[3].c_str());
String pinStr = String(output[4].c_str());
String modeStr = String(output[5].c_str());
String valueStr = String(output[6].c_str());
PinConfig x = {
addressStr.toInt(),
pinStr.toInt(),
modeStr.toInt(),
valueStr.toFloat()
};
Serial.println("PINSET "+x.serialize());
pinset[pinName]=x;
EEPROM.put(x.address,x);
EEPROM.commit();
}
}else if(a.startsWith("STATUS#")){
pinshow();
}else if(a.startsWith("RESETPIN#")){
resetPin();
}
}
getValue();
// if(digitalRead(35)==HIGH){
// Serial.println("NILAI PIN 35 HIGHT");
// digitalWrite(32,HIGH);
// }else{
// digitalWrite(32, LOW);
// }
delay(1000);
// put your main code here, to run repeatedly:
}