Skip to content

Instantly share code, notes, and snippets.

@jinfeijie
Last active December 18, 2016 15:57
Show Gist options
  • Save jinfeijie/ea98bb444fc223d29ed4a59e77efe316 to your computer and use it in GitHub Desktop.
Save jinfeijie/ea98bb444fc223d29ed4a59e77efe316 to your computer and use it in GitHub Desktop.
三轴加速传感器,二极管显示器,温度传感器(移动提醒,温度显示 多线程异步操作,不阻塞主进程运行 两个子线程非阻塞demo 传参 与 不传参)[C++多线程操作,pthread_create()创建失败?解决:分析](http://jinfeijie.cn/post-101.html)
//
// 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