chatGPT是一种基于人工智能技术的自然语言处理模型,它使用了深度学习算法,可以对人类语言进行理解和生成。chatGPT可以用于对话系统、智能客服、问答系统等场景,能够实现自然、流畅的对话。
chatGPT的核心技术是基于GPT(Generative Pre-trained Transformer)模型,它是一种预训练语言模型,可以通过大规模的语料库进行训练,从而学习到语言的规律和特征。在实际应用中,chatGPT可以通过微调等方式进行定制化,以适应不同的应用场景和用户需求。
chatGPT的优点包括:
提示:chatGPT生成代码秒便生产力工具,Ctrl+'C' / Ctrl+'V'变得更容易。chatGPT 链接 [www.laicj.cn](https://laicj.cn)。
利用chatGPT对自然语言解析和庞大的知识库,实际使用中需求代码。
本篇文章使用网络搜索到chatGPT工具生成代码。
运行环境:树莓派4B,Ubuntu20.04
数组包含4个连续GPIO,使用sysfs接口按照数组申请
主菜单包含申请GPIO选项和退出选项,选择gpio选项后进入子菜单;子菜单中包含控制GPIO高电平、低电平和退出选项,选择高电平选项控制GPIO高电平,选择低电平选项控制GPIO低电平,选择退出回到主菜单;主菜单可选择其他选项
以下是实现该功能的 Bash 代码:
#!/bin/bash
# 定义GPIO数组
gpio_array=(17 18 19 20)
# 申请GPIO
function request_gpio() {
for gpio in ${gpio_array[@]}; do
echo $gpio > /sys/class/gpio/export
done
echo "GPIO已申请"
}
# 控制GPIO高电平
function set_gpio_high() {
echo "请输入要控制的GPIO编号(17-20):"
read gpio_num
if [[ $gpio_num -ge 17 && $gpio_num -le 20 ]]; then
gpio_index=$(($gpio_num-17))
echo "1" > /sys/class/gpio/gpio${gpio_array[$gpio_index]}/value
echo "GPIO${gpio_num}已设置为高电平"
else
echo "输入的GPIO编号无效"
fi
}
# 控制GPIO低电平
function set_gpio_low() {
echo "请输入要控制的GPIO编号(17-20):"
read gpio_num
if [[ $gpio_num -ge 17 && $gpio_num -le 20 ]]; then
gpio_index=$(($gpio_num-17))
echo "0" > /sys/class/gpio/gpio${gpio_array[$gpio_index]}/value
echo "GPIO${gpio_num}已设置为低电平"
else
echo "输入的GPIO编号无效"
fi
}
# 释放GPIO
function release_gpio() {
for gpio in ${gpio_array[@]}; do
echo $gpio > /sys/class/gpio/unexport
done
echo "GPIO已释放"
}
# 主菜单
function main_menu() {
while true; do
echo "请选择操作:"
echo "1. 申请GPIO"
echo "2. 控制GPIO"
echo "3. 释放GPIO"
echo "4. 退出"
read choice
case $choice in
1)
request_gpio
;;
2)
gpio_menu
;;
3)
release_gpio
;;
4)
exit 0
;;
*)
echo "无效的选项"
;;
esac
done
}
# GPIO子菜单
function gpio_menu() {
while true; do
echo "请选择操作:"
echo "1. 控制高电平"
echo "2. 控制低电平"
echo "3. 退出"
read choice
case $choice in
1)
set_gpio_high
;;
2)
set_gpio_low
;;
3)
break
;;
*)
echo "无效的选项"
;;
esac
done
}
# 运行主菜单
main_menu
在树莓派上运行该脚本,即可进入主菜单,选择申请GPIO选项后,程序会自动申请数组中定义的4个GPIO。选择控制GPIO选项后,进入子菜单,可以选择控制GPIO高电平、低电平或退出。选择退出后,回到主菜单,可以选择释放GPIO或退出程序。
本文使用GPIO核对原理图后改为 GPIO2_A0-3,需要修改GPIO编号。
GPIO编号计算公式:32 x 组号 + 8 x 组别 + io号
以GPIO2_A1为例,GPIO2组号是2,A1组别是0(A为0 B为1 C为2 D为3) ,管脚偏移量是1
GPIO编号 = 32 x 2 + 8 x 0 + 1 = 65,然后计算出其它为 64 66 67。
#!/bin/bash^M
^M
# 定义GPIO数组^M
gpio_array=(64 65 66 67)^M
^M
# 申请GPIO^M
function request_gpio() {^M
for gpio in ${gpio_array[@]}; do^M
echo $gpio > /sys/class/gpio/export^M
done^M
echo "GPIO已申请"^M
}^M
dos2unix test.sh
chmod +x test.sh
sh test.sh
gedit test.sh
# 粘贴后保存
chmod +x test.sh
执行开启测试,本文使用Linux环境,可直接编辑直接执行。
. ./test.sh
arm@Ubuntu20:~$ ./test.sh
请选择操作:
1. 申请GPIO
2. 控制GPIO
3. 释放GPIO
4. 退出
1
./test.sh: line 9: /sys/class/gpio/export: Permission denied
./test.sh: line 9: /sys/class/gpio/export: Permission denied
./test.sh: line 9: /sys/class/gpio/export: Permission denied
./test.sh: line 9: /sys/class/gpio/export: Permission denied
GPIO已申请
请选择操作:
1. 申请GPIO
2. 控制GPIO
3. 释放GPIO
4. 退出
核验执行结果并不是预想,对比需求描述与生成结果。发现描述有误,修改描述重新生成,喜提再来一次。
#!/bin/bash
# 定义GPIO数组
gpio_array=(64 65 66 67)
# 导出GPIO
for gpio in ${gpio_array[@]}; do
echo $gpio > /sys/class/gpio/export
done
# 设置GPIO为输出模式
for gpio in ${gpio_array[@]}; do
echo out > /sys/class/gpio/gpio$gpio/direction
done
# 定义菜单选项
menu_options=("GPIO ${gpio_array[0]}" "GPIO ${gpio_array[1]}" "GPIO ${gpio_array[2]}" "GPIO ${gpio_array[3]}" "退出")
# 定义控制选项
control_options=("高电平" "低电平" "退出")
# 定义函数:控制GPIO电平
function control_gpio() {
gpio=$1
control=$2
if [ $control == "高电平" ]; then
echo 1 > /sys/class/gpio/gpio$gpio/value
elif [ $control == "低电平" ]; then
echo 0 > /sys/class/gpio/gpio$gpio/value
fi
}
# 主循环
while true; do
# 显示菜单
echo "请选择要控制的GPIO:"
for i in ${!menu_options[@]}; do
echo "$i. ${menu_options[$i]}"
done
# 读取用户输入
read -p "请输入选项编号:" choice
# 处理用户输入
if [ $choice -ge 0 ] && [ $choice -lt ${#menu_options[@]} ]; then
if [ $choice -eq $((${#menu_options[@]} - 1)) ]; then
# 退出
break
else
# 进入控制子菜单
gpio=${gpio_array[$choice]}
while true; do
# 显示控制子菜单
echo "请选择要进行的操作:"
for i in ${!control_options[@]}; do
echo "$i. ${control_options[$i]}"
done
# 读取用户输入
read -p "请输入选项编号:" control_choice
# 处理用户输入
if [ $control_choice -ge 0 ] && [ $control_choice -lt ${#control_options[@]} ]; then
if [ $control_choice -eq $((${#control_options[@]} - 1)) ]; then
# 退出控制子菜单
break
else
# 控制GPIO电平
control=${control_options[$control_choice]}
control_gpio $gpio $control
fi
else
echo "无效的选项编号,请重新输入!"
fi
done
fi
else
echo "无效的选项编号,请重新输入!"
fi
done
# 取消导出GPIO
for gpio in ${gpio_array[@]}; do
echo $gpio > /sys/class/gpio/unexport
done
该脚本使用sysfs接口控制GPIO,首先将需要使用的GPIO导出并设置为输出模式,然后进入主循环,显示菜单并读取用户输入,根据用户选择进入控制子菜单或退出程序。在控制子菜单中,显示控制选项并读取用户输入,根据用户选择控制对应GPIO的高低电平。最后取消导出GPIO。
测试后仍然没达到要求,再来一编。
^M
,执行时会引起报错;须手动清除再执行。科技改变生活。