当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]这是一个演示,展示了我正在开发的自定义gpt,并在r/arduino上发布了一系列关于它的内容。它可以很容易地与您的任何项目在您的标准工作。/ Arduino文件夹。它是多平台的,所以无论你运行的是Windows、macOS还是Linux,它都知道文件夹在哪里。

这是一个演示,展示了我正在开发的自定义gpt,并在r/arduino上发布了一系列关于它的内容。它可以很容易地与您的任何项目在您的标准工作。/ Arduino文件夹。它是多平台的,所以无论你运行的是Windows、macOS还是Linux,它都知道文件夹在哪里。

在这个示例项目中,我展示了将它与Arduino Nano一起使用,Arduino Nano上有一个Microchip ATmega328芯片。

它使用‘ arduino-cli ’工具直接与您的板对话,该工具在所有平台上都可用。

示例对话与Arduino项目经理自定义GPT

它可以分析和编辑您现有的任何项目,只需与它交谈,为您提供有关它们的建议,并编译和上传它们,而无需使用任何IDE。

我还发布了一系列关于如何使用OpenAI构建这个和其他客户GPT的文章。

如果有兴趣,我也会为b谷歌的AI平台开发同样专业的Gemini Gem。

是的,我必须拍摄我的屏幕,显示屏幕和Nano视频的两个单独的视频,因为我没有视频编辑功能,无法在图片视频中创建图片。但是GPT控制着Nano,我保证。所有的代码都可以在本系列中以及我的github存储库中获得。

代码

#!/usr/bin/env python3

"""

server.py

FastAPI server for managing Arduino projects with arduino-cli.

Exposes granular endpoints for OpenAI GPT integration.

@author Trent M. Wyatt (ripred)

@date February 19, 2025

@version 1.1

"""

import os

import subprocess

import logging

import platform

from fastapi import FastAPI, HTTPException

from pydantic import BaseModel

from typing import Optional, Dict, List

from pathlib import Path

# Set up logging

logging.basicConfig(

level=logging.INFO,

format="%(asctime)s - %(levelname)s - %(message)s",

handlers=[

logging.FileHandler("server.log"),

logging.StreamHandler()

]

)

logger = logging.getLogger(__name__)

app = FastAPI(

title="Arduino Project Manager",

description="API for managing Arduino projects with arduino-cli",

version="1.1.0"

)

# Determine OS and set Arduino directory dynamically

OS_TYPE = platform.system() # Detects 'Windows', 'Linux', or 'Darwin' (macOS)

if OS_TYPE == "Darwin": # macOS

ARDUINO_DIR = Path.home() / "Documents" / "Arduino"

elif OS_TYPE == "Windows": # Windows

ARDUINO_DIR = Path(os.environ["USERPROFILE"]) / "Documents" / "Arduino"

elif OS_TYPE == "Linux": # Linux

ARDUINO_DIR = Path.home() / "Arduino"

else:

raise RuntimeError(f"Unsupported operating system: {OS_TYPE}")

# Ensure the directory exists

ARDUINO_DIR.mkdir(parents=True, exist_ok=True)

logger.info(f"Arduino projects directory set to: {ARDUINO_DIR}")

# Pydantic models for request validation

class ProjectRequest(BaseModel):

project_name: str

class SketchRequest(BaseModel):

project_name: str

sketch_content: str

class UploadRequest(BaseModel):

project_name: str

port: str

# Helper function to run shell commands

def run_command(command: List[str], cwd: Optional[Path] = None) -> Dict[str, str]:

try:

result = subprocess.run(

command,

cwd=cwd,

capture_output=True,

text=True,

check=True

)

return {"status": "success", "output": result.stdout, "error": ""}

except subprocess.CalledProcessError as e:

logger.error(f"Command failed: {command}, Error: {e.stderr}")

return {"status": "error", "output": "", "error": e.stderr}

except Exception as e:

logger.error(f"Unexpected error: {str(e)}")

return {"status": "error", "output": "", "error": str(e)}

@app.post("/check_folder", summary="Check if project folder exists")

async def check_folder(request: ProjectRequest):

"""Check if the specified project folder exists."""

project_dir = ARDUINO_DIR / request.project_name

exists = project_dir.exists() and project_dir.is_dir()

logger.info(f"Checked folder {project_dir}: {'exists' if exists else 'does not exist'}")

return {"exists": exists}

@app.post("/read_files", summary="Read all files in project folder")

async def read_files(request: ProjectRequest):

"""Read all files in the specified project folder."""

project_dir = ARDUINO_DIR / request.project_name

if not project_dir.exists() or not project_dir.is_dir():

logger.error(f"Project folder not found: {project_dir}")

raise HTTPException(status_code=404, detail="Project folder not found")

files_content = {}

for file_path in project_dir.glob("*"):

try:

with open(file_path, "r") as f:

files_content[file_path.name] = f.read()

except Exception as e:

logger.error(f"Failed to read file {file_path}: {str(e)}")

raise HTTPException(status_code=500, detail=f"Failed to read file {file_path.name}: {str(e)}")

logger.info(f"Read files from {project_dir}: {list(files_content.keys())}")

return {"files": files_content}

@app.post("/create_project", summary="Create project folder and write sketch")

async def create_project(request: SketchRequest):

"""Create a project folder and write the sketch file if it doesn't exist."""

project_dir = ARDUINO_DIR / request.project_name

sketch_file = project_dir / f"{request.project_name}.ino"

if project_dir.exists() and sketch_file.exists():

logger.error(f"Project already exists: {project_dir}")

raise HTTPException(status_code=400, detail="Project already exists")

try:

project_dir.mkdir(parents=True, exist_ok=True)

with open(sketch_file, "w") as f:

f.write(request.sketch_content)

logger.info(f"Created project {project_dir} with sketch {sketch_file}")

return {"status": "success", "message": f"Created project {request.project_name}"}

except Exception as e:

logger.error(f"Failed to create project {project_dir}: {str(e)}")

raise HTTPException(status_code=500, detail=f"Failed to create project: {str(e)}")

@app.post("/update_sketch", summary="Update sketch file contents")

async def update_sketch(request: SketchRequest):

"""Update the contents of the sketch file in the project folder."""

project_dir = ARDUINO_DIR / request.project_name

sketch_file = project_dir / f"{request.project_name}.ino"

if not project_dir.exists() or not sketch_file.exists():

logger.error(f"Project or sketch not found: {sketch_file}")

raise HTTPException(status_code=404, detail="Project or sketch file not found")

try:

with open(sketch_file, "w") as f:

f.write(request.sketch_content)

logger.info(f"Updated sketch {sketch_file}")

return {"status": "success", "message": f"Updated sketch {request.project_name}.ino"}

except Exception as e:

logger.error(f"Failed to update sketch {sketch_file}: {str(e)}")

raise HTTPException(status_code=500, detail=f"Failed to update sketch: {str(e)}")

@app.post("/compile_project", summary="Compile project using arduino-cli")

async def compile_project(request: ProjectRequest):

"""Compile the specified project using arduino-cli."""

project_dir = ARDUINO_DIR / request.project_name

if not project_dir.exists() or not (project_dir / f"{request.project_name}.ino").exists():

logger.error(f"Project or sketch not found: {project_dir}")

raise HTTPException(status_code=404, detail="Project or sketch file not found")

command = ["arduino-cli", "compile", "--fqbn", "arduino:avr:nano:cpu=atmega328old", str(project_dir)]

result = run_command(command, cwd=ARDUINO_DIR)

logger.info(f"Compilation result for {project_dir}: {result['status']}")

if result["status"] == "error":

raise HTTPException(status_code=500, detail=f"Compilation failed: {result['error']}")

return result

@app.post("/upload_project", summary="Upload compiled project to Arduino")

async def upload_project(request: UploadRequest):

"""Upload the compiled project to the specified Arduino port."""

project_dir = ARDUINO_DIR / request.project_name

if not project_dir.exists() or not (project_dir / f"{request.project_name}.ino").exists():

logger.error(f"Project or sketch not found: {project_dir}")

raise HTTPException(status_code=404, detail="Project or sketch file not found")

command = ["arduino-cli", "upload", "-p", request.port, "--fqbn", "arduino:avr:nano:cpu=atmega328old", str(project_dir)]

result = run_command(command, cwd=ARDUINO_DIR)

logger.info(f"Upload result for {project_dir} to {request.port}: {result['status']}")

if result["status"] == "error":

raise HTTPException(status_code=500, detail=f"Upload failed: {result['error']}")

return result

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭