Strange output voltage on TMP36 using attiny85

Hello,

I´m using an ATtiny85 with a 1 MHz clock and an Arduino Uno to program it. I am attempting to use a TMP36 temperature sensor with it. The temp sensor works perfect when connected to the arduino and get a quite steady voltage on 0,720 V(room temperature). But when I use the ATtiny, the output from the temp sensor drops down to a value between 0,2-0,35 V. Somebody who knows what could be wrong?

Sounds like a wiring or programming error to me. Post your code and some photos of your wiring. Did you measure the 0.2 to 0.35V with a multimeter, or are you inferring it from the value read from the ADC?

Here is my code for the ATtiny85:

int motor = 0;      // Sätter pin 12 för motorn
int knapp = 1;       // Sätter pin 2 för strömbrytaren
int val = 0;         // Variabel för läsning av statusen för en pin
int temp = 2;       // Sätter analog pin 0 för temperatursensorn
int t1 = 500;       // Väntetid till matning ett
int t2 = 500;       // Väntetid till matning två
int matning = 500;  // Tid som motor kör
int dygn = 500;     // Väntetid till nästa dygnrunda
int rawAnalogValue;  // Värdet som tempsensorn känner av mellan 0-1023
float volt, degC;    // Sätter två parametrar till flyttal så att man kan få ut decimaler

void setup() {
  pinMode(motor, OUTPUT); // sätter motorn som en output
  pinMode(knapp, INPUT);  // sätter knapp som en input
  // Serial.begin(9600);
}

void loop() {
  rawAnalogValue = analogRead(temp);    // Läser av värdet på tempsensorn
  volt = rawAnalogValue * 5.0 / 1023.0; // Gör om värdet från tempsensorn till en spänning mellan 0-5 V
  degC = (volt - 0.5) * 100.0;          // Får ut temperaturen i celsius
  delay(500);                           // Vänta 0,5 sekunder
  val = digitalRead(knapp);             // Läser av om knappen är hög eller låg
  if (val == HIGH && degC > -20) {      // Om switchen är på och om temperaturen är över -20 grader celsius, så kommer koden nedanför att köra
    delay(t1);                          
    digitalWrite(motor, HIGH);          // Kör igång motorn
    delay(matning);                     
    digitalWrite(motor, LOW);           // Stäng av motorn
    delay(t2);                          
    digitalWrite(motor, HIGH);         
    delay(matning);
    digitalWrite(motor, LOW); 
    delay(dygn);
    }
  else {
    digitalWrite(motor, LOW); 
    delay(5);
  }
}

And this is the code for arduino(works perfect):

int motor = 12;      // Sätter pin 12 för motorn
int knapp = 2;       // Sätter pin 2 för strömbrytaren
int val = 0;         // Variabel för läsning av statusen för en pin
int temp = A0;       // Sätter analog pin 0 för temperatursensorn
int t1 = 5000;       // Väntetid till matning ett
int t2 = 5000;       // Väntetid till matning två
int matning = 5000;  // Tid som motor kör
int dygn = 5000;     // Väntetid till nästa dygnrunda
int rawAnalogValue;  // Värdet som tempsensorn känner av mellan 0-1023
float volt, degC;    // Sätter två parametrar till flyttal så att man kan få ut decimaler

void setup() {
  pinMode(motor, OUTPUT); // sätter motorn som en output
  pinMode(knapp, INPUT);  // sätter knapp som en input
  Serial.begin(9600);
}

void loop() {
  rawAnalogValue = analogRead(temp);    // Läser av värdet på tempsensorn
  volt = rawAnalogValue * 5.0 / 1023.0; // Gör om värdet från tempsensorn till en spänning mellan 0-5 V
  degC = (volt - 0.5) * 100.0;          // Får ut temperaturen i celsius
  
  Serial.print("Raw: ");
  Serial.print(rawAnalogValue);
  Serial.print("   Voltage: ");
  Serial.print(volt);
  Serial.print("V   Deg: ");
  Serial.print(degC);
  Serial.println("C");
  
  delay(500);                           // Vänta 0,5 sekunder
  val = digitalRead(knapp);             // Läser av om knappen är hög eller låg
  if (val == HIGH && degC > -20) {      // Om switchen är på och om temperaturen är över -20 grader celsius, så kommer koden nedanför att köra
    delay(t1);                          
    digitalWrite(motor, HIGH);          // Kör igång motorn
    delay(matning);                     
    digitalWrite(motor, LOW);           // Stäng av motorn
    delay(t2);                          
    digitalWrite(motor, HIGH);         
    delay(matning);
    digitalWrite(motor, LOW); 
    delay(dygn);
    }
  else {
    digitalWrite(motor, LOW); 
    delay(5);
  }
}

I will send some photos of the wiring when i´m in school in about three hour, where I have it. I did measure the voltage with a multimeter between the middle pin on the tmp36(output voltage) and ground.

Thanks for the help!

dc42: Sounds like a wiring or programming error to me. Post your code and some photos of your wiring. Did you measure the 0.2 to 0.35V with a multimeter, or are you inferring it from the value read from the ADC?

Here is my code for the ATtiny85:

int motor = 0;      // Sätter pin 12 för motorn
int knapp = 1;       // Sätter pin 2 för strömbrytaren
int val = 0;         // Variabel för läsning av statusen för en pin
int temp = 2;       // Sätter analog pin 0 för temperatursensorn
int t1 = 500;       // Väntetid till matning ett
int t2 = 500;       // Väntetid till matning två
int matning = 500;  // Tid som motor kör
int dygn = 500;     // Väntetid till nästa dygnrunda
int rawAnalogValue;  // Värdet som tempsensorn känner av mellan 0-1023
float volt, degC;    // Sätter två parametrar till flyttal så att man kan få ut decimaler

void setup() {
  pinMode(motor, OUTPUT); // sätter motorn som en output
  pinMode(knapp, INPUT);  // sätter knapp som en input
  // Serial.begin(9600);
}

void loop() {
  rawAnalogValue = analogRead(temp);    // Läser av värdet på tempsensorn
  volt = rawAnalogValue * 5.0 / 1023.0; // Gör om värdet från tempsensorn till en spänning mellan 0-5 V
  degC = (volt - 0.5) * 100.0;          // Får ut temperaturen i celsius
  delay(500);                           // Vänta 0,5 sekunder
  val = digitalRead(knapp);             // Läser av om knappen är hög eller låg
  if (val == HIGH && degC > -20) {      // Om switchen är på och om temperaturen är över -20 grader celsius, så kommer koden nedanför att köra
    delay(t1);                          
    digitalWrite(motor, HIGH);          // Kör igång motorn
    delay(matning);                     
    digitalWrite(motor, LOW);           // Stäng av motorn
    delay(t2);                          
    digitalWrite(motor, HIGH);         
    delay(matning);
    digitalWrite(motor, LOW); 
    delay(dygn);
    }
  else {
    digitalWrite(motor, LOW); 
    delay(5);
  }
}

And this is the code for arduino(works perfect):

int motor = 12;      // Sätter pin 12 för motorn
int knapp = 2;       // Sätter pin 2 för strömbrytaren
int val = 0;         // Variabel för läsning av statusen för en pin
int temp = A0;       // Sätter analog pin 0 för temperatursensorn
int t1 = 5000;       // Väntetid till matning ett
int t2 = 5000;       // Väntetid till matning två
int matning = 5000;  // Tid som motor kör
int dygn = 5000;     // Väntetid till nästa dygnrunda
int rawAnalogValue;  // Värdet som tempsensorn känner av mellan 0-1023
float volt, degC;    // Sätter två parametrar till flyttal så att man kan få ut decimaler

void setup() {
  pinMode(motor, OUTPUT); // sätter motorn som en output
  pinMode(knapp, INPUT);  // sätter knapp som en input
  Serial.begin(9600);
}

void loop() {
  rawAnalogValue = analogRead(temp);    // Läser av värdet på tempsensorn
  volt = rawAnalogValue * 5.0 / 1023.0; // Gör om värdet från tempsensorn till en spänning mellan 0-5 V
  degC = (volt - 0.5) * 100.0;          // Får ut temperaturen i celsius
  
  Serial.print("Raw: ");
  Serial.print(rawAnalogValue);
  Serial.print("   Voltage: ");
  Serial.print(volt);
  Serial.print("V   Deg: ");
  Serial.print(degC);
  Serial.println("C");
  
  delay(500);                           // Vänta 0,5 sekunder
  val = digitalRead(knapp);             // Läser av om knappen är hög eller låg
  if (val == HIGH && degC > -20) {      // Om switchen är på och om temperaturen är över -20 grader celsius, så kommer koden nedanför att köra
    delay(t1);                          
    digitalWrite(motor, HIGH);          // Kör igång motorn
    delay(matning);                     
    digitalWrite(motor, LOW);           // Stäng av motorn
    delay(t2);                          
    digitalWrite(motor, HIGH);         
    delay(matning);
    digitalWrite(motor, LOW); 
    delay(dygn);
    }
  else {
    digitalWrite(motor, LOW); 
    delay(5);
  }
}

I will send some photos of the wiring when i´m in school in about three hour, where I have it. I did measure the voltage with a multimeter between the middle pin on the tmp36(output voltage) and ground.

Thanks for the help!

Your code looks basically OK to me, except that the constant 1023.0 should be 1024.0, and the style could be improved (e.g. declare your pin numbers and other constants "const int" instead of "int", and don't use global variables where local variables will do). So I think the problem must be in your wiring. Are the other legs of the TMP36 definitely at 0V and +5V? Is the Vcc pin of the ATtiny at +5V?

dc42:
Your code looks basically OK to me, except that the constant 1023.0 should be 1024.0, and the style could be improved (e.g. declare your pin numbers and other constants “const int” instead of “int”, and don’t use global variables where local variables will do). So I think the problem must be in your wiring. Are the other legs of the TMP36 definitely at 0V and +5V? Is the Vcc pin of the ATtiny at +5V?

Okay, I will change this in the code.
Yes, I have +5 V and 0V in ATtiny and tmp36. Here is two pictures of the board:

As you can see, I have 0,187V when I use ATtiny in the circuit.

Thank you!

I can see a couple of things you could improve. The reset pin of the attiny is best tied to the Vcc pin, either directly or via a 10K resistor, to make it less sensitive to noise. You should connect a 0.1uF ceramic capacitor between Vcc and ground, as close to the attiny as possible (easiest way is to put it over thr top of the attiny). However, I don't think either of these accounts for the problem.

If you disconnect the yellow wire between the TMP36 output and the attiny pin, does the TMP36 output recover to the proper value? If so, then the attiny is loading the pin. There could be a few causes of this: - attiny isn't getting +5V - attiny pin has been set to be an output - attiny is faulty

So here are some things to check:

  1. Did you measure +5V right on the attiny Vcc pin?

  2. Are you certain that the attiny really is running that code? How did you program it?

  3. Are you certain that you have the pin mapping right? That is, for the Arduino attiny85 core that you are using, are you sure that analog pin 2 is mapped to physical pin 7 (ADC1) on the attiny, that digital pin 0 is mapped to physical pin 5 (PB0), and that digital pin 1 is mapped to physical pin 6 (PB1)? I can't help you check this, because I don't use Arduino cores on the attiny mcus, I program them in Atmel Studio instead - and I don't know which attiny85 core tou are using (I believe there is more than one).