初始化提交

This commit is contained in:
王立帮
2024-07-20 22:09:06 +08:00
commit c247dd07a6
6876 changed files with 2743096 additions and 0 deletions

View File

@@ -0,0 +1,340 @@
/*
bluebit.cpp
*/
#include <Wire.h>
#include "Bluebit.h"
/* #include <“Bluebit.h> */
#include <math.h>
#include <stdlib.h> //10进制转16进制需要sprintf函数
#define LCD1602_ADDR (24)
#define ULTRASONIC_ADDR (0x0b<<1)
#define TM1650_BASE_ADDR (0x34<<1)
#define PCA9554_ADDR (0x20<<1)
#define COLOR_ADDR (0x0a<<1)
#define MIDI_ADDR (0x0c<<1)
#define SHT20_ADDR (0x40<<1)
#define BH1750_ADDR (0x23<<1)
#define PCA9685_ADDR (0x41<<1)
#define HT16K33_ADDR (0x70<<1)
uint8_t rowOffsets[4] = {0x00, 0x40, 0x10, 0x50};
/* LM35 */
int get_ntcTemp(int pin)
{
int Val;
float tmp;
Val = analogRead(pin);
tmp = ((float)(1023-Val))/Val;
tmp = log(tmp);
tmp = 298.15*tmp + 3935;
tmp = 1173220.25/tmp -273.15; //298.15*3935 = 1173220.25
return (int)tmp;
}
int get_lm35Temp(int pin)
{
uint16_t val;
double dat;
val=analogRead(pin);
dat = (double) val * (5/10.24); //温度计算公式
// Serial.print("Tep:");
// Serial.print(dat);
// Serial.println("C");
// delay(500);
return dat;
}
/*数字光线*/
uint16_t getAmbientLight(void)
{
int i = 0;
uint8_t temp[2];
uint16_t dat;
Wire.beginTransmission(0x23); //传输给从机设备0x0B
Wire.write(0x10); //发送1指令
Wire.endTransmission(); //结束传输
delay(50);
Wire.requestFrom(0x23, 2); //接收从机设备0x0B长度2字节
while (Wire.available()) {
temp[i] = Wire.read();
i++;
}
dat = temp[0];
dat = (dat<<8) + temp[1];
delay(130); //数字光线采集数据需用时120ms给予130ms延时
return dat;
}
/*超声波*/
uint8_t Distance(void)
{
int i = 0;
uint8_t cm;
uint8_t temp[2];
Wire.beginTransmission(0x0b); //传输给从机设备0x0B
Wire.write(1); //发送1指令
Wire.endTransmission(); //结束传输
Wire.requestFrom(0x0b, 2); //接收从机设备0x0B长度2字节
while (Wire.available()) {
temp[i] = Wire.read();
i++;
}
return cm = (temp[0] + temp[1] * 256) / 10;
}
/*4 按键 */
// char get_joy_button(int pin)
// {
// int val;
// char btn;
// val = analogRead(pin);
// if (val<51)
// btn ='A';
// else if((val > 199) && (val < 301))
// btn='B';
// else if ((val > 449) && (val < 551))
// btn='C';
// else if((val > 699) && (val<801))
// btn='D';
// return btn;
// }
bool get_joy_button(int index, int pin)
{
int val;
int btn;
val = analogRead(pin);
if (val<51)
btn =1; //A
else if((val > 199) && (val < 301))
btn=2; //B
else if ((val > 449) && (val < 551))
btn=3; //C
else if((val > 699) && (val<801))
btn=4; //D
return btn == index;
}
/* 扩展端口 */
void extIOInit(byte pin, byte mode) //设置IO引脚输入输出模式。mode=0为输出模式mode=1为输入模式
{
byte mode_old;
Wire.beginTransmission(0x20);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(0x20, 1);
while (Wire.available() > 0)
{
mode_old = Wire.read();
}
byte mode_new = 0;
if (mode == 1)
{
mode_new = mode_old | (1 << pin);
}
else if (mode == 0)
{
mode_new = mode_old & (~(1 << pin));
}
byte cfg[2] = { 0x03, mode_new };
Wire.beginTransmission(0x20);
Wire.write(cfg, 2);
Wire.endTransmission();
}
uint16_t readExtendedIO(byte pin) //IO读函数
{
byte dat[4];
Wire.beginTransmission(0x20);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(0x20, 4);
while (Wire.available() > 0)
{
Wire.readBytes(dat, 4);
}
return (dat[0] >> pin) & 0x01;
}
void writeExtendedIO(byte pin, byte value) //IO写函数
{
byte stat_old[3];
Wire.beginTransmission(0x20);
Wire.write(0x01);
Wire.endTransmission();
Wire.requestFrom(0x20, 3);
while (Wire.available() > 0)
{
Wire.readBytes(stat_old, 3);
}
byte stat_new = 0;
if (value == 1)
{
stat_new = stat_old[0] | (1 << pin);
}
else if (value == 0)
{
stat_new = stat_old[0] & (~(1 << pin));
}
byte cfg[2] = { 0x01, stat_new };
Wire.beginTransmission(0x20);
Wire.write(cfg, 2);
Wire.endTransmission();
}
//读I2C设备(带拨码的)
float readCodesI2C(int address)
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
int reading = 0;
Wire.requestFrom(address, 2);
if (2 <= Wire.available())
{
reading = Wire.read(); // receive high byte (overwrites previous reading)
reading = reading << 8; // shift high byte to be high 8 bits
reading |= Wire.read(); // receive low byte as lower 8 bits
//Serial.println(reading); // print the reading
}
delay(100);
return reading;
}
//光电门
double readPhotoelectricGate(int address)
{
int reading = 0;
int reading0 = 0;
int reading1 = 0;
int reading2 = 0;
int reading3 = 0;
int reading4 = 0;
unsigned long n1;
unsigned long n2;
unsigned long n3;
unsigned long n4;
double timeStamp;
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
Wire.requestFrom(address, 5);
if (5 <= Wire.available())
{
reading0 = Wire.read();
reading1 = Wire.read();
reading2 = Wire.read();
reading3 = Wire.read();
reading4 = Wire.read();
Serial.println(reading0);
Serial.println(reading1);
Serial.println(reading2);
Serial.println(reading3);
Serial.println(reading4);
n1 = (reading1)*256*256*256;
n2 = (reading2)*256*256;
n3 = (reading3)*256;
n4 = reading4;
timeStamp = (n1+n2+n3+n4)/100000;
Serial.println(timeStamp);
}
delay(100);
return timeStamp;
//返回时差
//reading1、2、3、4为10进制先转为16进制后拼接起来再除以100000单位秒比如得到2C E9 47 2B拼完是753485611除以 100000即7534.85611秒,两次时间相减即得时差。
// 思路1(0X2CE9472B)
// 思路2(0X2C)*256*256*256
// (0XE9)*256*256
}
//编码电机
/*void MotorSetSpeed(int address,int speedH,int speedL)
{
Wire.beginTransmission(address); //ransmit to device #17 (0x11)
Wire.write(byte(0x06)); //写速度寄存器地址
//Wire.write(byte(0x03)); //向速度寄存器地址写编码电机转速 高位
Wire.write(byte(speedH)); //向速度寄存器地址写编码电机转速 高位
Wire.endTransmission();
delay(10);
Wire.beginTransmission(address); //ransmit to device #17 (0x11)
Wire.write(byte(0x07)); //写速度寄存器地址
Wire.write(byte(speedL)); //向速度寄存器地址写编码电机转速 低位
Wire.endTransmission(10); // stop transmitting
delay(10);
Wire.beginTransmission(address); //ransmit to device #17 (0x11)
Wire.write(byte(0x00)); //向模式寄存器写编码电机模式
Wire.write(byte(0x01)); //向模式寄存器写编码电机模式
Wire.endTransmission(); // stop transmitting
delay(10);
}*/
//编码电机
void MotorSetSpeed(int address,int value)
{
Wire.begin(); //保留这个,外部自己选波特率
//Serial.begin(9600);
value = short(value);
//int b0;
int b1;
int b2;
/*if (value < -1024) value = -1024;
if (value > 1024) value = 1024;
if (value < 0){
value = - value;
b0 = value / 256;
b1 = b0 + 128;
b2 = value - b0 * 256;
} else {
b1 = value / 256;
b2 = value - b1 * 256;
}*/
if (value < -1024) value = -1024;
else if (value > 1024) value = 1024;
if (value < 0) value += 65536;
b1 = value / 256;
b2 = value % 256;
Wire.beginTransmission(address); //ransmit to device #17 (0x11)
Wire.write(byte(0x06)); //写速度寄存器地址
Wire.write(byte(b1)); //向速度寄存器地址写编码电机转速 高位
Wire.endTransmission();
delay(10);
Serial.println(byte(b1));
Wire.beginTransmission(address); //ransmit to device #17 (0x11)
Wire.write(byte(0x07)); //写速度寄存器地址
Wire.write(byte(b2)); //向速度寄存器地址写编码电机转速 低位
Wire.endTransmission(10); // stop transmitting
delay(10);
Serial.println(byte(b2));
Wire.beginTransmission(address); //ransmit to device #17 (0x11)
Wire.write(byte(0x00)); //向模式寄存器写编码电机模式
Wire.write(byte(0x01)); //向模式寄存器写编码电机模式
Wire.endTransmission(); // stop transmitting
delay(10);
}