香橙派和树莓派基于官方外设开发

news2024/11/15 5:11:02

香橙派和树莓派基于官方外设开发

1.wiringPi外设SDK安装

方式一:

git clone https://github.com/orangepi-xunlong/wiringOP //下载源码
cd wiringOP //进入文件夹
sudo ./build clean //清除编译信息
sudo ./build //编译

方式二

通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP
下载压缩包
把压缩包通过mobaxterm传到开发板
解压 unzip xxx.zip
cd xxx
sudo ./build
gpio readall

验证指令:gpio readall

如下图所示,外设库就完成安装了

在这里插入图片描述

2.蜂鸣器开发

在这里插入图片描述

2.1蜂鸣器响的原理

置低电平响
置高电平不响

2.2蜂鸣器配合时间函数开发

2.2.1 demo1

#include<stdio.h>
#include<wiringPi.h>
#include<unistd.h>

#define BEEP 2 // 设置2引脚为蜂鸣器控制引脚


int main(void)
{
	

	wiringPiSetup(); // 初始化wriping库

	pinMode(BEEP, OUTPUT); // 设置蜂鸣器为输出引脚

	while(1)
	{
		digitalWrite(BEEP, LOW); // 输出低电平
		sleep(5);
		break;
	}

    digitalWrite(BEEP,HIGH);

	return 0;
}

2.2.2 demo2

#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#define BEEP 0 //设置针脚0为蜂鸣器的控制引脚
int main (void)
{
    wiringPiSetup () ;//初始化wiringPi库i
    pinMode (BEEP, OUTPUT) ;//设置IO口的输入输出,输出
    while(1){
        //sleep(1);
        usleep(100000);
        digitalWrite (BEEP, HIGH) ; //设置IO口输出低电平,蜂鸣器响
        //sleep(1);
        usleep(100000);
        digitalWrite (BEEP, LOW) ; //设置IO口输出低电平,蜂鸣器响
    }
    return 0;
}

如果你在vim的环境编辑,方便缩进可以修改一下缩进

vim的设置,修改/etc/vim/vimrc文件,需要用超级用户权限

sudo vim /etc/vim/vimrc
set tabstop=4 设置tab键缩进4个空格
set shiftwidth=4 设置批量对齐时候的tab键空格数为4

不过我在这里更推荐vscode编写,http://t.csdn.cn/GdZte,远程开发

shell脚本小插曲

./build beep.c 
$0     $1

shell脚本处理参数,可以通过$?来处理,这里的$1是要编译的文件

简易编译的shell脚本:
gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt

3.超声波测距

在这里插入图片描述

在这里插入图片描述

1. 怎么让它发波
   Trig,给Trig端口至少10us的高电平
        
2. 怎么知道开始发了
   Echo信号,由低电平跳转到高电平,表示开始发送波
       
3. 怎么知道接收了返回波
    Echo,由高电平跳转回低电平,表示波回来了
       
4.怎么算时间
   Echo引脚维持高电平的时间!
       
5. 波发出去的那一下,开始启动定时器
   波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
       
6. 怎么算距离
    距离=速度(340m/s)*时间/2

时序

在这里插入图片描述

3.2时间函数

函数原型:

#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
struct timeval
{
    long tv_sec;/*秒*/
    long tv_usec;/*微妙*/
};

测试代码

//计算程序在当前环境中数数10万次耗时多少
#include <sys/time.h>
#include <stdio.h>
//int gettimeofday(struct timeval *tv,struct timezone *tz )
void mydelay()
{
    int i,j;
    for(i=0;i<100;i++){
        for(j=0;j<1000;j++);
    }
}
int main()
{
    struct timeval startTime;
    struct timeval stopTime;
    gettimeofday(&startTime,NULL);
    mydelay();
    gettimeofday(&stopTime,NULL);
    long diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) +
        (stopTime.tv_usec - startTime.tv_usec);
    printf("全志H6的Linux数100000耗时%ldus\n",diffTime);
    return 0;
}

3.3代码实现和验证

#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#define Trig 0
#define Echo 1
double getDistance()
{
    double dis;
    struct timeval start;
    struct timeval stop;
    pinMode(Trig, OUTPUT);
    pinMode(Echo, INPUT);
    digitalWrite(Trig ,LOW);
    usleep(5);
    digitalWrite(Trig ,HIGH);
    usleep(10);
    digitalWrite(Trig ,LOW);
    /*above init CSB*/
    while(!digitalRead(Echo));
    gettimeofday(&start,NULL);
    while(digitalRead(Echo));
    gettimeofday(&stop,NULL);
    long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec -
                                                        start.tv_usec);
    printf("diffTime = %ld\n",diffTime);
    dis = (double)diffTime/1000000 * 34000 / 2;
    return dis;
}

int main()
{
    double dis;
    if(wiringPiSetup() == -1){
        fprintf(stderr,"%s","initWringPi error");
        exit(-1);
    }
    while(1){
        dis = getDistance();
        printf("dis = %lf\n",dis);
        usleep(500000);
    }
    return 0;
}

4.SG90舵机开发

4.1舵机基本介绍

如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等常见的有0-90°、0-180°、0-360°

在这里插入图片描述

在这里插入图片描述

4.2Linux定时器

分析:实现定时器,通过itimerval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理
函数来处理产生的定时信号。从而实现定时器。
先看itimerval的结构体
struct itimerval
{
    /* Value to put into `it_value' when the timer expires. */
    struct timeval it_interval;
    /* Time to the next timer expiration. */
    struct timeval it_value;
};
it_interval:计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置
    it_value:程序跑到这之后,多久启动定时器
    struct timeval
    {
        __time_t tv_sec; /* Seconds. */
        __suseconds_t tv_usec; /* Microseconds. */
    };
int setitimer (__itimer_which_t __which,
               const struct itimerval *__restrict __new,
               struct itimerval *__restrict __old)
setitimer()将value指向的结构体设为计时器的当前值,如果ovalue不是NULL,将返回计时器原有值。
which:三种类型
ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。
很明显,这边需要捕获对应的信号进行逻辑相关处理 signal(SIGALRM,signal_handler);
返回说明:
成功执行时,返回0。失败返回-1

实现代码

/*该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello。*/
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
static int i;
void signal_handler(int signum)
{
    i++;
    if(i == 2000){
        printf("hello\n");
        i = 0;
    }
}
int main()
{
    struct itimerval itv;

    //设定定时时间
    itv.it_interval.tv_sec = 0;
    itv.it_interval.tv_usec = 500;
    //设定开始生效,启动定时器的时间
    itv.it_value.tv_sec = 1;

    //设定定时方式
    if( -1 == setitimer(ITIMER_REAL, &itv, NULL)){
        perror("error");
        exit(-1);
    }
    //信号处理
    signal(SIGALRM,signal_handler);
    while(1);
    return 0;
}

这种方法需要注意的是,一个进程只能创建一个定时器

4.3 .SG90编程实现:键盘输入不同的值,让舵机转动,软件PWM实现

#include<stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#include<signal.h>
#include<wiringPi.h>

#define SG90pin 8

int jd;

void signal_handler(int signum)
{
    static  int  i=0;

    
    if(i<=jd)
    {
       digitalWrite(SG90pin,HIGH);  
    }
    else
    {
       digitalWrite(SG90pin,LOW);
    }
    if(i==40)
    {
        i=0;
    }
    i++;
}

int main()
{
    struct itimerval itv;
    jd=0;

    if(wiringPiSetup()==-1)
    {
         perror("error");
         exit(-1); 
    }
 
    pinMode(SG90pin,OUTPUT);

    //1.设定定时时间
    itv.it_interval.tv_sec=0;
    itv.it_interval.tv_usec=500;     
    //2.设定开始生效,启动定时器的时间
    itv.it_value.tv_sec=1;
    itv.it_value.tv_usec=0;
    //3.设定定时方式
    if(setitimer(ITIMER_REAL,&itv,NULL)==-1)
    {
        perror("error");
        exit(-1);
    }
    //4.信号处理
    signal(SIGALRM,signal_handler);

    while(1)
    {
        printf("input jd:1 -0 2-45 3-90 4-135 5-180\n");
        scanf("%d",&jd);
    }

    return 0;
}

5.OLED模块

5.1OLED屏幕模块

在这里插入图片描述

5.2IIC协议

5.2.1.概述:

IIC全称Inter-Integrated Circuit (集成电路总线)
是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双
工同步通信方式

5.2.2.特点

5.2.2.1 简单和有效性
由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降
低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件
5.2.2.2多主控
其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

5.2.3协议信息

IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。

//起始位,停止位,数据位,速度

这些信号中,起始信号是必需的,结束信号和应答信号

  • 起始信号

  • 终止信号

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Asg0RIiB-1688746961767)(C:\Users\xie19\Pictures\Camera Roll\屏幕截图 2023-07-07 234444.png)]

  • 应答信号

发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。

应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;

应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ysoeEZE-1688746961767)(C:\Users\xie19\Pictures\Camera Roll\屏幕截图 2023-07-07 234743.png)]

  • 数据发送的时序[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c8w7XqiM-1688746961768)(C:\Users\xie19\Pictures\Camera Roll\屏幕截图 2023-07-07 234832.png)]

5.2.4 Orangepi的IIC接口

  • 由 26pin 的原理图可知, Orange Pi Zero 2 可用的 i2c 为 i2c3

  • 在这里插入图片描述

  • 启动 linux 系统后, 先确认下/dev 下存在 i2c-3 的设备节点

  • 从命令运行结果能观察到系统支持I2C-3和I2C-5的驱动,而H616的外设我们看到只有一个IIC接

  • 口,用的是IIC-3

  • Linux一切皆文件,每个硬件设备“对应”一个文件,由驱动程序提供映射!
    ![在这里插入图片描述
    在这里插入图片描述

  • 开始测试 i2c, 首先安装 i2c-tools

  • sudo apt-get install i2c-tools

  • 在这里插入图片描述

5.2.5oled开发

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include "oled.h"
#include "font.h"
int oled_show(struct display_info *disp) {
    int i;
    char buf[100];
    oled_putstrto(disp, 0, 9+1, "Welcome to My HomeAssitant");
    disp->font = font2;
    oled_putstrto(disp, 0, 20, " ---Mr.chen HenShuai--- ");
    disp->font = font2;
    oled_send_buffer(disp);
    return 0;
}

void show_error(int err, int add) {
    printf("\nERROR: %i, %i\n\n", err, add);
}
void show_usage(char *progname) {
    printf("\nUsage:\n%s <I2C bus device node >\n", progname);

}
int main(int argc, char **argv) {
    int e;
    char filename[32];
    struct display_info disp;
    if (argc < 2) {
        show_usage(argv[0]);
        return -1;
    }
    memset(&disp, 0, sizeof(disp));
    sprintf(filename, "%s", argv[1]);
    disp.address = OLED_I2C_ADDR;
    disp.font = font2;
    e = oled_open(&disp, filename);
    e = oled_init(&disp);
    oled_show(&disp);
    return 0;
}

6.串口

6.1串口基本认知

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢

  • 是设备间接线通信的一种方式
  • 数据一位一位地顺序传送
  • 双向通信,全双工
  • 传送速度相对较慢

6.2串口接线方式

RXD:数据输入引脚,数据接受;

TXD:数据发送引脚,数据发送;

交叉接线

6.3基于wiringPi的串口开发

/*
* serialTest.c:
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
int fd;
void* Sendhandler()
{
    char *sendBuf;
    sendBuf = (char *)malloc(32*sizeof(32));
    while(1){
        memset(sendBuf,'\0',32);
        scanf("%s",sendBuf);
        while(*sendBuf){
            serialPutchar (fd, *sendBuf++) ;

        }
    }
}
void* Revhandler()
{
    while(1){
        while (serialDataAvail(fd))
        {
            printf ("%c", serialGetchar(fd)) ;
            fflush (stdout) ;
        }
    }
}
int main ()
{
    int count ;
    unsigned int nextTime ;
    pthread_t idSend;
    pthread_t idRev;
    if ((fd = serialOpen ("/dev/ttyS5", 115200)) < 0)
    {
        fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno))
            ;
        return 1 ;
    }
    pthread_create(&idSend, NULL,Sendhandler,NULL);
    pthread_create(&idRev, NULL,Revhandler,NULL);
    if (wiringPiSetup () == -1)
    {
        fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
        return 1 ;
    }
    while(1){sleep(10);}
    printf ("\n") ;
    return 0 ;
}

6.4Linux原生串口开发(实现不基于wiringpi库的串口)

uartTool.c

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "wiringSerial.h"
int myserialOpen (const char *device, const int baud)
{
    struct termios options ;
    speed_t myBaud ;
    int status, fd ;
    switch (baud){
        case 9600: myBaud = B9600 ; break ;
        case 115200: myBaud = B115200 ; break ;
    }
    if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
        return -1 ;
    fcntl (fd, F_SETFL, O_RDWR) ;
    // Get and modify current options:
    tcgetattr (fd, &options) ;
    cfmakeraw (&options) ;
    cfsetispeed (&options, myBaud) ;
    cfsetospeed (&options, myBaud) ;
    options.c_cflag |= (CLOCAL | CREAD) ;
    options.c_cflag &= ~PARENB ;
    options.c_cflag &= ~CSTOPB ;
    options.c_cflag &= ~CSIZE ;
    options.c_cflag |= CS8 ;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
    options.c_oflag &= ~OPOST ;
    options.c_cc [VMIN] = 0 ;
    options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds)
    tcsetattr (fd, TCSANOW, &options) ;
    ioctl (fd, TIOCMGET, &status);
    status |= TIOCM_DTR ;
    status |= TIOCM_RTS ;
    ioctl (fd, TIOCMSET, &status);
    usleep (10000) ; // 10mS
    return fd ;
}
void serialSendstring (const int fd, const char *s)
{
    int ret;
    ret = write (fd, s, strlen (s));
    if (ret < 0)
        printf("Serial Puts Error\n");
}
int serialGetstring (const int fd, char *buffer)
{
    int n_read;
    n_read = read(fd, buffer,32);
    return n_read;
}

uartTool.h

int myserialOpen (const char *device, const int baud);
void serialSendstring (const int fd, const char *s);
int serialGetstring (const int fd, char *buffer);

uartTest.c

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pthread.h>
#include "uartTool.h"
int fd;
void* readSerial()
{
    char buffer[32];
    while(1){
        memset(buffer,'\0',sizeof(buffer));
        serialGetstring(fd, buffer);
        printf("GET->%s\n",buffer);
    }
}
void* sendSerial()
{
    char buffer[32];
    while(1){
        memset(buffer,'\0',sizeof(buffer));
        scanf("%s",buffer);
        serialSendstring(fd, buffer);
    }
}
int main(int argc, char **argv)
{
    char deviceName[32] = {'\0'};
    pthread_t readt;
    pthread_t sendt;
    if(argc < 2){
        printf("uage:%s /dev/ttyS?\n",argv[0]);
        return -1;
    }
    strcpy(deviceName, argv[1]);
    if( (fd = myserialOpen(deviceName, 115200)) == -1){
        printf("open %s error\n",deviceName);
        return -1;
    }
    pthread_create(&readt, NULL, readSerial,NULL);
    pthread_create(&sendt, NULL, sendSerial,NULL);
    while(1){sleep(10);}
}

7.继电器组

在这里插入图片描述

7.1概述

继电器(英文名称:relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器

7.2继电器实战

实现功能:输入不同的指令,点亮不同的LED灯

实现方式一:

#include<wiringPi.h>
#include<stdio.h>
#include<string.h>

#define sw1 16
#define sw2 15
#define sw3 13
#define sw4 10

void pinModeOutPut()
{
    pinMode(sw1,OUTPUT);
    pinMode(sw2,OUTPUT);
    pinMode(sw3,OUTPUT);
    pinMode(sw4,OUTPUT);
}

void allHigh()
{
    digitalWrite(sw1,HIGH);
    digitalWrite(sw2,HIGH);
    digitalWrite(sw3,HIGH);
    digitalWrite(sw4,HIGH);
}

void allLow()
{
    digitalWrite(sw1,LOW);
    digitalWrite(sw2,LOW);
    digitalWrite(sw3,LOW);
    digitalWrite(sw4,LOW);
}

int main()
{
    char cmd[12]={0};
    
    if(wiringPiSetup()==-1)
    {
        printf("init error\n");
        return -1;
    }

    pinModeOutPut();
    allHigh();

    while(1)
    {
       printf("1/2/3/4代表灯,on-打开,off-关闭\n");
       memset(cmd,0,sizeof(cmd));   
       fgets(cmd, 12, stdin);

       if(strncmp(cmd,"1on",3)==0)
       {
             digitalWrite(sw1,LOW);
       }
       else if(strncmp(cmd,"2on",3)==0)
       {
             digitalWrite(sw2,LOW);
       }
       else if(strncmp(cmd,"3on",3)==0)
       {
             digitalWrite(sw3,LOW);
       }
       else if(strncmp(cmd,"4on",3)==0)
       {
             digitalWrite(sw4,LOW);
       }
       else if(strncmp(cmd,"1off",4)==0)
       {
             digitalWrite(sw1,HIGH); 
       }
       else if(strncmp(cmd,"2off",4)==0)
       {
             digitalWrite(sw2,HIGH); 
       }
       else if(strncmp(cmd,"3off",4)==0)
       {
             digitalWrite(sw3,HIGH); 
       }
       else if(strncmp(cmd,"4off",4)==0)
       {
             digitalWrite(sw4,HIGH); 
       }
       else if(strncmp(cmd,"allon",5)==0)
       { 
             allLow();    
       }    
       else if(strncmp(cmd,"alloff",6)==0)
       {
             allHigh();
       }
     }

     return 0;
}

实现方式二:

#include <wiringPi.h>
#include <stdio.h>
#include <string.h>

#define sw1 16
#define sw2 15
#define sw3 13
#define sw4 10
#define one 1
#define two 2
#define there 3
#define four 4
#define five 5
#define six 6
#define seven 7
#define eight 8
#define night 9
#define ten 10

void pinModeOutPut()
{
       pinMode(sw1, OUTPUT);
       pinMode(sw2, OUTPUT);
       pinMode(sw3, OUTPUT);
       pinMode(sw4, OUTPUT);
}

void allHigh()
{
       digitalWrite(sw1, HIGH);
       digitalWrite(sw2, HIGH);
       digitalWrite(sw3, HIGH);
       digitalWrite(sw4, HIGH);
}

void allLow()
{
       digitalWrite(sw1, LOW);
       digitalWrite(sw2, LOW);
       digitalWrite(sw3, LOW);
       digitalWrite(sw4, LOW);
}

int get_cmd_type(char *cmd)
{
       if (strncmp(cmd, "one", 3) == 0)
              return 1;
       if (strncmp(cmd, "two", 3) == 0)
              return 2;
       if (strncmp(cmd, "there", 5) == 0)
              return 3;
       if (strncmp(cmd, "four", 4) == 0)
              return 4;
       if (strncmp(cmd, "five", 4) == 0)
              return 5;
       if (strncmp(cmd, "six", 3) == 0)
              return 6;
       if (strncmp(cmd, "seven", 5) == 0)
              return 7;
       if (strncmp(cmd, "eight", 5) == 0)
              return 8;
       if (strncmp(cmd, "night", 5) == 0)
              return 9;
       if (strncmp(cmd, "ten", 3) == 0)
              return 10;

       return -1;
}

int main()
{
       char cmd[12] = {0};
       int ret;

       if (wiringPiSetup() == -1)
       {
              printf("init error\n");
              return -1;
       }

       pinModeOutPut();
       allHigh();

       while (1)
       {
              printf("1/2/3/4/9-on,5/6/7/8/10-off,9-allon,10-alloff\n");
              memset(cmd, 0, sizeof(cmd));
              fgets(cmd, 12, stdin);

              ret = get_cmd_type(cmd);
              switch (ret)
              {
              case 1:
                     digitalWrite(sw1, LOW);
                     break;
              case 2:
                     digitalWrite(sw2, LOW);
                     break;
              case 3:
                     digitalWrite(sw3, LOW);
                     break;
              case 4:
                     digitalWrite(sw4, LOW);
                     break;
              case 5:
                     digitalWrite(sw1, HIGH);
                     break;
              case 6:
                     digitalWrite(sw2, HIGH);
                     break;
              case 7:
                     digitalWrite(sw3, HIGH);
                     break;
              case 8:
                     digitalWrite(sw4, HIGH);
                     break;
              case 9:
                     allLow();
                     break;
              case 10:
                     allHigh();
                     break;
              default:
                     printf("cmd error\n");
                     break;
              }
       }

       return 0;
}
              digitalWrite(sw2, LOW);
                 break;
          case 3:
                 digitalWrite(sw3, LOW);
                 break;
          case 4:
                 digitalWrite(sw4, LOW);
                 break;
          case 5:
                 digitalWrite(sw1, HIGH);
                 break;
          case 6:
                 digitalWrite(sw2, HIGH);
                 break;
          case 7:
                 digitalWrite(sw3, HIGH);
                 break;
          case 8:
                 digitalWrite(sw4, HIGH);
                 break;
          case 9:
                 allLow();
                 break;
          case 10:
                 allHigh();
                 break;
          default:
                 printf("cmd error\n");
                 break;
          }
   }

   return 0;

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/731756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最新网络安全学习路线

在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 我把自己整理的系统学习路线&#xff0c;拿出来跟大家分享了&#xff01;点击查看详细路线图 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xf…

Java入门教程||Java 网络编程||Java 发送邮件

Java 网络编程 网络编程是指编写运行在多个设备&#xff08;计算机&#xff09;的程序&#xff0c;这些设备都通过网络连接起来。 java.net包中J2SE的API包含有类和接口&#xff0c;它们提供低层次的通信细节。你可以直接使用这些类和接口&#xff0c;来专注于解决问题&#…

基于simulink视频处理系统多核仿真(附源码)

一、前言 此示例演示如何使用 Simulink中的数据流执行域在多个内核上运行视频处理系统。 数据流执行域允许您在计算密集型系统的设计中使用多个内核。此示例演示数据流作为子系统的执行域如何提高模型的模拟性能。 二、视频中的对象计数 此示例演示如何使用基本形态运算符从…

Docker部署Doris超详细图文教程

Doris安装有非常多的方法&#xff0c;这里主要介绍Docker中使用dev容器用来学习和测试的方法&#xff0c;避免在其他教程中踩坑(生产环境不建议使用Docker安装) 这里介绍一个不踩坑的docker本地单机版&#xff0c;笔者安装环境为Windows下的Docker&#xff0c;若为Linux系统安装…

SwiftUI + Swift 设备振动

如何让设备振动呢 iPhone 6S 3D Touch&#xff0c;可以识别轻&#xff0c;中&#xff0c;重三种按压力度&#xff0c;配合恰到好处的振动有利于提升交互体验&#xff0c;但后面的新设备都不支持 3D Touch 了&#xff0c;改为了检测按压时间&#xff0c;按同一个图标&#xff0…

如何用canvans实现地图上的运动轨迹

1.先需要一个地图的图片 2.通过canvas绘制出运动轨迹 // 创建渐变function createGradient(context, p0, p1) {const gradient context.createLinearGradient(p0.x, p0.y, p1.x, p1.y);gradient.addColorStop(0, "rgba(255, 0, 255, 0)");gradient.addColorStop(1,…

颜色渐变的数据密集适用的堆叠图

一般情况会用柱状图去堆叠&#xff0c;但是如果数据量太大了&#xff0c;就可考虑这种方式堆叠。可以呈现时间和数量上不同层次数据的变化。 效果图&#xff1a; 比较详细的注释一下源码&#xff1a; import matplotlib as mpl import matplotlib.pyplot as plt import numpy …

第七章:L2JMobius学习 – 登录服务LoginServer讲解

在上一个章节中&#xff0c;我们学习了网络数据传输的封装network。那么&#xff0c;在本章的登录服务LoginServer的讲解中&#xff0c;我们就来使用一下这个封装好的功能。Network的封装需要我们继承很多的接口或类。我们首先查看一下登录服务LoginServer的文件结构&#xff0…

[Android 13]Binder系列--获取ServiceManager

获取ServiceManager hongxi.zhu 2023-7-1 以SurfaceFlinger为例&#xff0c;分析客户端进程如何获取ServiceManager代理服务对象 主要流程 SurfaceFlinger中获取SM服务 frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp // publish surface flingersp<…

mysql单表查询,排序,分组查询,运算符

CREATE TABLE emp (empno int(4) NOT NULL, --员工编号ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工名字job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工工作mgr int(4) NULL DEFAULT NU…

随机产生50个100以内的不重复的整数,设计位图排序算法进行排序。

1.问题 随机产生50个100以内的不重复的整数&#xff0c;设计位图排序算法进行排序。 2.设计思路 阶段1&#xff1a; 初始化一个空集合    for i[0,n)    bit[i]0 阶段2&#xff1a; 读入数据i&#xff0c;并设置bit[i]1    for each i in the input file    bit[i]1…

Tomcat 应用服务 WEB服务

简述&#xff1a; 中间件产品介绍 目前来说IBM的WebSphere&#xff0c;Oracle的Weblogic占据了市场上Java语言Web站点的部分份额&#xff0c;该两种软件由于无与伦比的性能及可靠性等优势被广泛应用于大型互联网公司的Web场景中&#xff0c;但是其高昂的价格也使得中小型互联…

DL-FWI:数据(第二次培训作业)

代码&#xff1a; import scipy.io import matplotlib import numpy as np import matplotlib.pylab as plt matplotlib.use(TkAgg) from mpl_toolkits.axes_grid1 import make_axes_locatable import cv2font21 {family: Times New Roman,weight: normal,size: 21,}font18 …

【通览一百个大模型】LaMDA(Google)

【通览一百个大模型】LaMDA&#xff08;Google&#xff09; 作者&#xff1a;王嘉宁&#xff0c;本文章内容为原创&#xff0c;仓库链接&#xff1a;https://github.com/wjn1996/LLMs-NLP-Algo 订阅专栏【大模型&NLP&算法】可获得博主多年积累的全部NLP、大模型和算法干…

图像金字塔、滑动条、鼠标事件响应

1、拉普拉斯图像金字塔 1.1 原理 1.2 实现 //拉普拉斯图像金字塔 void test1() {//高斯图像金字塔构建Mat img imread("F:/testMap/lena.png");vector<Mat> Guass;int level 3;Guass.push_back(img);for (int i 0; i < level; i){Mat guass;pyrDown(Gua…

蓝桥杯每日一练专栏导读2

之前一直更新的是C、C相关的题目&#xff0c;但作为一名前端工程师&#xff0c;还是对Js了解的更多一些&#xff0c;所以从此以后停止更新C/C相关内容&#xff0c;改为更新Js相关的练习题。 内容 更新的内容依旧是蓝桥杯大赛官网提供的习题。每一道题都会提供详细的解题思路&a…

方案编制要求--模版--可以借鉴

写方案的标题要求的编写&#xff0c;可以参照这个进行编写&#xff1b; 附录2&#xff1a;方案编制要求及模板 一、封面格式要求 封面内容应包括项目名称、需求单位&#xff08;盖章&#xff09;、建设单位&#xff08;盖章&#xff09;、设计单位&#xff08;盖章&#xff0…

线段树:一遍通透线段树

线段树有关的操作&#xff08;先大体上知道什么意思&#xff09;: 1 2 3 4 5 线段树前置知识&#xff1a; 由于线段树是一个完美二叉树&#xff0c;所以我们选择的是一维数组来存储线段树的相关知识&#xff1a; 所以&#xff1a; 1如果一个结点是X&#xff0c;则父节…

基于MATLAB的简单线性回归详解

概要 在机器学习领域中大多数任务通常都与预测&#xff08;prediction&#xff09;有关。当我们想预测一个数值时&#xff0c;就会涉及到回归问题。常见的例子包括&#xff1a;预测价格&#xff08;房屋、股票等&#xff09;、预测住院时间&#xff08;针对住院病人等&#xff…

如何用python编写3D游戏

Vizard是一款虚拟现实开发平台软件&#xff0c;从开发至今已走过十个年头。它基于C/C&#xff0c;运用新近OpenGL拓展模块开发出的高性能图形引擎。当运用Python语言执行开发时&#xff0c;Vizard同时自动将编写的程式转换为字节码抽象层(LAXMI)&#xff0c;进而运行渲染核心。…