Skip to content

Commit

Permalink
v1.16
Browse files Browse the repository at this point in the history
  • Loading branch information
KravitzLab committed Aug 6, 2022
1 parent 74baec7 commit 0ed79a9
Show file tree
Hide file tree
Showing 5 changed files with 313 additions and 14 deletions.
71 changes: 71 additions & 0 deletions examples/3_Beta_Programs/LeftRightSequence/LeftRightSequence.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
Feeding experimentation device 3 (FED3)
Left Right Sequence task
[email protected]
April 2022
This project is released under the terms of the Creative Commons - Attribution - ShareAlike 3.0 license:
human readable: https://creativecommons.org/licenses/by-sa/3.0/
legal wording: https://creativecommons.org/licenses/by-sa/3.0/legalcode
Copyright (c) 2020 Lex Kravitz
*/

#include <FED3.h> //Include the FED3 library
String sketch = "LeftRight"; //Unique identifier text for each sketch
FED3 fed3 (sketch); //Start the FED3 object
bool leftTriggered = false;
unsigned long poketime = 0; //time of poke
byte resetInterval = 60; //How long do they have to poke right (in seconds)?

void setup() {
fed3.begin(); //Setup the FED3 hardware
fed3.disableSleep();
}

void loop() {
fed3.run(); //Call fed.run at least once per loop
leftReset();

if (fed3.PelletCount == 60) resetInterval = 30; // after 40 pellets make left-right reset interval = 9
if (fed3.PelletCount == 120) resetInterval = 10; // after 40 pellets make left-right reset interval = 8
if (fed3.PelletCount == 160) resetInterval = 8; // after 80 pellets make left-right reset interval = 7
if (fed3.PelletCount == 200) resetInterval = 6; // after 120 pellets make left-right reset interval = 6
if (fed3.PelletCount == 240) resetInterval = 5; // after 120 pellets make left-right reset interval = 6
if (fed3.PelletCount == 280) resetInterval = 4; // after 120 pellets make left-right reset interval = 6

//if left poke is triggered
if (fed3.Left) { //If left poke is triggered
Serial.println ("Left");
fed3.BlockPelletCount = millis();
fed3.logLeftPoke(); //Log left poke
leftTriggered = true;
poketime = fed3.unixtime; //update the current time of poke
}

if (fed3.Right and leftTriggered == true) { //If right poke is triggered
Serial.println ("Right_after_left");
fed3.BlockPelletCount = millis();
fed3.logRightPoke(); //Log right poke
fed3.pixelsOn(0, 0, 10, 0);
fed3.Feed(); //Deliver pellet
fed3.BNC(500, 1);
leftTriggered = false;
}

if (fed3.Right and leftTriggered == false) { //If right poke is triggered
Serial.println ("Right_no_left");
fed3.BlockPelletCount = millis();
fed3.logRightPoke(); //Log right poke
}
}

void leftReset() {
if ((fed3.unixtime - poketime >= resetInterval) and leftTriggered == true) { //if the reset interval has elapsed since last poke
Serial.print (resetInterval);
Serial.println ("s, LeftTriggered RESET");
leftTriggered = false;
fed3.BlockPelletCount = millis();
fed3.Event = "RESET";
fed3.logdata();
}
}
147 changes: 147 additions & 0 deletions examples/3_Beta_Programs/LeftRightStopSignal/LeftRightStopSignal.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/*
Feeding experimentation device 3 (FED3)
Left Right sequence - Stop signal task - first train mice on the Left-Right Sequence task
[email protected]
April 2022
This project is released under the terms of the Creative Commons - Attribution - ShareAlike 3.0 license:
human readable: https://creativecommons.org/licenses/by-sa/3.0/
legal wording: https://creativecommons.org/licenses/by-sa/3.0/legalcode
Copyright (c) 2020 Lex Kravitz
*/

#include <FED3.h> //Include the FED3 library
String sketch = "StopSig"; //Unique identifier text for each sketch
FED3 fed3 (sketch); //Start the FED3 object

//Poke variables
bool leftTriggered = false;
unsigned long poketime = 0; //time of left poke
byte resetInterval = 4;

//stop sig variables
bool stopTrial = false;
int stopSigTime = 0;
byte stopProb = 30;
byte consecutiveRegulars = 0;

void setup() {
randomSeed(analogRead(0));
fed3.begin(); //Setup the FED3 hardware
fed3.disableSleep(); //Disable sleep so we can use millis() and Serial.print statements
}

void loop() {
fed3.run(); //Call fed.run at least once per loop

/////////////////////////////////
//Right poke without left
/////////////////////////////////
if (fed3.Right and leftTriggered == false) { //If right poke is triggered
fed3.RightCount ++;
fed3.Click();
Serial.println ("Right_no_left");
fed3.Event = "Right_no_left";
fed3.logdata();
fed3.BlockPelletCount = millis();
fed3.Right = false;
}

/////////////////////////////////
//if left poke is triggered
/////////////////////////////////
if (fed3.Left and leftTriggered == false) { //If left poke is triggered
fed3.LeftCount ++;
Serial.println ("Left");
fed3.Click();
fed3.BlockPelletCount = millis();
leftTriggered = true;
fed3.run();
poketime = fed3.unixtime; //update the current time of poke

// Is it a stop trial?
if ((random (0, 10) < (stopProb / 10)) or consecutiveRegulars > 4) {
Serial.println ("Stop signal!");
stopSigTime = fed3.unixtime;
delay (500);
fed3.Tone (6000, 3000);
stopTrial = true;
fed3.Event = ">Left_Stop_trial";
consecutiveRegulars = 0;
}

//if it is NOT a stop trial
else {
Serial.println ("Regular_trial");
stopTrial = false;
fed3.Event = ">Left_Regular_trial";
consecutiveRegulars ++;
}

Serial.print ("Consecutive regular trials: ");
Serial.println(consecutiveRegulars);
fed3.logdata();
fed3.Left = false;
}

/////////////////////////////////
//no stop signal - right poke delivers pellet
/////////////////////////////////
if (fed3.Right and leftTriggered == true and stopTrial == false) { //If right poke is triggered
fed3.RightCount ++;
fed3.Click();
fed3.BlockPelletCount = millis();
Serial.println ("Right_Regular_(correct)");
fed3.Event = "Right_Regular_(correct)";
fed3.logdata();
fed3.Feed(); //Deliver pellet
//fed3.BNC(500, 1);
leftTriggered = false;
fed3.Right = false;
}

/////////////////////////////////
//stop signal trial - right poke enters timeout
/////////////////////////////////
if (fed3.Right and leftTriggered == true and stopTrial == true) { //If right poke is triggered
fed3.RightCount ++;
fed3.Click();
Serial.println ("Right_STOP_SIGNAL");
fed3.BlockPelletCount = millis();
fed3.Event = "Right_STOP_(incorrect)";
fed3.logdata();
fed3.Noise(2000);
fed3.pixelsOn(2, 2, 2, 2);
fed3.Timeout(30);
fed3.pixelsOff();
leftTriggered = false;
fed3.Right = false;
}

/////////////////////////////////
//stop signal trial - withholding right poke delivers pellet!
/////////////////////////////////
if ((fed3.unixtime - poketime >= resetInterval) and leftTriggered == true and stopTrial == true) { //If right poke is triggered
Serial.println ("Withheld poking, get pellet!");
fed3.Event = "NoPoke_STOP_(correct)";
fed3.BlockPelletCount = millis();
fed3.logdata();
fed3.Feed(); //Deliver pellet
//fed3.BNC(500, 1);
leftTriggered = false;
}

/////////////////////////////////
// If it is a regular trial but he does NOT poke on right, reset and give timeout
/////////////////////////////////
if ((fed3.unixtime - poketime >= resetInterval) and leftTriggered == true and stopTrial == false) { //if the reset interval has elapsed since last poke
Serial.println ("No_poke, left poke reset");
leftTriggered = false;
fed3.BlockPelletCount = millis();
fed3.Event = "NoPoke_Regular_(incorrect)";
fed3.logdata();
fed3.Left = false;
fed3.Right = false;
fed3.Timeout(30);
}
}
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=FED3
version=1.14.1
version=1.16.0
author=Lex Kravitz
maintainer=Lex Kravitz <[email protected]>
depends=Adafruit BusIO, Adafruit GFX Library, Adafruit NeoPixel, Adafruit SHARP Memory Display, Adafruit Unified Sensor, Arduino Low Power, RTClib, RTCZero, SdFat - Adafruit Fork, Adafruit AHTX0, Adafruit SH110X
Expand Down
Loading

0 comments on commit 0ed79a9

Please sign in to comment.