PSoc™62开发板之IoT应用

实验目的

使用PSoc62™开发板驱动OLED模块,实时监控室内的光照强度、温度信息

实验准备

  • PSoc62™开发板
  • SSD1309 OLED模块
  • DS18B20温度传感器
  • BH1750光照传感器

模块电路

SSD1309

OLED模块的电路连接和模块配置教程请参考之前的文章,这里不详细展开描述

BH1750

模块SCL、SDA、GND引脚分别接CON5的P8.0、P8.1、GND引脚,VCC则接CON6的3.3V引脚

在这里插入图片描述

实物连接图

在这里插入图片描述

i2c引脚配置,需要在RT-Thread Studio里边配置使用模拟i2c引脚P8.0和P8.1(分别对应编号64、65)

在这里插入图片描述
有需要的可以使能i2c-tools这个包
在这里插入图片描述

模块的设备地址用i2c-tools查看是0x23

在这里插入图片描述

DS18B20

模块out引脚连接CON8处的P10.5引脚,VCC、GND可以连接CON6处的3.3V、GND,模块已经接了上拉电阻,这里不需要额外配置

在这里插入图片描述

实物连接图

在这里插入图片描述

程序设计

SSD1309

OLED模块的程序设计请参考之前的文章

DS18B20

传感器驱动代码

#define DS18B20_PIN         GET_PIN(10, 5)
#define DS18B20_DQ_OUT(x)   rt_pin_write(DS18B20_PIN, x)
#define DS18B20_DQ_IN       rt_pin_read(DS18B20_PIN)// 复位DS18B20
static void ds18b20_reset(void)
{DS18B20_DQ_OUT(0);  rt_hw_us_delay(750);      DS18B20_DQ_OUT(1); rt_hw_us_delay(15);      
}// 等待DS18B20的回应
uint8_t ds18b20_check(void)
{uint8_t retry = 0;uint8_t rval = 0;while (DS18B20_DQ_IN && retry < 200)  {retry++;rt_hw_us_delay(1);}if (retry >= 200){rval = 1;}else{retry = 0;while (!DS18B20_DQ_IN && retry < 240) {retry++;rt_hw_us_delay(1);}if (retry >= 240) rval = 1;}return rval;
}// 从DS18B20读取一个位
static uint8_t ds18b20_read_bit(void)
{uint8_t data = 0;DS18B20_DQ_OUT(0);rt_hw_us_delay(2);DS18B20_DQ_OUT(1);rt_hw_us_delay(12);if (DS18B20_DQ_IN){data = 1;}rt_hw_us_delay(50);return data;
}// 从DS18B20读取一个字节
static uint8_t ds18b20_read_byte(void)
{uint8_t i, b, data = 0;for (i = 0; i < 8; i++){b = ds18b20_read_bit(); data |= b << i;       }return data;
}// 写一个字节到DS18B20
static void ds18b20_write_byte(uint8_t data)
{uint8_t j;for (j = 1; j <= 8; j++){if (data & 0x01){DS18B20_DQ_OUT(0); rt_hw_us_delay(2);DS18B20_DQ_OUT(1);rt_hw_us_delay(60);}else{DS18B20_DQ_OUT(0); rt_hw_us_delay(60);DS18B20_DQ_OUT(1);rt_hw_us_delay(2);}data >>= 1;             }
}// 开始温度转换
static void ds18b20_start(void)
{ds18b20_reset();ds18b20_check();ds18b20_write_byte(0xcc);   /*  skip rom */ds18b20_write_byte(0x44);   /*  convert */
}// 初始化DS18B20的IO口 DQ 同时检测DS18B20的存在
uint8_t ds18b20_init(void)
{rt_pin_mode(DS18B20_PIN, PIN_MODE_OUTPUT_OD);
//    rt_pin_write(DS18B20_PIN, PIN_HIGH);ds18b20_reset();return ds18b20_check();
}// 从ds18b20得到温度值(精度:0.1C)
short ds18b20_get_temperature(void)
{uint8_t flag = 1;           /* 默认温度为正数 */uint8_t TL, TH;short temp;ds18b20_start();            /*  ds1820 start convert */ds18b20_reset();ds18b20_check();ds18b20_write_byte(0xcc);   /*  skip rom */ds18b20_write_byte(0xbe);   /*  convert */TL = ds18b20_read_byte();   /*  LSB */TH = ds18b20_read_byte();   /*  MSB */if (TH > 7){TH = ~TH;TL = ~TL;flag = 0;   /* 温度为负 */}temp = TH;      /* 获得高八位 */temp <<= 8;temp += TL;     /* 获得底八位 */temp = (double)temp * 0.625;    /* 转换 */if (flag == 0){temp = -temp;   /* 将温度转换成负温度 */}return temp;
}

读取温度值

// ds18b20
ds18b20_init();// ssd1309
OLED_Init();
OLED_Clear();for (;;)
{// ds18b20int val = ds18b20_get_temperature();rt_memset(buff, 20, 0);rt_sprintf(buff, "temp : %d.%d'C  ", val / 10, val % 10);OLED_ShowString(10, 2, buff);rt_thread_mdelay(200);
}

用逻辑分析仪抓一下单总线的读写时序,读取的数据(0x0185,大概是室温20来度)是OK的

在这里插入图片描述

BH1750

模块驱动代码,用的是i2c1总线,模块的设备地址用i2c-tools查看是0x23

#define BH1750_I2C_BUS_NAME     "i2c1"
#define BH1750_ADDR             0x23static rt_uint8_t buffer[2];
static uint16_t light = 0;
static struct rt_i2c_bus_device *i2c_bus;static int read_i2c_reg(rt_uint8_t reg_addr, rt_uint8_t *data, rt_uint8_t len)
{struct rt_i2c_msg msgs[2];msgs[0].addr = BH1750_ADDR;msgs[0].flags = RT_I2C_WR;msgs[0].buf = &reg_addr;msgs[0].len = 1;msgs[1].addr = BH1750_ADDR;msgs[1].flags = RT_I2C_RD;msgs[1].buf = data;msgs[1].len = len;if (rt_i2c_transfer(i2c_bus, msgs, 2) == 2){return RT_EOK;}elsereturn -RT_ERROR;
}static int8_t write_i2c_reg(uint8_t data)
{struct rt_i2c_msg msgs[2];msgs[0].addr  = BH1750_ADDR;msgs[0].flags = RT_I2C_WR;msgs[0].buf   = NULL;msgs[0].len   = 0;msgs[1].addr  = BH1750_ADDR;msgs[1].flags = RT_I2C_WR | RT_I2C_NO_START;msgs[1].buf   = &data;msgs[1].len   = 1;if (rt_i2c_transfer(i2c_bus, msgs, 2) != 2){return -RT_ERROR;}return RT_EOK;
}void BH1750_Init()
{write_i2c_reg(0x10);
}

读取光照强度值

// bh1750
i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(BH1750_I2C_BUS_NAME);
if (i2c_bus == RT_NULL)
{rt_kprintf("can't find %s device!\n", BH1750_I2C_BUS_NAME);return RT_ERROR;
}BH1750_Init();
rt_thread_mdelay(500);// ssd1309
OLED_Init();
OLED_Clear();for (;;)
{// bh1750BH1750_Init();rt_thread_mdelay(200);read_i2c_reg(0, buffer, 2);light = ((buffer[0] << 8) | buffer[1]) / 1.2;rt_memset(buff, 20, 0);rt_sprintf(buff, "light : %d lx      ", light);OLED_ShowString(10, 5, buff);rt_thread_mdelay(150);
}

整合代码

以下代码用于读取DS18B20的温度值、BH1750的光照强度

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"#define DS18B20_PIN         GET_PIN(10, 5)
#define DS18B20_DQ_OUT(x)   rt_pin_write(DS18B20_PIN, x)
#define DS18B20_DQ_IN       rt_pin_read(DS18B20_PIN)// 复位DS18B20
static void ds18b20_reset(void)
{DS18B20_DQ_OUT(0);  /* 拉低DQ,复位 */rt_hw_us_delay(750);      /* 拉低750us */DS18B20_DQ_OUT(1);  /* DQ=1, 释放复位 */rt_hw_us_delay(15);       /* 延迟15US */
}// 等待DS18B20的回应
uint8_t ds18b20_check(void)
{uint8_t retry = 0;uint8_t rval = 0;while (DS18B20_DQ_IN && retry < 200)    /* 等待DQ变低, 等待200us */{retry++;rt_hw_us_delay(1);}if (retry >= 200){rval = 1;}else{retry = 0;while (!DS18B20_DQ_IN && retry < 240)   /* 等待DQ变高, 等待240us */{retry++;rt_hw_us_delay(1);}if (retry >= 240) rval = 1;}return rval;
}// 从DS18B20读取一个位
static uint8_t ds18b20_read_bit(void)
{uint8_t data = 0;DS18B20_DQ_OUT(0);rt_hw_us_delay(2);DS18B20_DQ_OUT(1);rt_hw_us_delay(12);if (DS18B20_DQ_IN){data = 1;}rt_hw_us_delay(50);return data;
}// 从DS18B20读取一个字节
static uint8_t ds18b20_read_byte(void)
{uint8_t i, b, data = 0;for (i = 0; i < 8; i++){b = ds18b20_read_bit(); /* DS18B20先输出低位数据 ,高位数据后输出 */data |= b << i;         /* 填充data的每一位 */}return data;
}// 写一个字节到DS18B20
static void ds18b20_write_byte(uint8_t data)
{uint8_t j;for (j = 1; j <= 8; j++){if (data & 0x01){DS18B20_DQ_OUT(0);  /*  Write 1 */rt_hw_us_delay(2);DS18B20_DQ_OUT(1);rt_hw_us_delay(60);}else{DS18B20_DQ_OUT(0);  /*  Write 0 */rt_hw_us_delay(60);DS18B20_DQ_OUT(1);rt_hw_us_delay(2);}data >>= 1;             /* 右移,获取高一位数据 */}
}// 开始温度转换
static void ds18b20_start(void)
{ds18b20_reset();ds18b20_check();ds18b20_write_byte(0xcc);   /*  skip rom */ds18b20_write_byte(0x44);   /*  convert */
}// 初始化DS18B20的IO口 DQ 同时检测DS18B20的存在
uint8_t ds18b20_init(void)
{rt_pin_mode(DS18B20_PIN, PIN_MODE_OUTPUT_OD);
//    rt_pin_write(DS18B20_PIN, PIN_HIGH);ds18b20_reset();return ds18b20_check();
}// 从ds18b20得到温度值(精度:0.1C)
short ds18b20_get_temperature(void)
{uint8_t flag = 1;           /* 默认温度为正数 */uint8_t TL, TH;short temp;ds18b20_start();            /*  ds1820 start convert */ds18b20_reset();ds18b20_check();ds18b20_write_byte(0xcc);   /*  skip rom */ds18b20_write_byte(0xbe);   /*  convert */TL = ds18b20_read_byte();   /*  LSB */TH = ds18b20_read_byte();   /*  MSB */if (TH > 7){TH = ~TH;TL = ~TL;flag = 0;   /* 温度为负 */}temp = TH;      /* 获得高八位 */temp <<= 8;temp += TL;     /* 获得底八位 */temp = (double)temp * 0.625;    /* 转换 */if (flag == 0){temp = -temp;   /* 将温度转换成负温度 */}return temp;
}///#include "stdlib.h"
#include "oledfont.h"// 绑定PSoc62板子的GPIO
#define CS_PIN      GET_PIN(10, 0)
#define DC_PIN      GET_PIN(10, 1)
#define RES_PIN     GET_PIN(10, 2)
#define SDA_PIN     GET_PIN(10, 3)
#define SCL_PIN     GET_PIN(10, 4)
#define WR_PIN      GET_PIN(0, 1)
#define RD_PIN      GET_PIN(0, 1)// OLED模式设置
#define OLED_MODE   0
#define SIZE        16
#define XLevelL     0x00
#define XLevelH     0x10
#define Max_Column  128
#define Max_Row     64
#define Brightness  0xFF
#define X_WIDTH     128
#define Y_WIDTH     64// OLED端口定义
#define OLED_CS_Clr()   rt_pin_write(CS_PIN, PIN_LOW)
#define OLED_CS_Set()   rt_pin_write(CS_PIN, PIN_HIGH)
#define OLED_RST_Clr()  rt_pin_write(RES_PIN, PIN_LOW)
#define OLED_RST_Set()  rt_pin_write(RES_PIN, PIN_HIGH)
#define OLED_DC_Clr()   rt_pin_write(DC_PIN, PIN_LOW)
#define OLED_DC_Set()   rt_pin_write(DC_PIN, PIN_HIGH)
#define OLED_SDIN_Clr() rt_pin_write(SDA_PIN, PIN_LOW)
#define OLED_SDIN_Set() rt_pin_write(SDA_PIN, PIN_HIGH)
#define OLED_SCLK_Clr() rt_pin_write(SCL_PIN, PIN_LOW)
#define OLED_SCLK_Set() rt_pin_write(SCL_PIN, PIN_HIGH)
#define OLED_WR_Clr()   rt_pin_write(WR_PIN, PIN_LOW)
#define OLED_WR_Set()   rt_pin_write(WR_PIN, PIN_HIGH)
#define OLED_RD_Clr()   rt_pin_write(RD_PIN, PIN_LOW)
#define OLED_RD_Set()   rt_pin_write(RD_PIN, PIN_HIGH)#define OLED_CMD  0 // 写命令
#define OLED_DATA 1 // 写数据#define u8 unsigned char
#define u32 unsigned intstatic u8 buff[20];// 向SSD1309写入一个字节数据:dat -> 要写入的数据 or命令,cmd -> 数据or命令
void OLED_WR_Byte(u8 dat, u8 cmd)
{u8 i;if(cmd)OLED_DC_Set();elseOLED_DC_Clr();OLED_CS_Clr();for(i=0; i < 8; i++){OLED_SCLK_Clr();if(dat & 0x80)OLED_SDIN_Set();elseOLED_SDIN_Clr();OLED_SCLK_Set();dat <<= 1;}OLED_CS_Set();OLED_DC_Set();
}// 设置绘制的坐标
void OLED_Set_Pos(unsigned char x, unsigned char y)
{OLED_WR_Byte(0xb0 + y, OLED_CMD);OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);OLED_WR_Byte((x & 0x0f) | 0x01, OLED_CMD);
}// 开启OLED显示
void OLED_Display_On(void)
{OLED_WR_Byte(0X8D, OLED_CMD);OLED_WR_Byte(0X14, OLED_CMD);OLED_WR_Byte(0XAF, OLED_CMD);
}// 关闭OLED显示
void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D, OLED_CMD);OLED_WR_Byte(0X10, OLED_CMD);OLED_WR_Byte(0XAE, OLED_CMD);
}// 清屏函数,屏幕会置为黑色
void OLED_Clear(void)
{u8 i,n;for(i=0;i<8;i++){OLED_WR_Byte (0xb0 + i, OLED_CMD);      // 设置页地址(0~7)OLED_WR_Byte (0x00, OLED_CMD);          // 设置显示位置—列低地址OLED_WR_Byte (0x10, OLED_CMD);          // 设置显示位置—列高地址for(n = 0; n < 128; n++)OLED_WR_Byte(0, OLED_DATA);}
}// 绘制字符
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{unsigned char c=0,i=0;c=chr-' ';//得到偏移后的值if(x>Max_Column-1){x=0;y=y+2;}if(SIZE ==16){OLED_Set_Pos(x,y);for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);OLED_Set_Pos(x,y+1);for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);}else {OLED_Set_Pos(x,y+1);for(i=0;i<6;i++)OLED_WR_Byte(F6x8[c][i],OLED_DATA);}
}// 显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr)
{unsigned char j=0;while (chr[j]!='\0'){OLED_ShowChar(x,y,chr[j]);x+=8;if(x>120){x=0;y+=2;}j++;}
}// 显示数字
void OLED_ShowNum(u8 x,u8 y,u32 num)
{rt_memset(buff, 20, 0);rt_sprintf(buff, "%d", num);OLED_ShowString(x, y, buff);
}// 显示汉字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{u8 t,adder=0;OLED_Set_Pos(x,y);for(t=0;t<16;t++){OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);adder+=1;}OLED_Set_Pos(x,y+1);for(t=0;t<16;t++){OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);adder+=1;}
}// 初始化SSD1309
void OLED_Init(void)
{// init gpiosrt_pin_mode(CS_PIN, PIN_MODE_OUTPUT);rt_pin_mode(DC_PIN, PIN_MODE_OUTPUT);rt_pin_mode(RES_PIN, PIN_MODE_OUTPUT);rt_pin_mode(SDA_PIN, PIN_MODE_OUTPUT);rt_pin_mode(SCL_PIN, PIN_MODE_OUTPUT);OLED_RST_Set();rt_thread_mdelay(100);OLED_RST_Clr();rt_thread_mdelay(100);OLED_RST_Set();OLED_WR_Byte(0xAE,OLED_CMD);    //--turn off oled panelOLED_WR_Byte(0x00,OLED_CMD);    //---set low column addressOLED_WR_Byte(0x10,OLED_CMD);    //---set high column addressOLED_WR_Byte(0x40,OLED_CMD);    //--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81,OLED_CMD);    //--set contrast control registerOLED_WR_Byte(0xCF,OLED_CMD);    // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1,OLED_CMD);    //--Set SEG/Column Mapping     0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8,OLED_CMD);    //Set COM/Row Scan Direction   0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6,OLED_CMD);    //--set normal displayOLED_WR_Byte(0xA8,OLED_CMD);    //--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f,OLED_CMD);    //--1/64 dutyOLED_WR_Byte(0xD3,OLED_CMD);    //-set display offset   Shift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);    //-not offsetOLED_WR_Byte(0xd5,OLED_CMD);    //--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0x80,OLED_CMD);    //--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9,OLED_CMD);    //--set pre-charge periodOLED_WR_Byte(0xF1,OLED_CMD);    //Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA,OLED_CMD);    //--set com pins hardware configurationOLED_WR_Byte(0x12,OLED_CMD);OLED_WR_Byte(0xDB,OLED_CMD);    //--set vcomhOLED_WR_Byte(0x40,OLED_CMD);    //Set VCOM Deselect LevelOLED_WR_Byte(0x20,OLED_CMD);    //-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x02,OLED_CMD);    //OLED_WR_Byte(0x8D,OLED_CMD);    //--set Charge Pump enable/disableOLED_WR_Byte(0x14,OLED_CMD);    //--set(0x10) disableOLED_WR_Byte(0xA4,OLED_CMD);    // Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6,OLED_CMD);    // Disable Inverse Display On (0xa6/a7)OLED_WR_Byte(0xAF,OLED_CMD);    //--turn on oled panelOLED_WR_Byte(0xAF,OLED_CMD);    /*display ON*/OLED_Clear();OLED_Set_Pos(0,0);
}//
#define BH1750_I2C_BUS_NAME     "i2c1"
#define BH1750_ADDR             0x23static rt_uint8_t buffer[2];
static uint16_t light = 0;
static struct rt_i2c_bus_device *i2c_bus;static int read_i2c_reg(rt_uint8_t reg_addr, rt_uint8_t *data, rt_uint8_t len)
{struct rt_i2c_msg msgs[2];msgs[0].addr = BH1750_ADDR;msgs[0].flags = RT_I2C_WR;msgs[0].buf = &reg_addr;msgs[0].len = 1;msgs[1].addr = BH1750_ADDR;msgs[1].flags = RT_I2C_RD;msgs[1].buf = data;msgs[1].len = len;if (rt_i2c_transfer(i2c_bus, msgs, 2) == 2){return RT_EOK;}elsereturn -RT_ERROR;
}static int8_t write_i2c_reg(uint8_t data)
{struct rt_i2c_msg msgs[2];msgs[0].addr  = BH1750_ADDR;msgs[0].flags = RT_I2C_WR;msgs[0].buf   = NULL;msgs[0].len   = 0;msgs[1].addr  = BH1750_ADDR;msgs[1].flags = RT_I2C_WR | RT_I2C_NO_START;msgs[1].buf   = &data;msgs[1].len   = 1;if (rt_i2c_transfer(i2c_bus, msgs, 2) != 2){return -RT_ERROR;}return RT_EOK;
}void BH1750_Init()
{write_i2c_reg(0x10);
}int main(void)
{// ds18b20ds18b20_init();// bh1750i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(BH1750_I2C_BUS_NAME);if (i2c_bus == RT_NULL){rt_kprintf("can't find %s device!\n", BH1750_I2C_BUS_NAME);return RT_ERROR;}BH1750_Init();rt_thread_mdelay(500);// ssd1309OLED_Init();OLED_Clear();for (;;){// ds18b20int val = ds18b20_get_temperature();rt_memset(buff, 20, 0);rt_sprintf(buff, "temp : %d.%d'C  ", val / 10, val % 10);OLED_ShowString(10, 2, buff);rt_thread_mdelay(200);// bh1750BH1750_Init();rt_thread_mdelay(200);read_i2c_reg(0, buffer, 2);light = ((buffer[0] << 8) | buffer[1]) / 1.2;rt_memset(buff, 20, 0);rt_sprintf(buff, "light : %d lx      ", light);OLED_ShowString(10, 5, buff);rt_thread_mdelay(150);}
}

实验效果

实时读取环境的温度和光照强度,正值夜晚光照强度在0-100 lx范围内

在这里插入图片描述

注意事项

这里有三个关键的模块,连接线比较复杂

  • 千万不要接错电源和地
  • i2c不能接错数据线和时钟线,spi接线也不例外
  • 读取不到数据可以借助一些工具排查一下,比如i2c-tools、逻辑分析仪

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

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

相关文章

【JavaEE网络】HTTP/HTTPS协议的工作原理与格式详解

目录 HTTP/HTTPSHTTP是什么理解“应用层协议”理解HTTP协议的工作过程HTTP协议格式 HTTP/HTTPS HTTP是什么 应用层&#xff0c;一方面是需要自定义协议&#xff0c;一方面也会用到一些现成的协议 HTTP及HTTPS是应用层重点协议 使用浏览器&#xff0c;打开网站&#xff0c;这…

springboot拦载器

1、拦载器 package com.Interceptor;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.security.auth.login.Log…

【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计

前言 从今天开始&#xff0c;我们详解介绍制作实时天气时钟项目的方法步骤&#xff0c;主要分以下几个专题分别进行&#xff1a;&#xff08;1&#xff09;连接点亮SPI-TFT屏幕和UI布局设计&#xff1b;&#xff08;2&#xff09;NodeMCU的WIFI模式设置及连接&#xff1b;&…

一个基于ComfuUI Api的 AIGC自动绘画实现方案

工作流程图 基本原理已经弄通&#xff0c;下一步要开始编码搬砖了。整个自动绘画的流程如下&#xff0c;暂就不整高深U什么L了&#xff0c;写个简单明了能容易看懂的流程图。UI借用了下墨刀里的AI绘画公开原型 部署节点 整个系统的后端服务典型部署需要3类节点 Aigc Server&…

大数据Spark教程从入门到精通第三篇:Spark核心模块

一&#xff1a;Spark核心模块 1&#xff1a;概述 Spark最底层的模块是Apache Spark Core&#xff0c;其他的功能都是基于此实现的。 Spark SQL操作结构化数据的模块 Spark Streaming 对流式数据处理的模块。 Spark MLlib对机器学习支持的一个功能模块。学习难度很高 Spark Gra…

cmd输入mysql -u root -p无法启动

问题分析&#xff1a;cmd输入mysql -u root -p无法启动 解决方法&#xff1a;配置系统环境变量 1.找到mysql安装文件下的bin文件&#xff1a;&#xff08;复制改文件地址,如下图所示&#xff09; 2.电脑桌面下方直接搜索环境变量并进入&#xff0c;如下图 3.点击环境变量&a…

nginx--防盗链

盗链 通过在自己网站里面引用别人的资源链接,盗用人家的劳动和资源 referer referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息 正常的referer信息 none&#xff1a;请求报文首部没有referer首部&#xff0c;比如用户直接在浏览器输入域名访问web网站&…

java09基础(构造方法 继承)

目录 一. 构造方法 1. 构造方法 2. 构造代码块 二. 继承 1. 基本概念 2. protected 关键字 3. 构造方法的访问特点 4. 成员变量的访问特点 5. 成员方法的访问特点 6. 向上向下转型 6.1 向上转型 6.2 向下转型 一. 构造方法 1. 构造方法 初始化一个新的对象 构建、创…

2024年03月 Scratch 图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共10题,共30分) 第1题 圆点角色的程序如下图1所示(角色默认方向90),运行程序,输入“HLHLHLHL”后得到的结果如下图2所示,如果想得到下图3中的结果,应该输入的字符串是?( ) A:HLLLHLLL B:LLLLLLL…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

C语言—控制语句

控制语句就是用来实现对流程的选择、循环、转向和返回等控制行为。 分支语句 if语句 基本结构 if(表达式) { 语句块1&#xff1b; } else { 语句块2&#xff1b; } 执行顺序&#xff1a; 如果表达式判断成立&#xff08;即表达式为真&#xff09;&#xff0c;则执行语句块…

Python量化炒股的统计数据图

Python量化炒股的统计数据图 单只股票的收益统计图 查看单只股票的收盘价信息 单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令&#xff0c;进入Jupyter Notebook的研究平台。然后单击“新建”按钮&#xff0c;创建Python3文件&#xff0c;输入如下代码如下&am…

面试集中营—Spring篇

Spring 框架的好处 1、轻量&#xff1a;spring是轻量的&#xff0c;基本的版本大约2MB&#xff1b; 2、IOC&#xff1a;控制反转&#xff0c;Spring的IOC机制使得对象之间的依赖不再需要我们自己来控制了&#xff0c;而是由容易来控制&#xff0c;一个字&#xff1a;爽&#xf…

Docker——consul的容器服务更新与发现

一、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初的解决手段…

【学习AI-相关路程-工具使用-自我学习-cudavisco-开发工具尝试-基础样例 (2)】

【学习AI-相关路程-工具使用-自我学习-cuda&visco-开发工具尝试-基础样例 &#xff08;2&#xff09;】 1、前言2、环境说明3、总结说明4、工具安装0、验证cuda1、软件下载2、插件安装 5、软件设置与编程练习1、创建目录2、编译软件进入目录&创建两个文件3、编写配置文…

Rust Postgres实例

Rust Postgres介绍 Rust Postgres是一个纯Rust实现的PostgreSQL客户端库&#xff0c;无需依赖任何外部二进制文件2。这意味着它可以轻松集成到你的Rust项目中&#xff0c;提供对PostgreSQL的支持。 特点 高性能&#xff1a;Rust Postgres提供了高性能的数据库交互功能&#…

js api part4

其他事件 页面加载事件 外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件 原因&#xff1a;有些时候需要等页面资源全部处理完了做一些事情&#xff0c;老代码喜欢把 script 写在 head 中&#xff0c;这时候直接找 dom 元素找不到。 事件…

获取转转数据,研究完转转请求,tx在算法方面很友好。

本篇文章仅供学习讨论。 文章中涉及到的代码、实例&#xff0c;仅是个人日常学习研究的部分成果。 如有不当&#xff0c;请联系删除。 在研究完阿里的算法以后&#xff08;其实很难说研究完&#xff0c;还有很多内容没有研究透&#xff0c;只能说暂时告一段落&#xff09;&…

服务智能化公共生活场景人员检测计数,基于YOLOv5全系列参数模型【n/s/m/l/x】开发构建公共生活场景下人员检测计数识别系统

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;各种智能化系统已广泛应用于各个领域&#xff0c;特别是在人员密集、流动性大的场合&#xff0c;如商场、火车站、景区等&#xff0c;智能人员检测计数系统发挥着至关重要的作用。特别是在特殊时期&#xff0c;如节假日、…

cmake进阶:变量的作用域说明三(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下&#xff1a; cmake进阶&#xff1a;变量的作用域说明一&#xff08;从函数作用域方面&#xff09;-CSDN博客cmake进阶&#xff1a;变量的作用域说明二&#xff08;从函数作用域方面&#xff09;-CSDN博客…