Hey guys I'm working on my first arduino project, a PID controller. I'm still working on the user input section of the code so right now I'm just defining a set temp and trying to get the heater to hold at that temp (100*C). My code compiles but the heater never turns on, i checked the digital pin driving the relay and it's outputting a voltage but the SSR never comes on.
Initially I read that relays need a higher current than what the arduino can output but the datasheet for my Fotek SSR-25DA says the trigger current is 7.5mA/12v, i tested the trigger load on the relay at 5v to be close to 5mA (I'm also confused why the current attenuates with lower driving voltages, I would think it would follow V=IR). Since the arduino can put out 40mA? shouldn't this be working or do I still need an NPN transistor (i was thinking a 2n2222).
For wiring it just D6 to the + on relay and - to ground, I even tested a new sketch just to turn the relay on without any PID control and was unable to. If i take a 5v 1A power supply right to the relay it turns on fine. Again measuring D6 shows that it is outputting something. It sounds like I need more current but according to the datasheets I should be ok?
/***************************************************
This is an example for the Adafruit Thermocouple Sensor w/MAX31855K
Designed specifically to work with the Adafruit Thermocouple Sensor
----> https://www.adafruit.com/products/269
These displays use SPI to communicate, 3 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
#include "Adafruit_MAX31855.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PID_v1.h>
// set replay pin for PID
#define RelayPin 6
double Setpoint, Input, Output;
int thermoCLK = 5;
int thermoCS = 4;
int thermoDO = 3;
//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);
int WindowSize = 5000;
unsigned long windowStartTime;
// Initialize the Thermocouple
Adafruit_MAX31855 thermocouple(thermoCLK, thermoCS, thermoDO);
// initialize the library and set the LCD address to 0x27 for a 16x2 line display
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
Serial.begin(9600);
windowStartTime = millis();
// inital setpoint before implementing control
Setpoint = 100;
//tell the PID to range between 0 and the full window size
myPID.SetOutputLimits(0, WindowSize);
//turn the PID on
myPID.SetMode(AUTOMATIC);
// set up the LCD's number of columns and rows:
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.print("MAX31855 test");
// wait for MAX chip to stabilize
delay(500);
}
void loop() {
Input = thermocouple.readCelsius();
myPID.Compute();
/************************************************
* turn the output pin on/off based on pid output
************************************************/
if(millis() - windowStartTime>WindowSize)
{ //time to shift the Relay Window
windowStartTime += WindowSize;
}
if(Output < millis() - windowStartTime) digitalWrite(RelayPin,HIGH);
else digitalWrite(RelayPin,LOW);
// basic readout test, just print the current temp
lcd.setCursor(0, 0);
lcd.print("Set Temp = ");
lcd.println(Setpoint);
lcd.print(" ");
lcd.setCursor(0, 1);
if (isnan(Input))
{
lcd.print("T/C Problem");
}
else
{
lcd.print("C = ");
lcd.print(Input);
lcd.print(" ");
}
delay(100);
}