Last active
December 18, 2016 15:57
-
-
Save jinfeijie/ea98bb444fc223d29ed4a59e77efe316 to your computer and use it in GitHub Desktop.
三轴加速传感器,二极管显示器,温度传感器(移动提醒,温度显示 多线程异步操作,不阻塞主进程运行 两个子线程非阻塞demo 传参 与 不传参)[C++多线程操作,pthread_create()创建失败?解决:分析](http://jinfeijie.cn/post-101.html)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Cup.cpp | |
// CPP | |
// | |
// Created by Mr.Sin on 16/12/18. | |
// Copyright © 2016年 Mr.Sin. All rights reserved. | |
// | |
#include <core.h> | |
#include <iostream> | |
#include <math.h> | |
#include <pthread.h> | |
using namespace std; | |
pthread_t thread; | |
pthread_attr_t attr; | |
const int adc_id = A5; | |
const int xpin = A0; // x-axis | |
const int ypin = A1; // y-axis | |
const int zpin = A2; // z-axis | |
const int A = 0; | |
const int B = 1; | |
const int C = 2; | |
const int D = 3; | |
const int E = 4; | |
const int F = 5; | |
const int G = 6; | |
const int DP = 7; | |
const int First_num = 8; | |
const int Second_num= 9; | |
int led_gate = true; // LED灯异步锁 防止灯管乱闪 | |
int wendu_gate = true; // 温度显示异步锁 | |
int HistoryValue = 0; | |
int x_num; | |
int y_num; | |
int z_num; | |
int count; | |
int ledaaaa = 0; | |
const String XHEADER = "X: "; | |
const String YHEADER = "Y: "; | |
const String ZHEADER = "Z: "; | |
const String TAB = "\t"; | |
//初始化0~7管脚 | |
void INIT(){ | |
int i=0; | |
for(i;i<=9;i++){ | |
digitalWrite(i, HIGH); | |
} | |
} | |
void first_close_all(){ | |
int i=0; | |
for(i;i<=7;i++){ | |
digitalWrite(i, HIGH); | |
} | |
} | |
void second_close_all(){ | |
int i=0; | |
for(i;i<=7;i++){ | |
digitalWrite(i, LOW); | |
} | |
} | |
//数字1 | |
void num_one(){ | |
digitalWrite(B, LOW); | |
digitalWrite(C, LOW); | |
} | |
//数字2 | |
void num_two(){ | |
digitalWrite(A, LOW); | |
digitalWrite(B, LOW); | |
digitalWrite(G, LOW); | |
digitalWrite(E, LOW); | |
digitalWrite(D, LOW); | |
} | |
//数字3 | |
void num_three(){ | |
digitalWrite(A, LOW); | |
digitalWrite(B, LOW); | |
digitalWrite(G, LOW); | |
digitalWrite(C, LOW); | |
digitalWrite(D, LOW); | |
} | |
//数字4 | |
void num_four(){ | |
digitalWrite(F, LOW); | |
digitalWrite(G, LOW); | |
digitalWrite(B, LOW); | |
digitalWrite(C, LOW); | |
} | |
//数字5 | |
void num_five(){ | |
digitalWrite(A, LOW); | |
digitalWrite(F, LOW); | |
digitalWrite(G, LOW); | |
digitalWrite(C, LOW); | |
digitalWrite(D, LOW); | |
} | |
//数字6 | |
void num_six(){ | |
digitalWrite(A, LOW); | |
digitalWrite(F, LOW); | |
digitalWrite(E, LOW); | |
digitalWrite(D, LOW); | |
digitalWrite(C, LOW); | |
digitalWrite(G, LOW); | |
} | |
//数字7 | |
void num_seven(){ | |
digitalWrite(A, LOW); | |
digitalWrite(B, LOW); | |
digitalWrite(C, LOW); | |
} | |
//数字8 | |
void num_eight(){ | |
digitalWrite(A, LOW); | |
digitalWrite(B, LOW); | |
digitalWrite(C, LOW); | |
digitalWrite(D, LOW); | |
digitalWrite(E, LOW); | |
digitalWrite(F, LOW); | |
digitalWrite(G, LOW); | |
} | |
//数字9 | |
void num_nine(){ | |
digitalWrite(G, LOW); | |
digitalWrite(F, LOW); | |
digitalWrite(A, LOW); | |
digitalWrite(B, LOW); | |
digitalWrite(C, LOW); | |
digitalWrite(D, LOW); | |
} | |
//数字0 | |
void num_zero(){ | |
int i=0; | |
for(i;i<=5;i++){ | |
digitalWrite(i, LOW); | |
} | |
} | |
// 显示数字 | |
void display_first(int num){ | |
INIT(); | |
digitalWrite(First_num, HIGH); | |
digitalWrite(Second_num, LOW); | |
switch(num){ | |
case 1:num_one();break; | |
case 2:num_two();break; | |
case 3:num_three();break; | |
case 4:num_four();break; | |
case 5:num_five();break; | |
case 6:num_six();break; | |
case 7:num_seven();break; | |
case 8:num_eight();break; | |
case 9:num_nine();break; | |
default:num_zero();break; | |
} | |
delay(1); | |
} | |
void display_second(int num){ | |
INIT(); | |
digitalWrite(First_num, LOW); | |
digitalWrite(Second_num, HIGH); | |
switch(num){ | |
case 1:num_one();break; | |
case 2:num_two();break; | |
case 3:num_three();break; | |
case 4:num_four();break; | |
case 5:num_five();break; | |
case 6:num_six();break; | |
case 7:num_seven();break; | |
case 8:num_eight();break; | |
case 9:num_nine();break; | |
default:num_zero();break; | |
} | |
delay(1); | |
} | |
// LED 显示 异步 | |
void *led(void *arg){ | |
if(led_gate){ | |
led_gate = false; | |
digitalWrite(12,HIGH); | |
digitalWrite(13,LOW); | |
delay(50); | |
digitalWrite(12,LOW); | |
digitalWrite(13,LOW); | |
led_gate = true; | |
} | |
return ((void *)0); | |
} | |
// 温度显示 异步 | |
void *display_temperature(void *arg) | |
{ | |
if(wendu_gate){ | |
wendu_gate = false; | |
int i; | |
int temperature = *(int *)arg; | |
if(temperature > 0 && temperature < 10){ | |
for(i = 0;i<30;i++){ | |
display_second(temperature); | |
delay(49); | |
} | |
}else if (temperature >=10 && temperature < 100){ | |
int temperature_one = temperature / 10; | |
int temperature_two = temperature % 10; | |
for(i = 0;i<750;i++){ | |
display_second(temperature_two); | |
display_first(temperature_one); | |
} | |
} | |
for(i = 0 ;i < 10 ; i++){ | |
digitalWrite(i, LOW); | |
} | |
wendu_gate = true; | |
} | |
return ((void *)0); | |
} | |
void xyz(int temperature) | |
{ | |
int tem_x,tem_y,tem_z; | |
tem_x = analogRead(xpin); | |
tem_y = analogRead(ypin); | |
tem_z = analogRead(zpin)/100; | |
printf("tem_x:%d\n",tem_x); | |
printf("tem_y:%d\n",tem_y); | |
printf("tem_z:%d\n",tem_z); | |
if(abs(x_num - tem_x) > 3 || abs(y_num - tem_y) > 3 || abs(z_num - tem_z) > 3){ | |
pthread_attr_init(&attr); | |
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); | |
pthread_create(&thread, &attr, led, NULL); | |
pthread_create(&thread, &attr, display_temperature, &temperature); | |
pthread_attr_destroy(&attr); | |
} | |
count++; | |
printf("%d\n",count); | |
printf("X : %d \n",x_num); | |
printf("Y : %d \n",y_num); | |
printf("Z : %d \n",z_num); | |
x_num = tem_x; | |
y_num = tem_y; | |
z_num = tem_z; | |
} | |
void setup() | |
{ | |
int i=0; | |
for(i;i<=9;i++){ | |
pinMode(i,OUTPUT); | |
} | |
pinMode(12,OUTPUT); | |
pinMode(13,OUTPUT); | |
//设置波特率 | |
x_num = analogRead(xpin); | |
y_num = analogRead(ypin); | |
z_num = analogRead(zpin)/100; | |
printf("X : %d \n",x_num); | |
printf("Y : %d \n",y_num); | |
printf("Z : %d \n",z_num); | |
count = 0; | |
} | |
void loop() | |
{ | |
int value; | |
float voltage; | |
float temperature; | |
float ftemperature; | |
value = analogRead(adc_id); // get adc value | |
HistoryValue = value; | |
// 将读数转换为电压,3.3v arduino使用3.3 | |
voltage = value * 3.3; | |
voltage /= 4096.0; | |
// 现在输出温度 | |
temperature = (voltage - 0.5) * 100 ; //从每度10 mv转换为500 mV偏移 | |
//to degrees ((volatge - 500mV) times 100) | |
cout << "温度------------------"<< endl; | |
printf("%f degrees C\n", temperature); | |
// 现在转换为华氏 | |
ftemperature = (temperature * 9.0 / 5.0) + 32.0; | |
printf("%f degrees F\n", ftemperature); | |
cout << "温度------------------"<< endl; | |
xyz(temperature/1); | |
//delay(300); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment