spinmry's Lab

绝赞摸鱼中Orz

Category

  • Algorithm
  • Hardware
  • Homelab
  • Programming
  • Retro
  • Software

Tags

  • 算法
  • OI
  • Linux
  • 数据结构
  • HardwareHacking
  • Homelab
  • 机器人
  • VEX
  • 线段树
  • Nspire
  • 离散化
  • QQBot
  • 单片机
  • RobotC
  • 平衡树
  • Kruskal
  • 图论
  • Vintage
  • 计算设备
  • ARM
  • 树状数组
  • 动态规划
  • Tarjan
  • Loongson
  • Python
  • iLO
  • STM32
  • Mac
  • CUDA
  • 数论
  • Mattermost
  • Wolfram
  • 网页
  • 分块
  • ACG
  • 爬虫

Recent replies

  • spinmry 发表于「在 macOS 上运行 iSCSI 无盘 Linux 虚拟机」
  • Mizu 发表于「在 macOS 上运行 iSCSI 无盘 Linux 虚拟机」
  • Prelina 发表于「在 macOS 上运行 iSCSI 无盘 Linux 虚拟机」
  • jiyouzhan 发表于「使用 Debian + libvirt + WebVirtCloud 作为 homelab 虚拟化平台」
  • jianchen 发表于「在 Loongson 2F 上编译 Common Desktop Environment」

友情链接

空白酱
Woshiluo
FlyGoat
BeyondLimits
Memo von EFS
Paizhang
Ntzyz
ZephRay
Polarnova
Tautcany
NekoDaemon
MaxAlex
Abyss Studio
EE Archeology 电子考古学
桜庭清夏的小站
欠陥電気の摸鱼小池
白玉楼製作所
naivekun's blog

娱乐向跑分

Coremark
Linpack

VEX Robot C 入门教程 #1

2019 年 3 月 9 日分类:Programming#机器人#VEX#RobotC
提示:在继续阅读之前,请注意此文章最后更新于 2357 天前,其中的部分内容可能已经无效或过时。

VEX Robot C 入门教程 #1

rt,应老师要求,为了造福下届学弟学妹,特此写下此入门教程。(下届不是都用 V5 了吗(划掉)) 下面这篇教程相当于一个 Hello World 的例子,将通过程序驱动一个电机。

0x00 Robot C 程序结构

Robot C 中大部分基础语法与 C 语言相同,在此就不一一赘述了(其实是懒)。 一个简单的 Robot C 程序通常是以以下结构存在的:

#pragma config(blablablabla)

void fun(){
/*blablablabla*/
}

task main(){
/*blablablabla*/
}

其中 task 代表一个任务。Robot C 语言支持多任务,在后文中会对此进行介绍。 在将此程序烧写到主控盒后,程序会从 main() 任务开始执行。 在后面的教程中我将介绍有关 Robot C 的编程结构。

0x01 电机驱动

VEX EDR 主控共有十个电机端口,其中有八个为三线端口,其余两个为双线端口。 要通过程序控制电机,我们必须先配置电机。 在 Robot C 中,配置电机可以通过单击_Motor and Sensor Setup_按钮来配置,如图所示: 电机配置

也可以通过以下代码来配置:

#pragma config(Motor, port2, left_front, tmotorVex393_MC29, openLoop, reversed)

配置完成后,即可开始编程来操控电机。

在 VEX Robot C 中,有一种十分方便的控制电机的方式,那就是 motor[] 数组。 通过使用motor[portX]可以操控端口 X 电机的功率,其中赋值范围为 $$ [-127,127] $$ 。当赋值为负时,电机会反转。 比如,以下代码会使端口 2 的电机正转 1s 后反转 1s 最后停止。

motor[port2] = 127;//将电机 2 设置为最大功率正转
wait1Msec(1000);//此语句的作用为使主控盒延时 1000ms 再执行下面的语句
motor[port2] = -127;//将电机 2 设置为最大功率反转
wait1Msec(1000);
motor[port2] = 0;

以上就是控制电机的一种简单方法了,下面来让我们写一个完整的 VEX Robot C 程序。

#pragma config(Motor, port2, Left, tmotorVex393_MC29, openLoop)

task main(){
    while(1){
        motor[port2] = 127
        wait1Msec(1000);
        motor[port2] = -127;
        wait1Msec(1000);
        motor[port2] = 0;
    }
}

0x02 编译 & 烧写程序

首先确保主控盒烧写了同 Robot C 同版本的固件。 将主控盒通过数据线连接至计算机后,待到主控盒两个 LED 灯变为绿色后,点击 Compile Program 对程序进行重新编译,然后点击 Download 按钮开始烧写程序。

Tyvj 1730 二逼平衡树

2019 年 2 月 20 日分类:Algorithm#算法#OI#数据结构#平衡树#分块

Tyvj 1730 二逼平衡树

目前还没AC qaq

先是写了线段树套splay,然而可耻的挂了.. 然后又写了分块,完美的tle了... 待更新

    
    //分块tle
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    //define
    const int maxn = 300 + 5;
    const int maxm = 5e5 + 5;
    const int inf = 0x7FFFFFFF;
    
    int chunk_len[maxn], chunk[maxn][maxn], a[maxm], n, m, cnt, len;
    
    void modify(int ck, int k){
        a[ck] = k;
        int tmp=(ck + len - 1) / len;
        for(register int i = 1; i <= chunk[tmp][0]; ++i)
            chunk[tmp][i] = a[(tmp - 1) * len + i];
        stable_sort(chunk[tmp] + 1,chunk[tmp] + chunk_len[tmp] + 1);
    }
    
    int __lower_bound(int aa[maxn], int k){
        int ll = 1, rr = aa[0];
        while(ll < rr){
            int mid = ll + rr >> 1;
            if(aa[mid] >= k)rr = mid;
            else ll = mid + 1;
        }
        if(aa[ll] >= k)return ll - 1;
        else return ll;
    }
    
    int __sub_search(int aa[maxn], int k){
        int ll = 1, rr = aa[0];
        while(ll < rr){
            int mid = ll + rr >> 1;
            if(aa[mid + 1] <= k)ll = mid + 1;
            else rr = mid;
        }
        if(aa[ll] <= k)return ll + 1;
        else return ll;
    }
    
    int pre(int l, int r, int k){
        int ll = (l + len - 1) / len;
        int rr = (r + len - 1) / len;
        int ans = -inf;
        if(ll != rr){
            for(register int i = l; i <= ll * len; ++i){
                if(a[i] < k) ans = max(ans, a[i]);
            }
            rr++;
            for(register int i = r; i >= (ll - 1) * len; --i){
                if(a[i] < k) ans = max(ans, a[i]);
            }
            for(register int i = ll; i < rr; ++i){
                if(int tmp = __lower_bound(chunk[i], k) != 0){
                    ans = max(chunk[i][tmp], ans);
                }
            }
        }else{
            for(register int i = l; i <= r; ++i){
                if(a[i] < k){
                    ans = max(ans, a[i]);
                }
            }
        }return ans;
    }
    
    int sub(int l, int r, int k){
        int ll = (l + len - 1) / len;
        int rr = (r + len - 1) / len;
        int ans = inf;
        if(ll != rr){
            for(register int i = l; i <= ll * len; ++i){
                if(a[i] > k) ans = min(ans, a[i]);
            }
            ll++;
            for(register int i = r; i >= (ll - 1) * len; --i){
                if(a[i] > k) ans = min(ans, a[i]);
            }
            for(register int i = ll; i < rr; ++i){
                if(int tmp = __sub_search(chunk[i], k) != chunk_len[i] + 1){
                    ans = min(chunk[i][tmp], ans);
                }
            }
        }else{
            for(register int i = l; i <= r; ++i){
                if(a[i] > k){
                    ans = min(ans, a[i]);
                }
            }
        }return ans;
    }
    
    int rnk(int l, int r, int k){
        int ll = (l + len - 1) / len;
        int rr = (r + len - 1) / len;
        int ans = 0;
        if(ll != rr){
            for(register int i = l; i <= ll * len; ++i){
                if(a[i] < k) ans++;
            }
            ll++;
            for(register int i = r; i >= (ll - 1) * len; --i){
                if(a[i] < k) ans++;
            }
            for(register int i = ll; i < rr; ++i){
                ans += __lower_bound(chunk[i], k);
            }
        }else{
            for(register int i = l; i <= r; ++i){
                if(a[i] < k){
                    ans++;
                }
            }
        }return ans+1;
    }
    
    int kth(int l, int r, int k){
        int ll = 0, rr = inf, ans = 0;
        while(ll < rr){
            int mid = ll + rr >> 1;
            if(rnk(l, r, mid) > k) rr = mid;
            else ll = mid+1, ans = mid;
        }return ans;
    }
    
    //main
    int main(){
        ios::sync_with_stdio(false);
        cin >> n >> m;
        for(register int i = 1; i <=n; ++i){
            cin >> a[i];
        }
        cnt = sqrt(n) + 2;len = cnt;
        for(register int i = 1; i <= cnt; ++i){
            for(register int j = 1; j <= len; ++j){
                chunk[i][j] = a[(i - 1) * len + j];
            }
            stable_sort(chunk[i] + 1, chunk[i] + len + 1);
            chunk_len[i] = len;
        }
        if(n % len != 0){
            cnt++;chunk_len[cnt] = n % len;
            for(register int i = 1; i <= chunk_len[cnt]; ++i){
                chunk[cnt][i] = a[(cnt - 1) * len + i];
            }
            stable_sort(chunk[cnt] + 1, chunk[cnt] + chunk_len[cnt] + 1);
        }
        int opt, x, y, z;
        while(m--){
            cin >> opt;
            if(opt == 1){
                cin >> x >> y >> z;
                cout << rnk(x, y, z) << endl;
            }
            else if(opt == 2){
                cin >> x >> y >> z;
                cout << kth(x, y, z) << endl;
            }
            else if(opt == 3){
                cin >> x >> y;
                modify(x, y);
            }
            else if(opt == 4){
                cin >> x >> y >> z;
                cout << pre(x, y, z) << endl;
            }else {
                cin >> x >> y >> z;
                cout << sub(x, y, z) << endl;
            }
        }
        return 0;
    }

Comments

BeyondLimits: tql%%%

Polarnova: 催更

BZOJ 1042 硬币购物

2019 年 2 月 20 日分类:Algorithm#OI#动态规划#算法

BZOJ 1042 硬币购物

QBXT2018TG时候讲的..老早以前写的了....

    /**************************************************************
        Problem: 1042
        User: spinmry
        Language: C++
        Result: Accepted
        Time:128 ms
        Memory:2844 kb
    ****************************************************************/
    
    #include <iostream>
    using namespace std;
    
    //define
    const int maxn=100005;
    long long ans,c[4],d[4],s,f[maxn],g[maxn];
    
    void dfs(int x,int k,long long sum){
        if(sum<0)return;
        if(x==4){
            if(k&1)ans-=f[sum];
            else ans+=f[sum];
            return;
        }
        dfs(x+1,k+1,sum-(d[x]+1)*c[x]);
        dfs(x+1,k,sum);
    }
    
    //main
    int main(){
        ios::sync_with_stdio(false);
        f[0]=1;
        for(int i=0;i<4;i++)
            cin>>c[i];
        for(int k=0;k<4;k++)
            for(int i=c[k];i<=maxn;i++)
                f[i]=f[i]+f[i-c[k]];
        int tot=0;
        cin>>tot;
        while(tot--){
            for(int i=0;i<4;i++)
                cin>>d[i];
            cin>>s;
            ans=0;
            dfs(0,0,s);
            cout<<ans<<endl;
    
        }
        return 0;
    }

BZOJ 3224 普通平衡树

2019 年 2 月 18 日分类:Algorithm#OI#数据结构#平衡树#算法

BZOJ 3224 普通平衡树

splay板子,记录一下

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    //define
    const int maxn=1e5+5;
    
    struct Splay{
        int ch[maxn<<1][2] ,par[maxn<<1] ,cnt[maxn<<1] ,size[maxn<<1] ,val[maxn<<1] ,ntot ,trt;
    
        int chk(int rt){return ch[par[rt]][1] == rt;}
    
        void pushup(int rt){size[rt] = size[ch[rt][0]] + size[ch[rt][1]] + cnt[rt];}
    
        void rotate(int rt){
            int y = par[rt];
            int z = par[y];
            int rnk = chk(rt);
            int w = ch[rt][rnk^1];
            ch[y][rnk] = w; par[w] = y;
            ch[z][chk(y)] = rt;par[rt] = z;
            ch[rt][rnk^1] = y;par[y] = rt;
            pushup(y); pushup(rt);
        }
    
        void splay(int rt,int g = 0){
            while(par[rt] != g){
                int y = par[rt] ,z = par[y];
                if(z != g){
                    if(chk(rt) == chk(y))rotate(y);
                    else rotate(rt);
                }
                rotate(rt);
            }
            if(!g) trt = rt;
        }
    
        void find(int rt){
            if(!trt) return ;
            int cur = trt;
            while(ch[cur][rt > val[cur]] && rt != val[cur]){
                cur = ch[cur][rt > val[cur]];
            }
            splay(cur);
        }
    
        void insert(int rt){
            int cur = trt ,p = 0;
            while(cur && val[cur] != rt){
                p = cur;
                cur = ch[cur][rt > val[cur]];
            }
            if(cur){
                cnt[cur]++;
            }
            else{
                cur = ++ntot;
                if(p) ch[p][rt > val[p]] = cur;
                ch[cur][0] = ch[cur][1] = 0;
                val[cur] = rt;
                par[cur] = p;
                cnt[cur] = size[cur] = 1;
            }
            splay(cur);
        }
    
        int kth(int k){
            int cur = trt;
            while(1){
                if(ch[cur][0] && k <= size[ch[cur][0]]){
                    cur = ch[cur][0];
                }
                else if(k > size[ch[cur][0]] + cnt[cur]){
                    k -= size[ch[cur][0]] + cnt[cur];
                    cur = ch[cur][1];
                }
                else{
                    return cur;
                }
            }
        }
    
        int pre(int rt){
            find(rt);
            if(val[trt] < rt)return trt;
            int cur = ch[trt][0];
            while(ch[cur][1]) cur = ch[cur][1];
            return cur;
        }
    
        int src(int rt){
            find(rt);
            if(val[trt] > rt)return trt;
            int cur = ch[trt][1];
            while(ch[cur][0]) cur = ch[cur][0];
            return cur;
        }
    
        void remove(int rt){
            int last = pre(rt) ,next = src(rt);
            splay(last); splay(next ,last);
            int del = ch[next][0];
            if(cnt[del] > 1){
                cnt[del]--;
                splay(del);
            }
            else ch[next][0] = 0;
        }
    
        int get_rt(){
            return size[ch[trt][0]];
        }
    
        int get_kth(int rt){
            return val[kth(rt+1)];
        }
    
        int get_pre(int rt){
            return val[pre(rt)];
        }
    
        int get_src(int rt){
            return val[src(rt)];
        }
    }tree;
    
    //main
    int main(){
        ios::sync_with_stdio(false);
        int n,op,x;
        cin>>n;
        tree.insert(0x3f3f3f3f);
        tree.insert(0xcfcfcfcf);
        while(n--){
            cin>>op>>x;
            if(op == 1){
                tree.insert(x);
            }
            if(op == 2){
                tree.remove(x);
            }
            if(op == 3){
                tree.find(x);
                cout<<tree.get_rt()<<endl;
            }
            if(op == 4){
                cout<<tree.get_kth(x)<<endl;
            }
            if(op == 5){
                cout<<tree.get_pre(x)<<endl;
            }
            if(op == 6){
                cout<<tree.get_src(x)<<endl;
            }
        }
        return 0;
    }

基于STM32的环境监测器

2019 年 2 月 17 日分类:Hardware#STM32#单片机

基于STM32的环境监测器

0x00 背景&功能描述

研究性学习课题要用到这玩意…于是尝试用stm32捏了一个… 第一次玩stm32,为了方便就直接拿STM32CubeMX生成了这个工程… 芯片为STM32F407GZT6,使用了外部RTC,具体时钟树设置参考CubeMX工程文件。 功能嘛,每隔一段时间获取实时PM2.5,PM10,CO2浓度与环境温湿度,并将其存储入SD卡(FAT32分区)中。同时也会向USART1中打印日志。 USART1-3波特率均为9600,

0x01 硬件部分

温湿度传感器(DHT22/AM2303) -> PA1 *USART1(PA9 PA10) PM2.5(G7 PMS7003) -> USART2(PA3 PA4) CO2(DS-CO2-20) -> USART3(PE14 PE15)

0x02 代码

项目由CubeMX自动生成,以下仅展示部分代码 GitHub项目地址 ps:请忽视逼死强迫症的缩进…就让Keil uvision那个辣鸡的IDE背锅吧

RTC_DateTypeDef sDate;
RTC_TimeTypeDef sTime;
uint8_t second_tmp = 0;

void LED0_off(){HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);}
void LED1_off(){HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);}

void LED0_on(){HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);}
void LED1_on(){HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);}

uint8_t PMSensorBuffer[128];
uint8_t PMSensor[17];
int TOT = 0, PMSensorLen;

//PM Sensor

struct PMSensor{
	int PM1_0_CF, PM2_5_CF, PM10_CF, PM1_0, PM2_5, PM10;
}PMResult;

void ListenPMSensor(){
	memset(PMSensorBuffer, 0, sizeof(PMSensorBuffer));
	memset(PMSensor, 0, sizeof(PMSensor));
	
	HAL_UART_Receive(&huart2, (uint8_t*)PMSensorBuffer, 128, 3200);
	HAL_Delay(800);
	
	//printf("", PMSensorBuffer);
	for(int i = 0; i <= 127; ++i){
		//printf("%c \n", PMSensorBuffer[i]);
		if(PMSensorBuffer[i] == 'B' && PMSensorBuffer[i+1] == 'M'){			
			for(PMSensorLen = 0; PMSensorLen <= 31; ++PMSensorLen){
				PMSensor[PMSensorLen] = PMSensorBuffer[i + PMSensorLen];
			}
			break;
		}
	}
	
	HAL_Delay(2000);
	return ;
}

void GetPMSensor(void){
	uint16_t Buffer_Len;
	Buffer_Len = (uint16_t)((PMSensor[2] << 8) | PMSensor[3]);
	if(Buffer_Len == 28) {
		
		PMResult.PM1_0_CF = (uint16_t)((PMSensor[4]<<8) | PMSensor[5]);
		PMResult.PM2_5_CF = (uint16_t)((PMSensor[6]<<8) | PMSensor[7]);
		PMResult.PM10_CF 	= (uint16_t)((PMSensor[8]<<8) | PMSensor[9]);
		PMResult.PM1_0 	= (uint16_t)((PMSensor[10]<<8) | PMSensor[11]);
		PMResult.PM2_5 	= (uint16_t)((PMSensor[12]<<8) | PMSensor[13]);
		PMResult.PM10 	= (uint16_t)((PMSensor[14]<<8) | PMSensor[15]);		
		
	}
	else if(Buffer_Len == 20){
		
		PMResult.PM1_0_CF = (uint16_t)((PMSensor[4]<<8) | PMSensor[5]);
		PMResult.PM2_5_CF = (uint16_t)((PMSensor[6]<<8) | PMSensor[7]);
		PMResult.PM10_CF 	= (uint16_t)((PMSensor[8]<<8) | PMSensor[9]);
		PMResult.PM1_0 	= (uint16_t)((PMSensor[10]<<8) | PMSensor[11]);
		PMResult.PM2_5 	= (uint16_t)((PMSensor[12]<<8) | PMSensor[13]);
		PMResult.PM10 	= (uint16_t)((PMSensor[14]<<8) | PMSensor[15]);
		
	}
}

int CheckPMSensor(){
	
	uint16_t 	Cal_CheckSum;
	uint16_t 	Buffer_CheckSum;
	uint16_t 	Buffer_Len;
	uint8_t 	i;
	
	int Result = 0;

	if((PMSensor[0] == 'B')&&(PMSensor[1] == 'M')){
		Buffer_Len = (uint16_t)((PMSensor[2] << 8) | PMSensor[3]);

		Buffer_CheckSum = (uint16_t)((PMSensor[Buffer_Len + 2] << 8) | PMSensor[Buffer_Len + 3]);

		Cal_CheckSum = 0;
		for(i=0;i<(Buffer_Len + 2);i++){
			Cal_CheckSum += PMSensor[i];
		}

		if(Cal_CheckSum == Buffer_CheckSum)
			Result = 1;
	}
	return Result;
}


//CO2 sensor
uint8_t CO2SensorBuffer[12];
uint8_t CO2Sensor[12];

int CO2SensorLen = 0, CO2SensorResult = 0;

void ListenCO2Sensor(){
	memset(CO2SensorBuffer, 0, sizeof(CO2SensorBuffer));
	memset(CO2Sensor, 0, sizeof(CO2Sensor));
	
	uint8_t CO2Transmit[12] = {0x42, 0x4D, 0xE3, 0x00, 0x00, 0x01, 0x72};
	
	HAL_UART_Transmit(&huart3, CO2Transmit, 7, 0xFFFF);
	HAL_UART_Receive(&huart3, (uint8_t*)CO2SensorBuffer, 12, 800);
	HAL_Delay(800);
	
	for(int i = 0; i <= 11; ++i){
		//printf("%c", CO2SensorBuffer[i]);
		if(CO2SensorBuffer[i] == 'B' && CO2SensorBuffer[i+1] == 'M'){
			for(CO2SensorLen = 0; CO2SensorLen <= 11; ++CO2SensorLen){	
				CO2Sensor[CO2SensorLen] = CO2SensorBuffer[i + CO2SensorLen];
			}
			break;
		}
		HAL_Delay(500);
	}
	HAL_Delay(2000);
	return ;
}


int CheckCO2Sensor(){
	
	uint16_t 	Cal_CheckSum;
	uint16_t 	Buffer_CheckSum;
	uint16_t 	Buffer_Len;
	uint8_t 	i;
	
	int Result = 0;

	if((CO2Sensor[0] == 'B')&&(CO2Sensor[1] == 'M')){
		
		Buffer_Len = (uint16_t)((CO2Sensor[2] << 8) | CO2Sensor[3]);
		//printf("LEN:%d \n",Buffer_Len);
		Buffer_CheckSum = (uint16_t)((CO2Sensor[Buffer_Len + 2] << 8) | CO2Sensor[Buffer_Len + 3]);
        
		Cal_CheckSum = 0;
		for(i=0;i<(Buffer_Len + 2);i++){
			Cal_CheckSum += CO2Sensor[i];
		}
		//printf("CALSUM:%d, BUFFSUM:%d \n", Cal_CheckSum, Buffer_CheckSum);
		if(Cal_CheckSum == Buffer_CheckSum)
			Result = 1;
	}
	return Result;
}

void GetCO2Sensor(){
	CO2SensorResult = (uint16_t)((CO2Sensor[4]<<8) | CO2Sensor[5]);
	return ;
}

FATFS SDFatFs;
FIL MyFile;

void WriteFile(){
	
	LED0_off();
	LED1_off();
	
	uint32_t byteswritten;
	char nowdate[21];
	sprintf(nowdate, "[20%02d-%02d-%02d %02d:%02d:%02d]\n",
				sDate.Year,
				sDate.Month,
				sDate.Date,
				sTime.Hours,
				sTime.Minutes,
				sTime.Seconds
	);
	char wtext[150] = " ";
	sprintf(wtext, "%sCO2 : _%04d_ ppm\nPM2.5 : _%04d_ ug/m3\nPM10 : _%04d_ ug/m3\n", 
		nowdate,
		CO2SensorResult, 
		PMResult.PM2_5, 
		PMResult.PM10
	);
	char FileName[25] = " ";
	sprintf(FileName, "Sensor_%02d%02d%02d%02d%02d_.txt", 
		sDate.Year,
		sDate.Month,
		sDate.Date,
		sTime.Hours,
		sTime.Minutes
	);
	printf("%s\nFileName:%s\n", wtext, FileName);
	if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) == FR_OK){
		PrintTime();
		printf("[SD_FATFS_STAT] Mount Successful!\n");
		if(f_open(&MyFile, (TCHAR const*)FileName, FA_CREATE_ALWAYS | FA_WRITE) == FR_OK){
			PrintTime();
			printf("[SD_FATFS_STAT] Open File Successful!\n");
			FRESULT res = f_write(&MyFile, wtext, (unsigned int)strlen(wtext), (void *)&byteswritten);
			if((byteswritten == 0) || (res != FR_OK)){
				PrintTime();
				printf("[SD_FATFS_STAT] Write Failed!\n");
			}
			else{
				f_close(&MyFile);
				PrintTime();
				printf("[SD_FATFS_STAT] Write Successful!\n");
			}
		}
		else{
				PrintTime();
				printf("[SD_FATFS_STAT] Open File Failed!\n");
		}
	}else{
		PrintTime();
		printf("[SD_FATFS_STAT] Mount Failed!\n");
	}
	
}

void PrintTime(){
	
	printf("[20%02d-%02d-%02d %02d:%02d:%02d]",
				sDate.Year,
				sDate.Month,
				sDate.Date,
				sTime.Hours,
				sTime.Minutes,
				sTime.Seconds
	);
	return ;
}

void CheckState(){
	
	LED0_on();
	LED1_off();
	
	ListenCO2Sensor();
	if(CheckCO2Sensor()){
		PrintTime();
		printf("[CO2_SENSOR_STATE] Success!\n");
		GetCO2Sensor();
	}
	
	else{
		PrintTime();
		printf("[CO2_SENSOR_STATE] Error!\n");
	}
	
	/*PM SENSOR READ*/
	HAL_Delay(100);
	LED0_on();
	LED0_off();
	ListenPMSensor();
	if(CheckPMSensor()){
		PrintTime();
		printf("[PM_SENSOR_STATE] Success!\n");
		GetPMSensor();
	}
	else{
		PrintTime();
		printf("[PM_SENSOR_STATE] Error!\n");
	}
	
	PrintTime();
	printf("\nCO2: %d ppm \nPM2.5: %d ug/m^3\nPM10: %d ug/m^3\n", CO2SensorResult, PMResult.PM2_5, PMResult.PM10);
	WriteFile();
	//WriteFile(filename);
	HAL_Delay(1000);
	
	return ;
 }

/* USER CODE END 0 */

int main(void){
	
  /* USER CODE BEGIN 1 */
	/* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDIO_SD_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_FATFS_Init();
  MX_RTC_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */
	
  while (1){
    
		/* USER CODE BEGIN 3 */
		
		HAL_Delay(100);
		HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
		if(second_tmp != sTime.Seconds){
			second_tmp = sTime.Seconds;
			//printf("20%d%d-%d%d-%d%d\n", sDate.Year/10%10, sDate.Year%10, sDate.Month/10%10, sDate.Month%10, sDate.Date/10%10, sDate.Date%10);
			printf("[20%02d-%02d-%02d %02d:%02d:%02d] LOOP = %d\n",
				sDate.Year,
				sDate.Month,
				sDate.Date,
				sTime.Hours,
				sTime.Minutes,
				sTime.Seconds,
				TOT
			);
		}
		
		TOT++;
		LED0_on();
		LED1_on();
		
		CheckState();
		
		HAL_Delay(100);

  }
  /* USER CODE END 3 */
}
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Copyright © 2019-2023 spinmry. All rights reserved.
Except where otherwise noted, content on this blog is licensed under CC BY-SA 4.0.