记录树莓派定时拍照并上传至阿里云oss的全过程

学长给我的物品清单:

树莓派4b(附加充电线)、摄像模块、显示屏(附加HDMI线、充电线)、SD卡、读卡器

目录

一、烧录程序

1.下载必须文件

2.烧录镜像

二、无显示屏连接树莓派

1.登录wifi后台,查看树莓派IP

2.Xshell7连接树莓派

3.使用VNC Server

三、在VNC中完成树莓派引导

四、通过Xshell7安装opencv-python

1.查看python2和python3的版本

2.sources.list换源

3.raspi.list换源

4.换源结束,更新apt-get

5.安装opencv

6.测试opencv

五、使用VNC在树莓派中创建文件目录结构和定时拍照代码测试

六、设置开机自启动

七、再拓展一些(设置时间)


一、烧录程序

1.下载必须文件

(1)下载树莓派官方烧录软件Raspberry Pi Imager

地址:Raspberry Pi OS – Raspberry Pi

(2)下载镜像文件

地址:https://www.raspberrypi.com/software/operating-systems/

我没有选择最新版,使用的是自己一直用的版本(个人习惯)

2.烧录镜像

(1)内存卡放在读卡器里插到电脑上。

(2)解压刚才下载好的镜像文件,得到以.img结尾的镜像文件;双击exe文件,安装imager;

(3)烧录

打开树莓派镜像烧录器,选择“操作系统”;

往下拉,选择“使用自定义镜像”;

找到我们刚才解压后的以.img结尾的镜像文件,选择“open”。

再选择“选择SD卡”,会默认出现我们的SD卡,选择它;

到这一步,先不烧录,点击右下角设置

开启SSH服务,方便我们使用本地电脑xshell连接树莓派

往下拉,设置树莓派密码;

再往下拉,配置WIFI

多说两句:对于没有显示器的同学来说,连接的wifi最好能进入到后台能够看到树莓派的IP地址。

保存,进行烧录,选择“是”;

烧录界面;

验证界面:

烧录成功:

二、无显示屏连接树莓派

1.登录wifi后台,查看树莓派IP

(烧录过程中已经说过,对于没有显示屏的同学来说,最好连接能进入后台的wifi)

(如果没有wifi,可以连接你的手机热点)

2.Xshell7连接树莓派

Tips:Xshell7去官方免费申请就行,不用到网上找什么破解版的。

弹出SSH警告,选择“接受并保存”

输入SSH用户名(烧录过程中设置过用户pi的,不记得可以回到上面看一看)

输入密码,点击确定;

连接上了

3.使用VNC Server

VNC下载链接:Download VNC Viewer | VNC® Connect

(这里就不详细说VNC的下载安装啦,我相信你们可以的)

在Xshell7中输入 vncserver :1 得到vnc连接地址

打开VNC,输入得到的IP地址和端口号(注意冒号是英文)

回车连接,选择“continue”;

Username是pi,passwd是在烧录过程中设置的密码

就连接成功了

三、在VNC中完成树莓派引导

我们可以在VNC的连接界面中看到,我们在烧录过程中设置的wifi已经连上了

下面完成引导,点击Next;

国家设置、时区设置先默认,后面我们会改的;点击Next;

改变pi的密码,这里设置烧录过程中设置的密码就可以了,怎么方便怎么来(如果你改变pi的密码也可以,Xshell7到时候需要再重新登录)

设置屏幕,默认,点击“Next”;

设置wifi,我们烧录时已经设置过了,不用管,默认,点击“Next”;

更新软件界面,我选择“Skip”(跳过)。如果更新的话,需要挺长时间。

选择“Done”就完成了

四、通过Xshell7安装opencv-python

下面我们使用Xshell7安装所需环境,也可以在VNC中操作,都可以。

这里参考的是csdn上的一位博主(该博主写的很详细,大家可以去他那里看一看)

超简单教你在树莓派上安装opencv(一)_流 浪 猫的博客-CSDN博客_树莓派安装opencv

1.查看python2和python3的版本

2.sources.list换源

输入sudo nano /etc/apt/sources.list,进入到sources.list文件中,将里面的代码注释掉

将下面的代码粘贴进去

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi

deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi

完成后的效果就是这样:

按下ctrl+x键,如下图,选择y

选择y后,变成下图模样,直接回车就出去了

3.raspi.list换源

进入:sudo nano /etc/apt/sources.list.d/raspi.list

注释掉原有代码

添加上:deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

如下图所示:

Ctrl+x,y,回车,保存退出

4.换源结束,更新apt-get

执行sudo apt-get update

更新过程截图:

更新结束截图:

5.安装opencv

sudo apt-get install python3-opencv -y

安装结束截图:

6.测试opencv

(进入python3测试,opencv-python被安装到python3中)

五、使用VNC在树莓派中创建文件目录结构和定时拍照代码测试

(1)在/home/pi下创建regular-photos-of-raspberry-pie文件夹

(2)在regular-photos-of-raspberry-pie文件夹中创建img文件夹、code.py和ziqidong.service三个文件(注意后缀)

简单说一下三个文件的作用:

Img文件夹用来存放摄像头采集到的照片

Code.py放定时拍照代码python代码

Ziqidong.service是自启动配置文件(关于自启动配置,下文会详细说到)

(3)复制以下代码到code.py文件中

#思路:1.文件内循环每五秒上传一次 2.放在后台,每五秒执行一次文件
#第1种
import time
import datetime  #日期时间
import os  #文件操作
import cv2  #opencv-python
import oss2  #oss传输至阿里云

DEVICE = 'opencv'  #拍照设备名称
ACCESS_KEY = '你的oss账户名(放在引号里)'  #oss账户
SECRET_KEY = '你的oss密码(放在引号里)'  #oss密码
ENDPOINT = '(这个是我的,仅供参考)oss-cn-hangzhou.aliyuncs.com'  #上传网址(不同服务器地址不同)
BUCKETNAME = 'regular-photos-of-raspberry-pie'  #上传的bucketname

camera = cv2.VideoCapture(0)  #一个摄像头,后期可扩展多个摄像头
auth = oss2.Auth(ACCESS_KEY, SECRET_KEY)  #oss账户、密码
bucket = oss2.Bucket(auth, ENDPOINT, BUCKETNAME)

# 检查网络,断网重启wifi
def restartWifi():
    status = os.system("ping -w 3 www.baidu.com")
    if status == 1:
        # 关闭wifi
        os.system('sudo ip link set wlan0 down')
        # 开启wifi
        os.system('sudo ip link set wlan0 up')
    else:
        print('已经连上网了')
    return status
def delete_imgs():
    delete_url = "/home/pi/regular-photos-of-raspberry-pie/img"
    delete_list = os.listdir(delete_url)
    #print(delete_list)
    for i in range(len(delete_list)):
        os.remove(delete_url+'/'+delete_list[i])
    print("delete all imgs success!")
if camera.isOpened():
    while True:
        # 设置分辨率
        camera.set(3, 1920)  #width
        camera.set(4, 1080)  #height
        ret, img = camera.read()
        get_photo_time = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        #print(get_photo_time)
        file_path = "/home/pi/regular-photos-of-raspberry-pie/img/" + str(get_photo_time) + ".jpg"
        cv2.imwrite(file_path,img)  #保存到树莓派本地
        upload_time = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        #print(upload_time)
        UploadResult = bucket.put_object_from_file("getRasberryImgs/"+ str(upload_time) +  "_" + ".jpg", file_path)
        os.remove(file_path)  #删除树莓派本地已保存文件//有时候因为进程先后,有些图片文件来不及删除
        if UploadResult.status==200:
            print("Upload success!")
        else:
            print("maybe wifi problem,start link")
            status = restartWifi()
        #判断img文件中有没有照片,删除掉
        nums = os.listdir('/home/pi/regular-photos-of-raspberry-pie/img')#删除来不及删除的照片
        if nums:
            delete_imgs()
        camera.release()
        time.sleep(4)

如下图所示:

(4)安装缺少的包

执行code.py文件,查看缺少什么包

缺少oss2,在pytohn3中安装oss2

我们使用pip安装,安装之前我们先升级pip3中的pip(升级pip可以解决很多意外的问题)

在Xshell7中执行,pip3 install -U pip

上述黄字告诉我们没有将环境变量添加到路径中。如果忽略,后面python3会无法导入包。所以我们要再添加环境变量(就算没有黄字提示,大家也要检查一下用户pi的bin有没有添加到环境变量中,防止后面python导入包出现找不到的情况)

nano ~/.bashrc

按住下箭头,到最后一行,输入

export PATH=/home/pi/.local/bin/:$PATH

(PATH根据自己的来,灵活改变)

Ctrl+x,y,回车退出

退出后一定要更新文件,不然咱们添加的环境变量依然不起作用

source ~/.bashrc

再执行pip3 install oss2 -i Simple Index

(使用清华源,我的网络下载时比较慢,会报下面的错误,所以使用了清华源)

成功安装:

回到VCN中,继续执行code.py,发现不缺少包了,照片成功上传到阿里云

去阿里云看一看,登录阿里云,去对象存储oss控制台,再到相应的文件夹下,可以看到我们传过来的照片。

六、设置开机自启动

(1)编辑ziqidong.service

文件内容如下:

[Unit]
Description=My service
After=network.target

[Service]
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/python3 -u /home/pi/regular-photos-of-raspberry-pie/code.py

[Install]
WantedBy=multi-user.target

(2)将ziqidong.service文件复制到/etc/system/system目录下

sudo cp /home/pi/regular-photos-of-raspberry-pie/ziqidong.service /etc/systemd/system/ziqidong.service

(3)启动服务

sudo systemctl start ziqidong.service

(4)查看该服务的输出

journalctl -u ziqidong -e

输出说明我们安装的包oss2找不到,好在作者给我们提供了解决方法:

  1. 指定用户pi
  2. 全局安装包

这里我选择第二种

所以,要全局安装一边,来吧

sudo pip3 install oss2 -i Simple Index

然后再来查看输出journalctl -u ziqidong -e

成功了

(5)停止服务

sudo systemctl stop ziqidong.service

(6)先停止服务,再设置开机自启动

sudo systemctl enable ziqidong.service

给树莓派断电再上电,查看服务输出

树莓派断电,Xshell7断开

树莓派上电,Xshell7重新连接(手动重新连接)

查看服务输出journalctl -u ziqidong -e

七、再拓展一些(设置时间)

我再传图片时,给文件的名字设置了拍照时间

如下图红色框标出的,图片显示年月日是对的,但是时间是11:28分,右边是阿里云显示接收时间,晚上19:28分。所以我们还要给树莓派设置时间。

话不多说,我们来。

(1)安装NTP

sudo apt-get install ntpdate

(2)选择上海时区

输入命令:sudo dpkg-reconfigure tzdata

进入下图所示界面:选择Asia  , ok就是回车

回车选择shanghai

再回车,回到终端

(3)添加到自启动的配置文件中,实现开机自启动

sudo ntpdate -ubv s2m.time.edu.cn

(第二行有个报错,我没管,不影响使用)

(4)date查看时间

(5)树莓派断电再上电,到阿里云看图片名称时间对不对

发现没问题了

八、再扩展一些(断网重连)

大家可以看code.py中,虽然代码中有断网重连的代码,如下图:

但是我们要设置wlan0

话不多说,我们来操作

(1)wifi连接配置,增加几个wifi

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

增加wifi如下图:(priority是优先级),ctrl+x,y,回车退出

(2)修改网络配置

sudo nano /etc/network/interfaces

添加下面的代码:

auto wlan0

allow-hotplug wlan0

iface wlan0 inet dhcp

wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

(3)树莓派断电、再上电,就可以看到成功连上WiFi了。

到此,树莓派定时拍照就讲解完了,如果你觉得有用的话,可以点个赞

如果你有什么问题,可以在评论区留言

我们下次再见

物联沃分享整理
物联沃-IOTWORD物联网 » 记录树莓派定时拍照并上传至阿里云oss的全过程

发表评论