|
发表于 2015-2-27 11:56:43
|
显示全部楼层
我正在做一个sim900的 远程控制程序,现在的问题是 如果不加LCD显示,都正常,如果加了LCD 显示,sim900就不能完整的读取收到的信息内容,搞了好久都不能解决,今天看到这个贴子,试着用这个库,把sim900收到信息处理信息做一个线程,lcd显示做一个线程,这个库第一次使用,完全不会,我把代码传上来,大伙帮我看看,求指导!不胜感激!- #include <pt.h>
- #include <SoftwareSerial.h>
- #include <String.h>
- SoftwareSerial mySerial(7, 8);
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27,20,4);
- #include <dht11.h>
- #define DHT11PIN 9
- #include <Wire.h>
- dht11 DHT11;
- int lastSMSnumber = 0;
- String Str="";
- int flag = 0;
- double Fahrenheit(double celsius)
- {
- return 1.8 * celsius + 32;
- } //摄氏温度度转化为华氏温度
-
- double Kelvin(double celsius)
- {
- return celsius + 273.15;
- } //摄氏温度转化为开氏温度
-
- double dewPoint(double celsius, double humidity)
- {
- double A0= 373.15/(273.15 + celsius);
- double SUM = -7.90298 * (A0-1);
- SUM += 5.02808 * log10(A0);
- SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
- SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
- SUM += log10(1013.246);
- double VP = pow(10, SUM-3) * humidity;
- double T = log(VP/0.61078); // temp var
- return (241.88 * T) / (17.558-T);
- }
-
- double dewPointFast(double celsius, double humidity)
- {
- double a = 17.271;
- double b = 237.7;
- double temp = (a * celsius) / (b + celsius) + log(humidity/100);
- double Td = (b * temp) / (a - temp);
- return Td;
-
- }
- static int protothread1(struct pt *pt)
- { PT_BEGIN(pt);
- while(1)
- { PT_WAIT_UNTIL(pt,mySerial.available());
- while(mySerial.available())
- {
- char bb = (char)mySerial.read();
- if((bb != '\r') && (bb != '\n') ) Str += bb;
- delay(2);
- }
- int strLen = Str.length( );
- if(strLen > 0) Serial.println(Str); // 送到 Serial Monitor
- if(strLen > 0)
- {
- if(Str.indexOf("+CMGD")!=-1)
- {
- Str = ""; return;
- }
- if(Str.indexOf("+CMTI")!=-1)
- {
- getSMS( );
- }else {
- processSMS( ); Str="";
- }
- }
- }
- PT_END(pt);
- }
- static int protothread2(struct pt *pt)
- { PT_BEGIN(pt);
- while(1)
- { PT_WAIT_THREAD(pt,protothread1);[color=Red]// 这里我想法是等第一个线程执行完毕,再显示,不知道这样写对不对//[/color]
- LCD();
- }
- PT_END(pt);
- }
- static struct pt pt1, pt2;
- void setup()
- { mySerial.begin(19200); // the GPRS baud rate
- Serial.begin(9600); // USB to Serial Monitor
- Str.reserve(555); // at most 566 char
- pinMode(13, OUTPUT);
- mySerial.print("AT+CMGF=1\r"); // set SMS mode to text
- delay(100);
- lcd.init();
- lcd.backlight();
- int chk = DHT11.read(DHT11PIN);
- PT_INIT(&pt1);
- PT_INIT(&pt2);
-
- }
-
- void loop()
- { protothread1(&pt1); //执行线程1
- protothread2(&pt2);
- delay(1000);
-
-
-
- // .. 其他要做的事
- } // loop(
- void crlf( ) { // 送出 <CR><LF> 給 mySerial
- mySerial.write(13); mySerial.write(10);
- }
- void processSMS( )
- { if( Str.indexOf("#13 on")!=-1 )
- {digitalWrite(13,HIGH);
- deleteSMS(lastSMSnumber); delay(333);
- }
- if( Str.indexOf("#13 off")!=-1 )
- {
- digitalWrite(13, LOW);
- deleteSMS(lastSMSnumber); delay(222);
- }
- if(Str.indexOf("Survey")!=-1)
- { sendSMS();
- deleteSMS(lastSMSnumber); delay(222);
- }//...處理其他情況的短信
- //...
- } //processSMS(
- void deleteSMS(int k)
- { Str = "";
- mySerial.print("AT+CMGD=");
- mySerial.print(k);
- crlf( );
- ///mySerial.println(",0"); // AT+CMGD=38,0 表示刪除第38短信
- delay(138);
- }
- void getSMS( ){
- int cmaPos = Str.indexOf( "," ); // "," 的 position
- int dd =cmaPos + 1;
- String numSMS = Str.substring(dd);
- lastSMSnumber = numSMS.toInt( ); // 短信編號
- Str = ""; // 清除 Str 以收短信 numSMS
- mySerial.print("AT+CMGR=");
- mySerial.print(numSMS);
- crlf( );
- delay(88);
- }//getSMS(
- void sendSMS()
- { mySerial.print("AT+CMGF=1\r"); // AT command to send SMS message
- delay(100);
- mySerial.println("AT+CMGS="+8613905630726""); // 送給 +8613905630758 // recipient's mobile number, in international format
- delay(100);
- mySerial.print("Hum = ");
- mySerial.print((float)DHT11.humidity, 1);
- mySerial.println(" %");
- mySerial.print("Tem = ");
- mySerial.print((float)DHT11.temperature, 1);
- mySerial.println(" oC");
- mySerial.println();
- delay(100);
- mySerial.println((char)26); // End AT command with a ^Z, ASCII code 26
- delay(100);
- mySerial.println();
- }
- void LCD()
- { float hum = (float)DHT11.humidity;
- float tem = (float)DHT11.temperature;
- lcd.setCursor(0,0);
- lcd.print("Hum=");
- lcd.print(hum, 1);
- lcd.print(" %");
- lcd.setCursor(0,1);
- lcd.print("Tem=");
- lcd.print(tem, 1);
- lcd.print(" oC");
- }
复制代码 编译没通过,错误信息如下:
Arduino:1.5.5-r2 (Windows XP), 板:"Arduino Uno"
_5555.ino: In function 'int protothread1(pt*)':
_5555:63: error: return-statement with no value, in function returning 'int'
报告将会包含更多的信息
"Show verbose output during compilation"
在 文件>首选项 中启用
另外请教大神们,想要lcd和sim900都能正常运行,应该用什么思路? |
|