Arduino e workshop4

good morning,
I am making a syringe heater. I have the screen (gen4-ULCD-32DT-AR) connected with Arduino. A thermocouple and a 12V heating element is connected to the Arduino. I power the Arduino with an external 12V jack. initially the screen works, after a few minutes it starts to reset continuously saying “mounting”. I cannot understand the problem. I would like to heat the heating element by giving commands via the screen.
Thanks !


The code:

#include <genieArduino.h> //interact between 4D touch pad and arduino, https://github.com/4dsystems/ViSi-Genie-Arduino-Library
#include <PID_v1.h> //PID control heater, https://github.com/br3ttb/Arduino-PID-Library/
#include <SPI.h>
#include "Adafruit_MAX31855.h" 
#define MAXSS   10
Adafruit_MAX31855 thermocouple(MAXSS);

//Keyboard variables
char keyvalue[10]; // array to hold keyboard values
char keyvalue2[10]; // array to hold keyboard values
int temp; //temporary event variable from keyboard
int counter = 0;
int counter2 = 0;

//Temperature variables
bool RunHeater = 0;
float TempSetPoint = 37; //setpoint temperature (default 37);
int tempPin = 0; //the analog pin the TMP36's Voltage-out pin is connected to
int heaterPin = A5; //the analog pin the TIP 120 transistor is connected to
int x;
unsigned int tempReading = 0;
unsigned long tempReadingTotal = 0;
double Setpoint, Input, Output, temperatureC;

//Define the Tuning Parameters
double Kp = 150, Ki = 1, Kd = 0;

//Specify the links and tuning parameters
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

Genie genie;
#define RESETLINE 4  // Change this if you are not using an Arduino Adaptor Shield Version 2 (see code below)
void setup()
{
  Serial.begin(200000);  // Serial0 @ 200000 (200K) Baud
  genie.Begin(Serial);   // Use Serial0 for talking to the Genie Library, and to the 4D Systems display
  genie.AttachEventHandler(myGenieEventHandler); // Attach the user function Event Handler for processing events

  // Reset the Display (change D4 to D2 if you have original 4D Arduino Adaptor)
  // THIS IS IMPORTANT AND CAN PREVENT OUT OF SYNC ISSUES, SLOW SPEED RESPONSE ETC
  // If NOT using a 4D Arduino Adaptor, digitalWrites must be reversed as Display Reset is Active Low, and
  // the 4D Arduino Adaptors invert this signal so must be Active High.
  pinMode(RESETLINE, OUTPUT);  // Set D4 on Arduino to Output (4D Arduino Adaptor V2 - Display Reset)
  digitalWrite(RESETLINE, 1);  // Reset the Display via D4
  delay(100);
  digitalWrite(RESETLINE, 0);  // unReset the Display via D4

  delay (3500); //let the display start up after the reset (This is important)

  // Set the brightness/Contrast of the Display - (Not needed but illustrates how)
  // Most Displays, 1 = Display ON, 0 = Display OFF. See below for exceptions and for DIABLO16 displays.
  // For uLCD-43, uLCD-220RD, uLCD-70DT, and uLCD-35DT, use 0-15 for Brightness Control, where 0 = Display OFF, though to 15 = Max Brightness ON.
  genie.WriteContrast(15);
  genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0, TempSetPoint * 10); // display default temp set point
  myPID.SetMode(AUTOMATIC); //set up PID mode
  myPID.SetTunings(Kp, Ki, Kd);
}

void loop()
{
  static long waitPeriod = millis();  //initialize waitperiod to do temperature measurement and PID computation

  genie.DoEvents(); // This calls the library each loop to process the queued responses from the display

  //read temperature value and write to LED Digits
  if (millis() >= waitPeriod)
  {
    //genie.WriteObject(GENIE_OBJ_LED_DIGITS, 5, speedvalue);
//    tempReadingTotal = 0;
//    // Read 64 readings
//    for (x = 0; x < 64; x++)
//    {
//      tempReadingTotal += analogRead(tempPin);
//    }
    //Divide by 64
//    tempReading = tempReadingTotal / 64.0;
//    double voltage = tempReading * 5000.0 / 1024.0;
    temperatureC = thermocouple.readCelsius();
    //temperatureC = (voltage - 500.0) / 10.0;
    //write measured value to LED Digits and scope
        genie.WriteObject(GENIE_OBJ_LED_DIGITS, 2, temperatureC*10);
        genie.WriteObject(GENIE_OBJ_LED_DIGITS, 3, temperatureC*10);
        genie.WriteObject(GENIE_OBJ_SCOPE, 0x00, (temperatureC-20)*2);  //scope goes from 0 to 80. However, scale is from 20 to 60.
        genie.WriteObject(GENIE_OBJ_SCOPE, 0x00, (TempSetPoint-20)*2);

    //PID and heater control
    if (RunHeater == true)
    {
      Input = temperatureC;
      Setpoint = TempSetPoint;
      myPID.Compute();
      analogWrite(heaterPin, Output);
      genie.WriteObject(GENIE_OBJ_LED_DIGITS, 4, Output/255*100);
    }
    else
    {
      analogWrite(heaterPin, 0);
      genie.WriteObject(GENIE_OBJ_LED_DIGITS, 4, 0);
    }
    waitPeriod = millis() + 5000; // rerun this code after 5000 ms
  }
}

/////////////////////////////////////////////////////////////////////
//
// This is the user's event handler. It is called by genieDoEvents()
// when the following conditions are true
//
//		The link is in an IDLE state, and
//		There is an event to handle
//
// The event can be either a REPORT_EVENT frame sent asynchronously
// from the display or a REPORT_OBJ frame sent by the display in
// response to a READ_OBJ (genie.ReadObject) request.
//

void myGenieEventHandler(void)
{
  genieFrame Event;
  genie.DequeueEvent(&Event);

  //Filter Events from Keyboard0 (Index = 0) for setting Temperature
  //genie.EventIs usage: genie.EventIs(&Event,GENIE_REPORT_XX,GENIE_OBJ_XX,index of object).
  if (genie.EventIs(&Event, GENIE_REPORT_EVENT, GENIE_OBJ_KEYBOARD, 0))
  {
    temp = genie.GetEventData(&Event);  // Receive the event data from the Keyboard
    if (temp >= 48 && temp <= 57 && counter <= 5)
    {
      keyvalue[counter] = temp;
      genie.WriteStr(1, keyvalue); //prints to String Object
      counter = counter + 1; //increment array
    }
    else if (temp == 110) // . key
    {
      keyvalue[counter] = '.';        // Receive the event data from the keyboard
      genie.WriteStr(1, keyvalue); //prints to String Object
      counter = counter + 1; //increment array
    }
    else if (temp == 8)      // backspace
    {
      counter--;
      keyvalue[counter] = '.';
      genie.WriteStr(1, keyvalue); //prints to String Object
    }
    else if (temp == 13) //enter key = 13
    {
      //genie.WriteStr(0,keyvalue);
      TempSetPoint = atof(keyvalue);
      genie.WriteObject(GENIE_OBJ_FORM, 0x00, 0); //switch back to form 0
      for (int x = 0; x < counter ; x++)
      {
        keyvalue[x] = 0;
      }
      genie.WriteStr(1, keyvalue);
      counter = 0;
    }
    genie.WriteObject(GENIE_OBJ_LED_DIGITS, 0, TempSetPoint * 10);   // Write Keyboard0 value to to LED Digits (temperature set point)
  }

  if (genie.EventIs(&Event, GENIE_REPORT_EVENT, GENIE_OBJ_WINBUTTON, 1)) //back to main WINBUTTON
  {
    genie.WriteObject(GENIE_OBJ_FORM, 0x00, 0); //switch back to form 0
  }

  if (genie.EventIs(&Event, GENIE_REPORT_EVENT, GENIE_OBJ_WINBUTTON, 3)) //back to main WINBUTTON
  {
    genie.WriteObject(GENIE_OBJ_FORM, 0x00, 0); //switch back to form 0

  }

  if (genie.EventIs(&Event, GENIE_REPORT_EVENT, GENIE_OBJ_WINBUTTON, 5)) //back to main WINBUTTON
  {
    genie.WriteObject(GENIE_OBJ_FORM, 0x00, 0); //switch back to form 0
  }

  //Filter Events from 4DButton0 (Index = 0) for starting heater
  if (genie.EventIs(&Event, GENIE_REPORT_EVENT, GENIE_OBJ_4DBUTTON, 0))
  {
    RunHeater = genie.GetEventData(&Event);
    genie.WriteObject(GENIE_OBJ_4DBUTTON, 2, RunHeater);
  }
  if (genie.EventIs(&Event, GENIE_REPORT_EVENT, GENIE_OBJ_4DBUTTON, 2))
  {
    RunHeater = genie.GetEventData(&Event);
    genie.WriteObject(GENIE_OBJ_4DBUTTON, 0, RunHeater);
  }
}

Your topic has been moved here as this forum section is more relevant to the subject than where it was originally posted

Please post your program following the advice given in the link below when posting code

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.