What you need to do is read what you got from BT only once in the loop()
If you received something, then do a if/else or switch/case on what you have received to set a flag accordingly - you need to cover ALL the possibilities you want to support there because once you have read this data it is gone. then based on the flag, if it is a new command (you are changing stage - assuming you want to act only then) do what is appropriate and go wait again for a legit command to arrive
enum _states : byte {turnedOFF, book1, book2, book3, unknown} status;
void setup()
{
...
status = turnedOFF;
OFF(); // start with everything off
}
void loop()
{
boolean newCommand = false;
if(BT.available() > 0) {
_state newStatus = unknown;
switch((char) BT.read()) {
case ‘o’:
newStatus = turnedOFF;
break;
case ‘1’:
newStatus = book1;
break;
case ‘2’:
.... // <— I let you finish
}
if (newStatus != unknown) {
newCommand = (newStatus != status);
status = newStatus;
}
} // end if BT available
if (newCommand) {
// we changed status handle it.
switch (status) {
case turnedOFF:
OFF();
break;
case .... // <== I let you finish
}
} // end if new command
} // end loop()
Just typed that on my tablet so might have some typos - for you to get the concept