#define WOKWI_MODE // Sadece test için yorumdan çıkar. Gerçek kullanımda yorum satırı yap!
#include <WiFi.h>
#include <PubSubClient.h>
#ifndef WOKWI_MODE
#include <BlynkSimpleEsp32.h>
char auth[] = "gbxY4mXYpYG7zpJfimFDNs8rnE0Gn_jd";
#endif
#define btndebounce 100
#define load 25 // 74HC165 PL
#define clock 26 // Ortak clock pini
#define dataIn 27 // 74HC165 Q7
#define latch 32 // 74HC595 ST_CP
#define dataOut 33 // 74HC595 DS
const char* ssid = "Wokwi-GUEST"; // Wokwi için
const char* password = ""; // Wokwi için
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
uint32_t lastSwitchPress = 0;
uint32_t CurrentSwitchPress = 0;
uint8_t outputsUpdate = 0;
void setup() {
Serial.begin(115200);
pinMode(load, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(dataIn, INPUT);
pinMode(latch, OUTPUT);
pinMode(dataOut, OUTPUT);
WiFi.begin(ssid, password);
Serial.print("WiFi bağlanıyor");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Bağlandı");
#ifndef WOKWI_MODE
Blynk.begin(auth, ssid, password);
#endif
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
reconnectMQTT();
}
void loop() {
#ifndef WOKWI_MODE
Blynk.run();
#endif
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
SN74165Control();
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("MQTT bağlanıyor...");
if (client.connect("ESP32_8CH_165to595")) {
Serial.println(" MQTT bağlantısı kuruldu.");
client.subscribe("relay/outputs");
} else {
Serial.print("Bağlantı hatası: ");
Serial.println(client.state());
delay(2000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
char msg[10] = {0};
for (unsigned int i = 0; i < length && i < 9; i++) {
msg[i] = (char)payload[i];
}
msg[length] = '\0';
if (strcmp(topic, "relay/outputs") == 0) {
outputsUpdate = atoi(msg);
digitalWrite(latch, LOW);
shift8Out(dataOut, clock, MSBFIRST, outputsUpdate);
digitalWrite(latch, HIGH);
Serial.print("MQTT ile set edilen röle durumu: ");
Serial.println(outputsUpdate, BIN);
client.publish("relay/status", msg);
}
}
void SN74165Control() {
CurrentSwitchPress = millis();
if (CurrentSwitchPress - lastSwitchPress > btndebounce) {
digitalWrite(load, LOW);
delayMicroseconds(5);
digitalWrite(load, HIGH);
uint8_t incoming = shift8In(dataIn, clock, MSBFIRST);
if (incoming > 0) {
outputsUpdate ^= incoming;
digitalWrite(latch, LOW);
shift8Out(dataOut, clock, MSBFIRST, outputsUpdate);
digitalWrite(latch, HIGH);
char msg[10];
sprintf(msg, "%d", outputsUpdate);
client.publish("relay/inputs", msg);
client.publish("relay/status", msg);
Serial.print("Buton ile röle durumu: ");
Serial.println(outputsUpdate, BIN);
}
lastSwitchPress = CurrentSwitchPress;
}
}
uint8_t shift8In(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint8_t value = 0;
for (int i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
value |= (digitalRead(dataPin) << i);
else
value |= (digitalRead(dataPin) << (7 - i));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
return value;
}
void shift8Out(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) {
for (int i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}