www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 工業(yè)控制 > 電路設(shè)計(jì)項(xiàng)目集錦
[導(dǎo)讀]這是一個(gè)演示,展示了我正在開發(fā)的自定義gpt,并在r/arduino上發(fā)布了一系列關(guān)于它的內(nèi)容。它可以很容易地與您的任何項(xiàng)目在您的標(biāo)準(zhǔn)工作。/ Arduino文件夾。它是多平臺(tái)的,所以無論你運(yùn)行的是Windows、macOS還是Linux,它都知道文件夾在哪里。

這是一個(gè)演示,展示了我正在開發(fā)的自定義gpt,并在r/arduino上發(fā)布了一系列關(guān)于它的內(nèi)容。它可以很容易地與您的任何項(xiàng)目在您的標(biāo)準(zhǔn)工作。/ Arduino文件夾。它是多平臺(tái)的,所以無論你運(yùn)行的是Windows、macOS還是Linux,它都知道文件夾在哪里。

在這個(gè)示例項(xiàng)目中,我展示了將它與Arduino Nano一起使用,Arduino Nano上有一個(gè)Microchip ATmega328芯片。

它使用‘ arduino-cli ’工具直接與您的板對(duì)話,該工具在所有平臺(tái)上都可用。

示例對(duì)話與Arduino項(xiàng)目經(jīng)理自定義GPT

它可以分析和編輯您現(xiàn)有的任何項(xiàng)目,只需與它交談,為您提供有關(guān)它們的建議,并編譯和上傳它們,而無需使用任何IDE。

我還發(fā)布了一系列關(guān)于如何使用OpenAI構(gòu)建這個(gè)和其他客戶GPT的文章。

如果有興趣,我也會(huì)為b谷歌的AI平臺(tái)開發(fā)同樣專業(yè)的Gemini Gem。

是的,我必須拍攝我的屏幕,顯示屏幕和Nano視頻的兩個(gè)單獨(dú)的視頻,因?yàn)槲覜]有視頻編輯功能,無法在圖片視頻中創(chuàng)建圖片。但是GPT控制著Nano,我保證。所有的代碼都可以在本系列中以及我的github存儲(chǔ)庫中獲得。

代碼

#!/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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉