ARM i2c

本文详细介绍了使用STM32开发板实现的温湿度监控系统,通过读取Si7006温湿度传感器的数据,当温度和湿度超过预设阈值时,控制风扇和LED灯的开关状态,同时包括GPIO配置和延时函数等基础硬件操作。
摘要由CSDN通过智能技术生成

1.自己设置温度湿度阈值,当温度过高时,打开风扇,蜂鸣器报警

2.当湿度比较高时,打开LED1灯,蜂鸣器报警

bee.c

#include"bee.h"
void bee_init()
{
     RCC->MP_AHB4ENSETR  |= (0x1<<1);
    GPIOB->MODER &= (~(0X3<<12));
    GPIOB->MODER |= (0X1<<12);

    GPIOB->OTYPER &= (~(0X1<<6));

    GPIOB->OSPEEDR &= (~(0X3<<12));

    GPIOB->PUPDR &= (~(0X3<<12));

     GPIOB->ODR &= (~(0X1<<6));
}

void BEE_ON()
{
    GPIOB->ODR |= (0X1<<6);
}
void BEE_OFF()
{
  GPIOB->ODR &=  (~(0X1<<6));
}

fan.c

#include "fan.h"
void fan_init()
{
    RCC->MP_AHB4ENSETR  |= (0x1<<4);
    GPIOE->MODER &= (~(0X3<<18));
    GPIOE->MODER |= (0X1<<18);

    GPIOE->OTYPER &= (~(0X1<<9));

    GPIOE->OSPEEDR &= (~(0X3<<18));

    GPIOE->PUPDR &= (~(0X3<<18));

     GPIOE->ODR &= (~(0X1<<9));
}

void FAN_ON()
{
    GPIOE->ODR |= (0X1<<9);
}
void FAN_OFF()
{
  GPIOE->ODR &=  (~(0X1<<9));
}

led.c

#include "led.h"

void all_led_init()//led灯的初始化
{
    //GPIOE/GPIOF时钟使能
   RCC->MP_AHB4ENSETR  |= (0x3<<4);
    //PE10设置为输出
    GPIOE->MODER &= (~(0X3<<20));
    GPIOE->MODER |= (0X1<<20);
    //PF10设置为输出
    GPIOF->MODER &= (~(0X3<<20));
    GPIOF->MODER |= (0X1<<20);
    //PE8设置为输出
    GPIOE->MODER &= (~(0X3<<16));
    GPIOE->MODER |= (0X1<<16);
    //PE10设置为推挽输出
    GPIOE->OTYPER &= (~(0X1<<10));
    //PF10设置为推挽输出
    GPIOF->OTYPER &= (~(0X1<<10));
    //PE8设置为推挽输出
    GPIOE->OTYPER &= (~(0X1<<8));
    //PE10设置为低速输出
    GPIOE->OSPEEDR &= (~(0X3<<20));
    //PF10设置为低速输出
    GPIOF->OSPEEDR &= (~(0X3<<20));
    //PE8设置为低速输出
   GPIOE->OSPEEDR &= (~(0X3<<16));
    //PE10无上拉下拉电阻
    GPIOE->PUPDR &= (~(0X3<<20));
    //PF10无上拉下拉电阻
    GPIOF->PUPDR &= (~(0X3<<20));
    //PE8无上拉下拉电阻
    GPIOE->PUPDR &= (~(0X3<<16));

    //三盏灯默认输出低电平
    GPIOE->ODR &= (~(0X1<<10));
   GPIOF->ODR &= (~(0X1<<10));
    GPIOE->ODR &= (~(0X1<<8));
}

//led1亮
void LED1_ON()
{
    GPIOE->ODR |= (0X1<<10);
}
//led2亮
void LED2_ON()
{
   GPIOF->ODR |= (0X1<<10);
}
//led1亮
void LED3_ON()
{
    GPIOE->ODR |= (0X1<<8);
}

//LED1灭
void LED1_OFF()
{
     GPIOE->ODR &= (~(0X1<<10));
}
//LED2灭
void LED2_OFF()
{
     GPIOF->ODR &= (~(0X1<<10));
}
//LED3灭
void LED3_OFF()
{
     GPIOE->ODR &= (~(0X1<<8));
}    

main.c

#include"led.h"

#include "fan.h"

#include "bee.h"

// #include"motor.h"

// #include"uart4.h"

// #include"key_inc.h"

#include"si7006.h"

//封装延时函数

// void delay(int ms)

// {

//     int i,j;

//     for(i=0;i<ms;i++)

//     {

//         for(j=0;j<2000;j++)

//         {}



//     }

// }

int main()

{

 //   led初始化

    all_led_init();

	fan_init();

	bee_init();

	// motor_init();

   

         //串口初始化

        //uart4_init();

        //char i;

        // key1_it_config();

        // key2_it_config();

        // key3_it_config();

            //i2c初始化

         i2c_init();

        //si7006初始化

         si7006_init();

        short tem;

        unsigned int short hum;

    while(1)

    {

    //     i=getchar();

    //     putchar(i);

        // printf("in main pro\n");

        // delay(1000);

         //读取温度数据

        tem=si7006_read_tem();

        //读取湿度数据

        hum=si7006_read_hum();

        //计算温湿度数据

        hum=125*hum/65536-6;

        tem=175.72*tem/65536-46.85;

        printf("hum:%d\n",hum);

        printf("tem:%d\n",tem);

        if(hum>=75)

        {

            LED1_ON();

            BEE_ON();

        }

        if(hum<75)

        {

            LED1_OFF();

        }

        if(tem>=28)

        {

            FAN_ON();

            BEE_ON();

        }

        if(tem<28)

        {

            FAN_OFF();

        }

        if(tem<28&&hum<75)

        {

            BEE_OFF();

        }

        //串口打印

        delay(1000);

    }

    

    return 0;

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在ARM上使用Python编程语言来控制I2C总线,需要使用相应的Python库。常用的库包括smbus和python-periphery。 使用smbus库: 1. 安装smbus库: ``` sudo apt-get install python-smbus ``` 2. 导入库: ```python import smbus ``` 3. 创建一个I2C总线对象: ```python bus = smbus.SMBus(1) # 1是I2C总线的编号,根据实际情况修改 ``` 4. 使用总线对象进行读写操作: ```python # 读取一个字节数据 data = bus.read_byte(address) # 读取多个字节数据 data_list = bus.read_i2c_block_data(address, register, length) # 写入一个字节数据 bus.write_byte(address, data) # 写入多个字节数据 bus.write_i2c_block_data(address, register, data_list) ``` 其中,address是I2C设备地址,register是寄存器地址,length是读取字节数。 使用python-periphery库: 1. 安装python-periphery库: ``` sudo pip install python-periphery ``` 2. 导入库: ```python from periphery import I2C ``` 3. 创建一个I2C总线对象: ```python i2c = I2C("/dev/i2c-1") # "/dev/i2c-1"是I2C总线设备文件路径,根据实际情况修改 ``` 4. 使用总线对象进行读写操作: ```python # 读取一个字节数据 data = i2c.read(address, 1) # 读取多个字节数据 data = i2c.read_register(address, register, length) # 写入一个字节数据 i2c.write(address, data) # 写入多个字节数据 i2c.write_register(address, register, data) ``` 其中,address是I2C设备地址,register是寄存器地址,length是读取字节数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值