#include<WiFi.h>#include<ESP32Servo.h>constchar*ssid="DGI";constchar*password="dgi@2024!";WiFiServerserver(8888);WiFiClientclient;ServomyServo;constintSERVO_PIN=D0;voidsetup(){Serial.begin(115200);myServo.attach(SERVO_PIN);myServo.write(90);WiFi.begin(ssid,password);while(WiFi.status()!=WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("\nWiFi Connected!");Serial.println(WiFi.localIP());server.begin();}voidloop(){if(!client||!client.connected()){client=server.available();if(client)Serial.println("Client connected!");}if(client&&client.connected()&&client.available()){Stringline=client.readStringUntil('\n');line.trim();intdegree=line.toInt();if(degree>=0&°ree<=180){myServo.write(degree);Serial.println("Moving to: "+String(degree));}}}
Python Tkinter App
importtkinterastkimportsocketimportthreadingESP32_IP="172.16.20.205"PORT=8888classServoApp:def__init__(self,root):self.root=rootroot.title("Servo Controller")root.geometry("400x350")root.configure(bg="#1e1e2e")self.sock=Noneself.connected=Falsetk.Label(root,text="Servo Controller",font=("Arial",20,"bold"),bg="#1e1e2e",fg="#cba6f7").pack(pady=15)tk.Label(root,text="Enter Degree (0 - 180):",font=("Arial",12),bg="#1e1e2e",fg="#cdd6f4").pack()self.degree_entry=tk.Entry(root,font=("Arial",16),width=8,justify="center",bg="#313244",fg="#cdd6f4",insertbackground="white")self.degree_entry.pack(pady=10)self.degree_entry.bind("<Return>",lambdae:self.send_degree())self.slider=tk.Scale(root,from_=0,to=180,orient="horizontal",length=300,bg="#1e1e2e",fg="#cdd6f4",highlightbackground="#1e1e2e",troughcolor="#313244",activebackground="#cba6f7",command=self.slider_moved)self.slider.set(90)self.slider.pack(pady=5)tk.Button(root,text="Move Servo",font=("Arial",13,"bold"),bg="#cba6f7",fg="#1e1e2e",padx=20,pady=8,command=self.send_degree).pack(pady=10)self.status_label=tk.Label(root,text="Connecting...",font=("Arial",10),bg="#1e1e2e",fg="#6c7086")self.status_label.pack()threading.Thread(target=self.connect,daemon=True).start()defconnect(self):try:self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.sock.settimeout(5)self.sock.connect((ESP32_IP,PORT))self.connected=Trueself.root.after(0,lambda:self.status_label.config(text="Connected ✓",fg="#a6e3a1"))exceptExceptionase:self.root.after(0,lambda:self.status_label.config(text=f"Error: {e}",fg="#f38ba8"))defsend_degree(self):try:degree=int(self.degree_entry.get())if0<=degree<=180:self._send(degree)else:self.status_label.config(text="Enter 0 to 180!",fg="#f38ba8")exceptValueError:self.status_label.config(text="Numbers only!!",fg="#f38ba8")defslider_moved(self,val):ifself.connected:self._send(int(val))def_send(self,degree):try:self.sock.sendall(f"{degree}\n".encode())self.status_label.config(text=f"Moved to {degree}° ✓",fg="#a6e3a1")self.slider.set(degree)self.degree_entry.delete(0,tk.END)self.degree_entry.insert(0,str(degree))exceptExceptionase:self.connected=Falseself.status_label.config(text="Disconnected! Restart app.",fg="#f38ba8")root=tk.Tk()app=ServoApp(root)root.mainloop()