haas506开发教程-example-i2c多设备测试

  • 1.测试代码
  • 2.测试结果

1.测试代码

多设备i2c设备测试,注意设备的频率需要一致

  • main.py
# coding=utf-8
import utime as time
import usys
usys.path.append('/data/pyamp')
import  ADS1x15
from mpu6050 import mpu6050
from driver import GPIOmpu=mpu6050()gpio=GPIO()
gpio.open("gpio31")adc = ADS1x15.ADS1115()
GAIN = 2/3
print('Reading ADS1x15 and mpu6050 values, press Ctrl-C to quit...')
while True:print("gpio31 level:",gpio.read())if gpio.read()==1:values = [0]*4for i in range(4):values[i] = adc.read_adc(i, gain=GAIN)values[i]=values[i]*0.1875/1000print('-'*45)print('| {0:>7} | {1:>7} | {2:>7} | {3:>7} |'.format('IN0','IN1','IN2','IN3'))print('| {0:>6} | {1:>6} | {2:>6} | {3:>6} |'.format(*values))print('-'*45)gpio.write(0)time.sleep(5)print("gpio31 level:",gpio.read())if gpio.read()==0:print('--------------------------------mpu6050test----------------------------------')mpu_id=mpu.get_dev_id()print('mpu6050 chip id is ',hex(ord(mpu_id.decode())))print('Temperature:',mpu.get_temp())accel_data = mpu.get_accel_data()print('accel_data = {},{},{}'.format(accel_data['x'],accel_data['y'],accel_data['z']))gyro_data = mpu.get_gyro_data()print('gyro_data = {},{},{}'.format(gyro_data['x'],gyro_data['y'],gyro_data['z']))angle=mpu.get_imu_angle(accel_data['x'],accel_data['y'],accel_data['z'],gyro_data['x'],gyro_data['y'],gyro_data['z'])print("Roll={},pitch={},Yaw={}".format(angle['Pitch'],angle['Roll'],angle['Yaw']))print('-------------------------------------------------------------------------------')gpio.write(1)time.sleep(5)
  • mpu6050.py
import  math
class mpu6050:# 重力加速度值GRAVITIY_MS2 = 9.80665#比例增益支配率收敛到加速度计/磁强计Kp=100.0#积分增益支配率的陀螺仪偏见的衔接Ki= 0.002#采样周期的一半halfT= 0.001#俯仰角 横滚角 航向角Pitch=0Roll=0Yaw=0#四元数的元素,代表估计方向q0 = 1q1 = 0q2 = 0q3 = 0#按比例缩小积分误差exInt = 0eyInt = 0ezInt = 0# Scale ModifiersACCEL_SCALE_MODIFIER_2G = 16384.0ACCEL_SCALE_MODIFIER_4G = 8192.0ACCEL_SCALE_MODIFIER_8G = 4096.0ACCEL_SCALE_MODIFIER_16G = 2048.0GYRO_SCALE_MODIFIER_250DEG = 131.0GYRO_SCALE_MODIFIER_500DEG = 65.5GYRO_SCALE_MODIFIER_1000DEG = 32.8GYRO_SCALE_MODIFIER_2000DEG = 16.4# Pre-defined rangesACCEL_RANGE_2G = 0x00ACCEL_RANGE_4G = 0x08ACCEL_RANGE_8G = 0x10ACCEL_RANGE_16G = 0x18GYRO_RANGE_250DEG = 0x00GYRO_RANGE_500DEG = 0x08GYRO_RANGE_1000DEG = 0x10GYRO_RANGE_2000DEG = 0x18# MPU-6050 RegistersPWR_MGMT_1 = 0x6BPWR_MGMT_2 = 0x6CACCEL_XOUT0 = 0x3BACCEL_YOUT0 = 0x3DACCEL_ZOUT0 = 0x3FTEMP_OUT0 = 0x41GYRO_XOUT0 = 0x43GYRO_YOUT0 = 0x45GYRO_ZOUT0 = 0x47ACCEL_CONFIG = 0x1CGYRO_CONFIG = 0x1Bdef __init__(self):from driver import I2Cself.i2c=I2C()self.i2c.open('mpu6050')writeBuf=bytearray(2)writeBuf[0]=self.PWR_MGMT_1writeBuf[1]=0x00# Wake up the MPU-6050 since it starts in sleep modeself.i2c.write(writeBuf,2)def get_dev_id(self):readBuf=bytearray([0x75])self.i2c.read(readBuf,1)return readBufdef read_i2c_word(self, register):# Read the data from the registersreadBuf=bytearray(2)readBuf[0]=registerreadBuf[1]=register+1self.i2c.read(readBuf,2)high=readBuf[0]low=readBuf[1]value = (high << 8) + lowif (value >= 0x8000):return -((65535 - value) + 1)else:return value# 得到mpu6050的温度值def get_temp(self):readBuf=bytearray(1)readBuf[0]=self.TEMP_OUT0self.i2c.read(readBuf,1)actual_temp=(ord(readBuf.decode())/340)+36.53return actual_temp#设置加速度量程def set_accel_range(self, accel_range):# First change it to 0x00 to make sure we write the correct valuewriteBuf1=bytearray(2)writeBuf1[0]=self.ACCEL_CONFIGwriteBuf1[1]=0x00self.i2c.write(writeBuf1,2)# Write the new range to the ACCEL_CONFIG registerwriteBuf2=bytearray(2)writeBuf2[0]=self.ACCEL_CONFIGwriteBuf2[1]=accel_rangeself.i2c.write(writeBuf2,2)#读取加速度量程def read_accel_range(self, raw = False):readBuf=bytearray(1)readBuf[0]=self.ACCEL_CONFIGself.i2c.read(readBuf,1)if raw is True:return readBufelif raw is False:if readBuf == self.ACCEL_RANGE_2G:return 2elif readBuf == self.ACCEL_RANGE_4G:return 4elif readBuf == self.ACCEL_RANGE_8G:return 8elif readBuf == self.ACCEL_RANGE_16G:return 16else:return -1#得到加速度数据def get_accel_data(self, g = False):x = self.read_i2c_word(self.ACCEL_XOUT0)y = self.read_i2c_word(self.ACCEL_YOUT0)z = self.read_i2c_word(self.ACCEL_ZOUT0)accel_scale_modifier = Noneaccel_range = self.read_accel_range(True)if accel_range == self.ACCEL_RANGE_2G:accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_2Gelif accel_range == self.ACCEL_RANGE_4G:accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_4Gelif accel_range == self.ACCEL_RANGE_8G:accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_8Gelif accel_range == self.ACCEL_RANGE_16G:accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_16Gelse:#如果不设置量程,会默认使用ACCEL_SCALE_MODIFIER_2Gprint("Unkown range - accel_scale_modifier set to self.ACCEL_SCALE_MODIFIER_2G")accel_scale_modifier = self.ACCEL_SCALE_MODIFIER_2Gx = x / accel_scale_modifiery = y / accel_scale_modifierz = z / accel_scale_modifierif g is True:return {'x': x, 'y': y, 'z': z}elif g is False:x = x * self.GRAVITIY_MS2y = y * self.GRAVITIY_MS2z = z * self.GRAVITIY_MS2return {'x': x, 'y': y, 'z': z}#设置角速度量程def set_gyro_range(self, gyro_range):writeBuf1=bytearray(2)writeBuf1[0]=self.GYRO_CONFIGwriteBuf1[1]=0x00self.i2c.write(writeBuf1,2)writeBuf2=bytearray(2)writeBuf2[0]=self.GYRO_CONFIGwriteBuf2[1]=gyro_rangeself.i2c.write(writeBuf2,2)#读取角速度量程def read_gyro_range(self, raw = False):readBuf=bytearray(1)readBuf[0]=self.GYRO_CONFIGself.i2c.read(readBuf,1)if raw is True:return readBufelif raw is False:if readBuf == self.GYRO_RANGE_250DEG:return 250elif readBuf == self.GYRO_RANGE_500DEG:return 500elif readBuf == self.GYRO_RANGE_1000DEG:return 1000elif readBuf == self.GYRO_RANGE_2000DEG:return 2000else:return -1#得到角速度数据def get_gyro_data(self):x = self.read_i2c_word(self.GYRO_XOUT0)y = self.read_i2c_word(self.GYRO_YOUT0)z = self.read_i2c_word(self.GYRO_ZOUT0)gyro_scale_modifier = Nonegyro_range = self.read_gyro_range(True)if gyro_range == self.GYRO_RANGE_250DEG:gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_250DEGelif gyro_range == self.GYRO_RANGE_500DEG:gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_500DEGelif gyro_range == self.GYRO_RANGE_1000DEG:gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_1000DEGelif gyro_range == self.GYRO_RANGE_2000DEG:gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_2000DEGelse:#如果不设置量程,会默认使用GYRO_SCALE_MODIFIER_250DEGprint("Unkown range - gyro_scale_modifier set to self.GYRO_SCALE_MODIFIER_250DEG")gyro_scale_modifier = self.GYRO_SCALE_MODIFIER_250DEGx = x / gyro_scale_modifiery = y / gyro_scale_modifierz = z / gyro_scale_modifierreturn {'x': x, 'y': y, 'z': z}#得到 加速度和角速度数据,和温度值def get_all_data(self):temp = self.get_temp()accel = self.get_accel_data()gyro = self.get_gyro_data()return [accel, gyro, temp]def get_imu_angle(self,ax,ay,az,gx,gy,gz):#测量正常化norm1 = math.sqrt(ax*ax + ay*ay + az*az);if norm1!=0:#单位化ax = ax / norm1ay = ay / norm1az = az / norm1# 估计方向的重力vx = 2*(self.q1*self.q3 - self.q0*self.q2)vy = 2*(self.q0*self.q1 + self.q2*self.q3)vz = self.q0*self.q0 - self.q1*self.q1 - self.q2*self.q2 + self.q3*self.q3#错误的领域和方向传感器测量参考方向之间的交叉乘积的总和ex = (ay*vz - az*vy)ey = (az*vx - ax*vz)ez = (ax*vy - ay*vx)#积分误差比例积分增益exInt = self.exInt + ex*self.KieyInt = self.eyInt + ey*self.KiezInt = self.ezInt + ez*self.Ki# 调整后的陀螺仪测量gx = gx + self.Kp*ex + exIntgy = gy + self.Kp*ey + eyIntgz = gz + self.Kp*ez + ezIntelse:print("norm1 is 0")#整合四元数率和正常化q0 = self.q0 + (-self.q1*gx - self.q2*gy - self.q3*gz)*self.halfTq1 = self.q1 + (self.q0*gx + self.q2*gz - self.q3*gy)*self.halfTq2 = self.q2 + (self.q0*gy - self.q1*gz + self.q3*gx)*self.halfTq3 = self.q3 + (self.q0*gz + self.q1*gy - self.q2*gx)*self.halfT# 正常化四元norm2 = math.sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3)if norm2!=0:q0 = q0 / norm2q1 = q1 / norm2q2 = q2 / norm2q3 = q3 / norm2Pitch  = math.asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3Roll = math.atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3#Yaw可以注释掉,因为六轴传感器没有磁力计,所以得到的航偏角不准Yaw = math.atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;return {'Pitch': Pitch, 'Roll': Roll, 'Yaw': Yaw}else:print("norm2 is 0")
  • ADS1x15.py
# coding=utf-8
import utime as time
'''
# Choose a gain of 1 for reading voltages from 0 to 4.09V.
# Or pick a different gain to change the range of voltages that are read:
#  - 2/3 = +/-6.144V
#  -   1 = +/-4.096V
#  -   2 = +/-2.048V
#  -   4 = +/-1.024V
#  -   8 = +/-0.512V
#  -  16 = +/-0.256V
'''# Register and other configuration values:
ADS1x15_DEFAULT_ADDRESS        = 0x48
ADS1x15_POINTER_CONVERSION     = 0x00
ADS1x15_POINTER_CONFIG         = 0x01
ADS1x15_POINTER_LOW_THRESHOLD  = 0x02
ADS1x15_POINTER_HIGH_THRESHOLD = 0x03
ADS1x15_CONFIG_OS_SINGLE       = 0x8000
ADS1x15_CONFIG_MUX_OFFSET      = 12
# Maping of gain values to config register values.
ADS1x15_CONFIG_GAIN = {2/3: 0x0000,1:   0x0200,2:   0x0400,4:   0x0600,8:   0x0800,16:  0x0A00
}
ADS1x15_CONFIG_MODE_CONTINUOUS  = 0x0000
ADS1x15_CONFIG_MODE_SINGLE      = 0x0100
# Mapping of data/sample rate to config register values for ADS1015 (faster).
ADS1015_CONFIG_DR = {128:   0x0000,250:   0x0020,490:   0x0040,920:   0x0060,1600:  0x0080,2400:  0x00A0,3300:  0x00C0
}
# Mapping of data/sample rate to config register values for ADS1115 (slower).
ADS1115_CONFIG_DR = {8:    0x0000,16:   0x0020,32:   0x0040,64:   0x0060,128:  0x0080,250:  0x00A0,475:  0x00C0,860:  0x00E0
}
ADS1x15_CONFIG_COMP_WINDOW      = 0x0010
ADS1x15_CONFIG_COMP_ACTIVE_HIGH = 0x0008
ADS1x15_CONFIG_COMP_LATCHING    = 0x0004
ADS1x15_CONFIG_COMP_QUE = {1: 0x0000,2: 0x0001,4: 0x0002
}
ADS1x15_CONFIG_COMP_QUE_DISABLE = 0x0003class ADS1x15(object):def __init__(self,**Kwargs):#导入I2cfrom driver import I2C#实例化self._i2c=I2C()#打开I2cself._i2c.open("ADS1115")def _data_rate_default(self):#子类需要实现 父类的方法,否则报错raise NotImplementedError("subclass must implemet _data_rate_default!")def _data_rate_config(self,data_rate):#子类需要实现 父类的方法,否则报错raise NotImplementedError("subclass must implemet _data_rate_default!")def _conversion_value(self, low, high):#子类需要实现 父类的方法,否则报错raise NotImplementedError('Subclass must implement _conversion_value function!')#mux, gain, data_rate, and mode 要在规定的范围内def _read(self, mux, gain, data_rate, mode):# Go out of power-down mode for conversion.config = ADS1x15_CONFIG_OS_SINGLE# Specify mux value.config |= (mux & 0x07) << ADS1x15_CONFIG_MUX_OFFSET#设置增益if gain not in ADS1x15_CONFIG_GAIN:raise ValueError('Gain must be one of: 2/3, 1, 2, 4, 8, 16')config |= ADS1x15_CONFIG_GAIN[gain]#设置模式(continuous or single shot)config |= mode#得到速率,默认128bpsif data_rate is None:data_rate = self._data_rate_default()#设置速率config |= self._data_rate_config(data_rate)#disable 比较器模式config |= ADS1x15_CONFIG_COMP_QUE_DISABLE#I2C的写函数writeData=bytearray(3)writeData[0]=ADS1x15_POINTER_CONFIGwriteData[1]=(config >> 8) & 0xFFwriteData[2]=config & 0xFFself._i2c.write(writeData,3)#等待ADC采样(根据采样率加上一个很小的偏置,如0.1ms)time.sleep(1.0/data_rate+0.0001)#I2C的读函数readData=bytearray([ADS1x15_POINTER_CONVERSION,0x00])self._i2c.read(readData,2)#return 读取到的数据,包含高八位和低八位return self._conversion_value(readData[1],readData[0])def read_adc(self, channel, gain=1, data_rate=None):#读单个ADC通道,通道值取值范围为[0,3]assert 0 <= channel <= 3, 'Channel must be a value within 0-3!'# Perform a single shot read and set the mux value to the channel plus# the highest bit (bit 3) set.return self._read(channel + 0x04, gain, data_rate, ADS1x15_CONFIG_MODE_SINGLE)#继承父类
class ADS1115(ADS1x15):"""ADS1115 16-bit analog to digital converter instance."""def __init__(self, *args, **kwargs):super(ADS1115, self).__init__(*args, **kwargs)def _data_rate_default(self):#默认速率为128bpsreturn 128def _data_rate_config(self, data_rate):if data_rate not in ADS1115_CONFIG_DR:raise ValueError('Data rate must be one of: 8, 16, 32, 64, 128, 250, 475, 860')return ADS1115_CONFIG_DR[data_rate]def _conversion_value(self, low, high):#转换16位数据value = ((high & 0xFF) << 8) | (low & 0xFF)if value & 0x8000 != 0:value -= 1 << 16return value
  • board.json
{"name": "haas506","version": "1.0.0","io": {"ADS1115": {"type": "I2C","port": 1,"addrWidth": 7,"freq": 400000,"mode": "master","devAddr": 72},"mpu6050": {"type": "I2C","port": 1,"addrWidth": 7,"freq": 400000,"mode": "master","devAddr": 104},"gpio31":{"type":"GPIO","port": 31,"dir": "output","pull":"pullup"}, "serial1":{"type":"UART","port":0,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial2":{"type":"UART","port":1,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial3":{"type":"UART","port":2,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"}},"debugLevel": "ERROR"}

2.测试结果

Reading ADS1x15 and mpu6050 values, press Ctrl-C to quit...
gpio31 level: 0
gpio31 level: 0
--------------------------------mpu6050test----------------------------------
mpu6050 chip id is  0x68
Temperature: 37.22705882352941
Unkown range - accel_scale_modifier set to self.ACCEL_SCALE_MODIFIER_2G
accel_data = -3.088520141601562,3.713406774902344,8.10197841796875
Unkown range - gyro_scale_modifier set to self.GYRO_SCALE_MODIFIER_250DEG
gyro_data = 4.435114503816794,-1.137404580152672,-2.778625954198473
Roll=3.62792124703243,pitch=5.011731732119345,Yaw=-0.1596178755665964
-------------------------------------------------------------------------------
gpio31 level: 1
---------------------------------------------
|     IN0 |     IN1 |     IN2 |     IN3 |
| 0.604688 | 0.596625 | 0.605437 | 0.6045 |
---------------------------------------------
gpio31 level: 0
--------------------------------mpu6050test----------------------------------
mpu6050 chip id is  0x68
Temperature: 37.23000000000001
Unkown range - accel_scale_modifier set to self.ACCEL_SCALE_MODIFIER_2G
accel_data = -9.009380847167968,10.95347259521484,0.2346317626953125
Unkown range - gyro_scale_modifier set to self.GYRO_SCALE_MODIFIER_250DEG
gyro_data = -217.6641221374046,139.8320610687023,8.664122137404581
Roll=22.67982913322267,pitch=-16.45716503485358,Yaw=-2.329200646882642
-------------------------------------------------------------------------------
gpio31 level: 1
---------------------------------------------
|     IN0 |     IN1 |     IN2 |     IN3 |
| -0.0001875 | -0.0001875 | -0.0001875 | -0.0001875 |
---------------------------------------------
gpio31 level: 0
--------------------------------mpu6050test----------------------------------
mpu6050 chip id is  0x68
Temperature: 37.23000000000001
Unkown range - accel_scale_modifier set to self.ACCEL_SCALE_MODIFIER_2G
accel_data = -6.354211206054687,6.775590698242187,0.871489404296875
Unkown range - gyro_scale_modifier set to self.GYRO_SCALE_MODIFIER_250DEG
gyro_data = 8.183206106870228,4.33587786259542,9.259541984732824
Roll=8.147455054510537,pitch=9.363711465630846,Yaw=1.729427878507938
-------------------------------------------------------------------------------
gpio31 level: 1
---------------------------------------------
|     IN0 |     IN1 |     IN2 |     IN3 |
| 3.28556 | -0.0001875 | -0.0001875 | -0.0001875 |
---------------------------------------------
gpio31 level: 0
......

3.12 haas506开发教程-example-i2c多设备测试相关推荐

  1. 1.4 haas506开发教程-driver-ADC

    haas506开发教程-driver-ADC 1.硬件图 2.板载ADC 3.日志 4.总结 1.硬件图 2.板载ADC (1)案例说明   Haas506开发板有两个ADC接口,可以使用板载ADC接 ...

  2. 2.6 haas506开发教程-高级组件库-net

    haas506开发教程-高级组件库-net 1.使用示例 2. Class-net 3.总结 -----------------------------------待完善--------------- ...

  3. 虚幻引擎5 AR开发教程02:构建和测试AR Android App

    在本教程中,我们将学习如何在虚幻引擎 5 上构建和测试 AR 安卓应用. 步骤 01:确保已安装目标平台. 打开 Epic Games 启动器 选择选项 确保为您所需的应用程序构建平台安装了目标平台 ...

  4. IntelliJ IDEA 12详细开发教程(一)思想的转变与新手入门

    从事软件开发工作以来,提高自己的开发效率,提高自己编码的规范,提高编码深度层次,这三样一直都是自己努力去追求的事情. 最近在研究新的开发工具,摆脱了eclipse.现在我要跟各位开发人员一起分享我最近 ...

  5. IntelliJ IDEA 12详细开发教程(四) 搭建Android应用开发环境与Android项目创建

    今天我要给大家讲的是使用Intellij Idea开发Android应用开发.自我感觉使用Idea来进行Android开发要比在Eclipse下开发简单很多. (一)打开网站:http://devel ...

  6. 淘宝api开发教程(淘宝API测试地址,参数说明)

    API一词相信每一个开发人员都不陌生,API是软件系统之间或不同组成部分之间进行连接的约定.特别是移动应用程序和微服务架构的不断普及,API就是他们成功背后的功臣,这个时候如何设计和开发API就显得格 ...

  7. haas506 2.0开发教程 - 阿里云ota - pac 固件升级(仅支持2.2以上版本)

    haas506 2.0开发教程-ota - pac 固件升级 ota - pac固件升级 案例说明 1.确定开发板内存 2.物联网平台开发 3.设备端开发 调试,确定开发板驻网成功 4.ota - 硬 ...

  8. 3.9 haas506 2.0开发教程-example-oled

    haas506 2.0开发教程-example-oled 1.OLED模块 2.测试 3.效果 4.总结 1.OLED模块 有机发光二极管(OrganicLight-Emitting Diode,OL ...

  9. MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件

    MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件 1.功能描述 msa311可以识别单击.双击事件,类似手机上的点击返回,双击截屏功能. 单击,双击都 ...

最新文章

  1. 强强联合!Papers with Code携手arXiv,上传论文、提交代码一步到位
  2. withRouter组件
  3. ThinkPHP公共配置文件与各自项目中配置文件组合的方法
  4. MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具
  5. 支付宝生成RSA密钥,上传应用公钥的完整流程
  6. 单链表的应用 就地逆置
  7. android 暂停音乐播放器,Android仿音乐播放器带进度的播放暂停按钮
  8. avr单片机c语言大小比较,AVR单片机C语言入门知识
  9. 【小白话通信】离散分布之间的关系
  10. BP(back propagation)误差逆传播神经网络
  11. python小球弹弹弹_python3.6使用tkinter实现弹跳小球游戏
  12. 多目标进化算法详细讲解及代码实现(样例:MOEA/D、NSGA-Ⅱ求解多目标(柔性)作业车间调度问题)
  13. rtklib-单点定位(pntpos.c)代码关键问题解析-satposs部分
  14. 凡事都要追求公平?还真不一定!
  15. 纯JS省市区三级联动(行政区划代码更新至2015-9-30)
  16. app ui ios airtest +python 环境搭建
  17. 全文搜索引擎----ElasticSearch和Solr
  18. 使用Netty实现一个小型服务器(作为数据中转站)
  19. Java 8 Lambda表达式官方入门教程(包括Lambda表达式介绍和语法)
  20. Keil uVision5 Win10 设置字体 崩溃

热门文章

  1. 逆商:我们该如何应对坏事件
  2. 计算机视觉方向简介(四) | 深度相机室内实时稠密三维重建
  3. 室内场景识别任务的参赛攻略!第一名经验分享,Malena.
  4. IOS,ANDROID,.NET通用AES加密算法
  5. python写软件实例-30分钟学会用Python编写简单程序
  6. 常用距离算法 (原理、使用场景、Python实现代码)
  7. 【详细版】用Markdown必备,Typora+PicGo+GitHub搭建免费图床
  8. 基于C语言的材料力学模型计算实现(前言)
  9. LaTeX量子电路作图工具Qcircuit
  10. py的session实现宁稳网验证码登录,csrf_token破解,自动跳转