本帖最后由 D19TCI 于 2017-9-14 11:12 编辑
昨天弘老大更新了LGT的最新SPI库,解决了SD的问题,现用12位的ADC、K分度的热电偶变送器测量温度、DS1302时钟模块、2004液晶显示屏、SD卡模块做了一个温度的测量及记录仪。
实际效果图:
存储的文件file20.txt
存储文件的内容
有弘老大的软硬件支持,让单片机应用简单化,我们只用集中精力解决应用问题,编程稍加学习就能用。再次感谢弘老大。
把程序贴上,比较乱,供参考 - /*
- 用K分度热电偶作为传感器;
- 用4~20ma的变送器处理信号;
- 通过143欧电阻转换成电压信号后送入MCU的A0端口;
- 用2004液晶显示屏显示所测量的温度值。
- */
- /* 2004液晶显示屏管脚定义
- GND -> OCROBOT_LGT8F328P GND
- VCC -> OCROBOT_LGT8F328P 5V
- SDA -> OCROBOT_LGT8F328P A4
- SCL -> OCROBOT_LGT8F328P A5
- */
- /* DS1302管脚定义
- GND -> OCROBOT_LGT8F328P GND
- VCC -> OCROBOT_LGT8F328P 5V
- RST(DS1302 pin5) -> Arduino D5
- DAT(DS1302 pin6) -> Arduino D6
- CLK(DS1302 pin7) -> Arduino D7
- */
- /* SD卡管脚定义
- GND -> OCROBOT_LGT8F328P GND
- VCC 5v -> OCROBOT_LGT8F328P 5V
- CS -> OCROBOT_LGT8F328P D4
- MOSI -> OCROBOT_LGT8F328P MOSI(D11)
- SCK -> OCROBOT_LGT8F328P SCK (D13)
- MISO -> OCROBOT_LGT8F328P MISO(D12)
- */
- #include <EEPROM.h>
- #include <stdio.h>
- #include <string.h>
- #include <DS1302.h>
- #include <SPI.h> //SD
- #include <SD.h> //SD
- #include <LiquidCrystal_I2C.h>
- #include <Wire.h>
- LiquidCrystal_I2C lcd(0x3F, 20, 4); // set the LCD address to 0x3F for a 20 chars and 4
- int potpin = 0 ; //定义温度信号输入的模拟接口
- int a;
- char buf[20]; //日期变量缓存
- char day[20];
- char tim[10];
- char AA[20];
- char CC[8] = "file";
- char BB[5] = ".txt";
- uint8_t CE_PIN = 5; ///* DS1302接口定义
- uint8_t IO_PIN = 6;
- uint8_t SCLK_PIN = 7;
- /* 创建 DS1302 对象 */
- DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
- File myFile; //SD存储的文件名
- float T1 ;
- int n ;
- int n1 ;
- int temperature ;//定义温度值变量
- float voltage ;
- void setup()
- {
- analogReference (INTERNAL2V048); //定义ADC的基准参考电压为内部2.048V;
- // EEPROM.write(1,0); //文件名序号复位到file1.txt
- a = EEPROM.read(1); //读取上一次文件名序号
- a = a + 1;
- EEPROM.write(1, a); //当前文件名序号写入EEPROM
- snprintf(AA, sizeof(AA), "%s%0d%s", CC, a, BB ); //生成文件名字符串
- rtc.write_protect(false);
- rtc.halt(false);
- lcd.init(); // initialize the lcd
- lcd.backlight();
- if (!SD.begin(4))
- {
- lcd.setCursor(0, 2);
- lcd.print("SD card failed!");
- lcd.setCursor(0, 3);
- lcd.print("file not save:");
- delay(2000);
- return;
- }
- lcd.setCursor(0, 2);
- lcd.print("SD card OK!");
- lcd.setCursor(0, 3);
- lcd.print("file save:");
- lcd.print(AA);
- }
- void loop()
- {
- // lcd.setCursor(0, 0);
- // lcd.print(AA);
- myFile = SD.open(AA, FILE_WRITE); //SD
- for (n1 = 1 ; n1 < 50 ; n1++)
- {
- T1 = 0;
- print_time();
- for (n = 1 ; n < 21 ; n++)
- {
- voltage = analogRead(potpin); //读取模拟接口0 的值,并将其赋给T1
- delay(50);
- T1 = T1 + voltage;
- }
- T1 = T1 / 20 ;
- voltage = 0.5 * T1 ; //2.048内部参考时的换算公式加修正
- temperature = map(voltage, 595.0, 2900.0, -50, 650) ; //4~20ma的电流信号通过143欧姆电阻取样后,送入A7计算后得出当前温度值。
- lcd.setCursor(0, 1);
- lcd.print("Temperature: "); //起到清屏的作用,无明显闪烁现象。
- lcd.setCursor(0, 1);
- lcd.print("Temperature: ");
- lcd.print(temperature);
- lcd.print(" C");
- lcd.setCursor(0, 0);
- lcd.print(buf);
- myFile.print(buf), myFile.print(" Temperature= "), myFile.print(temperature) , myFile.println(" C");
- }
- myFile.close();
- //lcd.clear(); //清屏,用此功能LED屏有闪烁现象
- }
- void print_time()
- {
- /* 从 DS1302 获取当前时间 */
- Time t = rtc.time();
- /* 将星期从数字转换为名称 */
- memset(day, 0, sizeof(day));
- switch (t.day)
- {
- case 1: strcpy(day, "Sunday"); break;
- case 2: strcpy(day, "Monday"); break;
- case 3: strcpy(day, "Tuesday"); break;
- case 4: strcpy(day, "Wednesday"); break;
- case 5: strcpy(day, "Thursday"); break;
- case 6: strcpy(day, "Friday"); break;
- case 7: strcpy(day, "Saturday"); break;
- }
- /* 将日期代码格式化凑成buf等待输出 */
- snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d ", t.yr, t.mon, t.date, t.hr, t.min, t.sec );
- snprintf(CC, sizeof(CC), "%02d%02d", t.mon, t.date );
- }
复制代码 |