Another peculiarity is the analog inputs. At least the one I have got, has an analog input pullup of 160 -180 Kohm. And I have not been able to make it behave floating like the at328.
Connecting a 100K NTC as in Ramps 1.4, an arduino uno shows the room temperature, around 21 degree C.
The md-328 shows 0 or minus degrees using the same circuit.
A small test program shows the difference between the two mcu's.
Something to consider when using analog input.
#define TIMEINTERVAL 1000 //Draw something every second
#define INPUT_PIN A0
#define THERMISTOR_PIN A0
#define LEDPIN 13
//Comment out to show voltage
//#define READ_TEMPERATURE
long drawingTime;
/***
* steinhart and thermistors
* https://arduinodiy.wordpress.com/2015/11/10/measuring-temperature-with-ntc-the-steinhart-hart-formula/
* _
* vcc --v^v^---+---v\v^-- gnd
* 4.7K | 100K NTC (NOMINAL_RESISTANCE)
* (SERIESRESISTOR) |
* +---||---- gnd
* | 10 microFarad
* v
* vo (A0/THERMISTOR_PIN)
*/
#ifdef READ_TEMPERATURE
float read_temp() {
#define SAMPLES 4
int rawvalue = 0;
for(char i = 0; i < SAMPLES;i++) {
rawvalue += analogRead(THERMISTOR_PIN);
delay(1);
}
rawvalue /=SAMPLES;
Serial.print("Analog read: ");
Serial.println(rawvalue);
#define SERIESRESISTOR 4700.0
#define NOMINAL_RESISTANCE 100000.0
#define NOMINAL_TEMPERATURE 25.0
#define BCOEFFICIENT 3950.0
//Something wrong, short or no connection
if(rawvalue == 0 || rawvalue == 1023)
return 0.0;
float steinhart = SERIESRESISTOR / ((1023.0 / (float)rawvalue) - 1.0) / NOMINAL_RESISTANCE; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
return steinhart;
}
#else
float readVoltage() {
int rawvalue = analogRead(INPUT_PIN);
Serial.print("Analog read: ");
Serial.println(rawvalue);
return ((5.0* (float) rawvalue)/1023.0);
}
#endif
void setup() {
Serial.begin(115200);
while(!Serial);
pinMode(LEDPIN, OUTPUT);
drawingTime = millis() + TIMEINTERVAL;
}
void loop() {
if(millis() > drawingTime ) {
drawingTime += TIMEINTERVAL;
#ifdef READ_TEMPERATURE
int temp = (int)read_temp();
Serial.print("Degrees C: ");
Serial.println(temp);
#else
Serial.print("V: ");
Serial.println(readVoltage());
#endif
digitalWrite(LEDPIN, !digitalRead(LEDPIN));
}
}