-
Notifications
You must be signed in to change notification settings - Fork 19
MenuExample
Kravitz Lab edited this page Aug 8, 2025
·
1 revision
Description of the MenuExample program. Fill this in based on experimental purpose.
- List key behavioral features.
- Timeout? Reinforcement schedule? LED/tone cues?
// Add key snippet(s) here. Example:
fed3.run(); // Runs background updates
fed3.Feed(); // Dispenses a pellet- Upload this sketch to your FED3 using Arduino IDE.
- Observe behavior and log file output.
- Modify variables as needed for your experiment.
- Logs pellet events, poke activity, timeouts, and more depending on sketch.
/*
Feeding experimentation device 3 (FED3)
This script demonstrates how to write a menu system so you can access multiple programs from the FED3 startup screen. You will scroll through programs by assigning them to "modes".
In this example, we run four modes:
// FEDmodes:
// 0 Free feeding
// 1 FR1
// 2 Progressive Ratio
// 3 Timed free feeding
alexxai@wustl.edu
December, 2020
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 = "Menu"; //Unique identifier text for each sketch
FED3 fed3 (sketch); //Start the FED3 object
//variables for PR tasks
//(you can set and use any variables you want for your custom tasks)
int poke_num = 0; // this variable is the number of pokes since last pellet
int pokes_required = 1; // increase the number of pokes required each time a pellet is received using an exponential equation
void setup() {
fed3.FED3Menu = true; //Activate the menu function at startup
fed3.begin(); //Setup the FED3 hardware
}
void loop() {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Mode 1: Free feeding
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (fed3.FEDmode == 0) {
fed3.sessiontype = "Free_feed"; //The text in "sessiontype" will appear on the screen and in the logfile
fed3.DisplayPokes = false; //Turn off poke indicators for free feeding mode
fed3.UpdateDisplay(); //Update display for free feeding session to remove poke displayt (they are on by default)
fed3.Feed();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modes 2: Fixed Ratio 1
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (fed3.FEDmode == 1) {
fed3.sessiontype = "FR1"; //The text in "sessiontype" will appear on the screen and in the logfile
if (fed3.Left) {
fed3.logLeftPoke(); //Log left poke
if (fed3.LeftCount % fed3.FR == 0) { //if fixed ratio is met
fed3.ConditionedStimulus(); //deliver conditioned stimulus (tone and lights)
fed3.Feed(); //deliver pellet
}
}
if (fed3.Right) { //If right poke is triggered
fed3.logRightPoke();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Mode 3: Progressive Ratio
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (fed3.FEDmode == 2) {
fed3.sessiontype = "ProgRatio"; //The text in "sessiontype" will appear on the screen and in the logfile
if (fed3.Left) { //If left poke is triggered and pellet is not in the well
fed3.logLeftPoke(); //Log left poke
fed3.Click(); //Click
poke_num++; //store this new poke number as current poke number.
if (poke_num == pokes_required) { //check to see if the mouse has acheived the correct number of pokes in order to receive the pellet
fed3.ConditionedStimulus(); //Deliver conditioned stimulus (tone and lights)
fed3.Feed(); //Deliver pellet
pokes_required = round((5 * exp((fed3.PelletCount + 1) * 0.2)) - 5); //increment the number of pokes required according to the progressive ratio:
fed3.FR = pokes_required;
poke_num = 0; //reset poke_num back to 0 for the next trial
}
}
if (fed3.Right) { //If right poke is triggered and pellet is not in the well
fed3.logRightPoke();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Mode 4: Timed Feeding
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (fed3.FEDmode == 3) {
fed3.sessiontype = "Timed"; //The text in "sessiontype" will appear on the screen and in the logfile
fed3.DisplayPokes = false; //Turn off poke indicators for free feeding mode
fed3.DisplayTimed = true; //Display timed feeding info
fed3.UpdateDisplay();
if (fed3.currentHour >= fed3.timedStart && fed3.currentHour < fed3.timedEnd) {
fed3.Feed();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// If a mode greater than 4 is selected
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (fed3.FEDmode > 3) {
fed3.DisplayNoProgram();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Call fed.run at least once per loop
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fed3.run();
}