Jp3141
Well-known member
I don't have time to debug this (it's in a running system), but my code compiles OK in each beta release (using a Mac). The DS1631 appears to work correctly on beta 10, but reports a temperature of 0 on beta 12 - same as if the I2C bus wasn't working.
I saw some discussion about pullups -- I don't have any on this.#include <stdio.h>
I saw some discussion about pullups -- I don't have any on this.#include <stdio.h>
Code:
#include <Wire.h>
#define FLASH(n) {digitalWrite(LEDpin, HIGH); delay(1); digitalWrite(LEDpin, LOW); delay(n); }
// SCL on pin 19
// SDA on pin 18
#define DS1631_ADDR 0b1001111 // A0, A1, A2 ==> VDD
#define DS1631_StartConvertT 0x51
#define DS1631_StopConvertT 0x22
#define DS1631_ReadTemperature 0xAA
#define DS1631_AccessConfig 0xAC
#define DS1631_SoftwarePOR 0x54
#define RTCget() Teensy3Clock.get()
//#define RTCget() (millis()/1000+RTCoffset)
#define RTCset(t) Teensy3Clock.set(t)
//#define RTCset(t) RTCoffset=(t-millis()/1000) // can't reset millis().
#define LEDpin 13
#define CdSpin 23
long int iRollingCounter = 1L;
int TemperatureData;
float TemperatureC;
char CRLF[2]={'\0', '\0'}; // Prepare null-terminated string
byte lineindex=0;
int SetD, SetH, SetM, SetS;
int Set6Y=2012, Set6Month=1, Set6D=1, Set6H=0, Set6M=0, Set6S=0;
char *Month[]={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
char *DOW[]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
int MonthL[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int iLeapDay=0;
//elapsedMillis milli_s_timer; //seems to initialize at 0
int DateMode=1; // 0 ==> D, H:M:S; 1 ==> Year, Month, Date, H:M:S
int iLastTime=0;
long RTCoffset=0L;
char DataLine[82], InputLine[82];
int ADC;
float R_CdS, fLogLight;
#define ADC_MAX (1<<16)
#define R_PULLUP 39.e3 // 39 kohm
#define ADC_Full 100 // Full sunlight reading ~ 60 ohm
// SETUP
void setup(){
// Setup Serial connection
Serial.begin(9600);
pinMode(LEDpin, OUTPUT); digitalWrite(LEDpin, HIGH);
pinMode(CdSpin, INPUT); // use external 39k pullup
analogReference(DEFAULT);
analogReadRes(16);
pinMode(0, OUTPUT); // for scope triggering
// pinMode(14, INPUT_PULLUP); digitalWrite(14, HIGH);
// pinMode(15, INPUT_PULLUP); digitalWrite(15, HIGH); // Act as pullups for I2C pins
// Wait for Arduino Serial Monitor to open
int i = 0;
while (!Serial && (i++ < 10*6)) { // or ~ 10 seconds
digitalWrite(LEDpin, HIGH); delay(50); digitalWrite(LEDpin, LOW); delay(50); }
Serial.println(
"# --------------------------\n"
"# DS1631 Temperature Logger\n"
"# Dec 19, 2012\n"
"# --------------------------");
Wire.begin(); // join I2C bus
Wire.beginTransmission(DS1631_ADDR); Wire.write(DS1631_SoftwarePOR); Wire.endTransmission();
Wire.beginTransmission(DS1631_ADDR);
Wire.write(DS1631_AccessConfig);
Wire.write(0x0D); // One-shot conversion & 12 bits resolution
Wire.endTransmission();
RTCset(3600*24+1); // Gnuplot likes to plot from day #1
}
// Main Loop
void loop(){
digitalWriteFast(0, HIGH); // Trigger scope
// START conversion to get T°
Wire.beginTransmission(DS1631_ADDR); Wire.write(DS1631_StartConvertT); Wire.endTransmission();
delay(900); //conversion takes ~ 750 ms
/* do {
Wire.beginTransmission(DS1631_ADDR); Wire.write(DS1631_AccessConfig); Wire.endTransmission();
Wire.requestFrom(DS1631_ADDR, 1); //Read 1 byte
} while (!(Wire.read() & 0x80)); // Loop until conversion completed. Takes ~ 750 ms on DS1631
*/
//READ T°
Wire.beginTransmission(DS1631_ADDR); Wire.write(DS1631_ReadTemperature); Wire.endTransmission();
digitalWrite(0, LOW);
Wire.requestFrom(DS1631_ADDR, 2); // Read 2 bytes
// int8_t xx= Wire.read();
// Serial.print(xx);Serial.print(" ");
// int yy = xx * 256;
// Serial.print(yy);Serial.print(" ");
TemperatureData = ((int8_t) Wire.read()) * 256; // Does this work correctly with negative values ?
// xx= Wire.read();
// TemperatureData |= xx;
// Serial.print(xx); Serial.print("--");
TemperatureData |= Wire.read();
TemperatureC = TemperatureData/256.;
//sprintf(DataLine, "%8li: %+7.2f deg. C\n", iRollingCounter++, TemperatureData/256.);
// Wait for next 1 s interval before restart
digitalWrite(LEDpin, HIGH); delay(20); digitalWrite(LEDpin, LOW);
do {} while (RTCget()==iLastTime);
iLastTime = RTCget(); // The data printed is 1 s off
if (iLastTime % (3600*24)==0) {
// RTCset(iLastTime+3600*24-5); // 5 s short of a day
Set6D++;
iLeapDay = (isLeapYear(Set6Y) && Set6Month==2) ? 1 : 0;
if (Set6D > (MonthL[Set6Month-1]+iLeapDay)){
Set6D=1; Set6Month++;
if (Set6Month==13) {Set6Month=1; Set6Y++;}
}
}
// Read CdS photoresistor and convert to log2(lightlevel w.r.t. full sunlight)
ADC=analogRead(CdSpin);
R_CdS = R_PULLUP*ADC/(1+ADC_MAX-ADC); // 1+ so no div. 0
#define R_CdS_Full (R_PULLUP*ADC_Full/(1+ADC_MAX-ADC_Full))
fLogLight = -log10(R_CdS/R_CdS_Full)/log10(2); // 0 ==> Full sunlight, log base 2
//temperatureC = (TemperatureADC*TemperatureScale)/nLoops + TemperatureOffset;
if (DateMode==0) sprintf(DataLine, "%4i %2d:%02d:%02d DS1631 # %9ld = %+7.2f deg.C; Illumination = %+6.2f%s\n", \
iLastTime/(24*3600), (iLastTime/3600) % 24, (iLastTime/60) % 60, iLastTime % 60, iRollingCounter++, TemperatureC, fLogLight, CRLF);
else sprintf(DataLine, "%4i %2d %2d %3s %3s %2i %2d:%02d:%02d DS1631 # %9ld = %+7.2f deg.C; Illumination = %+6.2f%s\n", \
Set6Y, Set6Month, Set6D, DOW[dayofweek(Set6Y, Set6Month, Set6D)], Month[Set6Month-1], Set6D, (iLastTime/3600) % 24, (iLastTime/60) % 60, iLastTime % 60, iRollingCounter++, TemperatureC, fLogLight, CRLF);
Serial.write(DataLine);
// D(iLastTime)
while (Serial.available() && (lineindex < sizeof(InputLine))) {
InputLine[lineindex] = Serial.read();
if (InputLine[lineindex]=='R') DateMode=1;
if (InputLine[lineindex]=='X') _reboot_Teensyduino_();
if (InputLine[lineindex]=='D') DateMode=0;
if (InputLine[lineindex]=='r') CRLF[0]='\r'; // [1] is '\0'
if (InputLine[lineindex]=='n') CRLF[0]='\0'; // append or not a CRLF or just LF
if (InputLine[lineindex]=='\n') { // if there is a whole line in the buffer
// only process this code if there is a line
InputLine[lineindex] = '\0'; // Mark as end of a string
if (DateMode==0 && sscanf(InputLine, "%d %d %d %d", &SetD, &SetH, &SetM, &SetS)==4) { // only accept 4 numbers
if (SetD < 0) { Serial.println(((String) "# Date set.").concat(CRLF)); SetD = -SetD; }
RTCset(SetS+60L*(SetM+60L*(SetH+24L*SetD))); }
if (DateMode==1 && sscanf(InputLine, "%d %d %d %d %d %d", &Set6Y, &Set6Month, &Set6D, &Set6H, &Set6M, &Set6S)==6) { // only accept 6 numbers
if (Set6Y < 0) { Serial.println(((String) "# Calendar date set.").concat(CRLF)); Set6Y = -Set6Y; }
RTCset(Set6S+60L*(Set6M+60L*(Set6H+24L*Set6D))); } // Is Set6D important ?
lineindex=0; } else lineindex++; // Note InputLine[0] is not reset
} // while
}
int dayofweek(int y, int m, int d) { /* 0 = Sunday */
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;}
long int daynumber(int y, int m, int d) {
m = (m + 9) % 12;
y = y - m/10;
return 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + (d - 1);}
int isLeapYear(int year) {
return ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));}